前言
GIS空间分析指的是在GIS(地理信息系统)里实现分析空间数据,即从空间数据中获取有关地理对象的空间位置、分布、形态、形成和演变等信息并进行分析。
将GIS空间分析利用到系统中,我们可以利用GIS空间分析处理车辆进出电子围栏,车辆预计到达目的地,车辆是否进入某些区域,车辆是否进入道路,车辆是否偏移了规定道路等等相关应用型分析。
准备
针对复杂的GIS空间分析,我们可以利用Postgresql+Postgis来简单实现,我们需要先安装对于的控件分析需要的组件。
1:安装PostgreSQL,我这里使用的是Windows 服务器
2:给PostgreSQL 安装PostGIS组件
安装参考:https://wenku.baidu.com/view/ac2b40ab284ac850ad0242f3.html
实现
首先我们可以与操作MS-SQL,MySQL等数据库一样定义一个DBHelper类,给这个类取名PostgreHelper,封装PostgresSQL数据库操作方法。
public class PostgreHelper : IDBHelper
{
/// <summary>
/// 读取数据返回DataSet
/// </summary>
/// <param name="sqrstr"></param>
/// <returns></returns>
public DataSet ExecuteQuery(string sqrstr)
{
try
{
using (NpgsqlConnection conn = new NpgsqlConnection(Config.PostgreConnectionString))
{
using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(sqrstr, conn))
{
DataSet ds = new DataSet();
da.Fill(ds, "ds");
return ds;
}
}
}
catch (Exception ex)
{
Log.Instance.Error("ExecuteQuery:"+ex.Message);
return null;
}
}
/// <summary>
/// 判断增删改执行状态
/// </summary>
/// <param name="sqrstr"></param>
/// <returns></returns>
public int ExecuteNonQuery(string sqrstr)
{
try
{
using (NpgsqlConnection conn = new NpgsqlConnection(Config.PostgreConnectionString))
{
using (NpgsqlCommand SqlCommand = new NpgsqlCommand(sqrstr, conn))
{
int r = SqlCommand.ExecuteNonQuery(); //执行查询并返回受影响的行数
conn.Close();
return r; //r如果是>0操作成功!
}
}
}
catch (Exception ex)
{
Log.Instance.Error("ExecuteNonQuery:"+ex.Message);
return -1;
}
}
/// <summary>
/// 读取数据返回数据流
/// </summary>
/// <param name="cmdText"></param>
/// <returns></returns>
public DbDataReader GetReader(string cmdText)
{
try
{
using (NpgsqlConnection conn = new NpgsqlConnection(Config.PostgreConnectionString))
{
using (NpgsqlCommand cmd = new NpgsqlCommand(cmdText, conn))
{
NpgsqlDataReader sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return sdr;
}
}
}
catch (Exception ex)
{
Log.Instance.Error("GetReader:" + ex.Message);
return null;
}
}
}
这里我们需要引入一个dll,Npgsql;Npgsql封装了一些.NET与PostgreSQL操作方法。
然后我们将一些常用的分析方法进行封装,封装好后以API的方式提供给应用程序使用。
public class MainGISFunction
{
PostgreHelper dbHelper = new PostgreHelper();
/// <summary>
/// 判断两个经纬度点之间的距离
/// 参数格式:经度,纬度
/// </summary>
/// <param name="lonlat1">经纬度1</param>
/// <param name="lonlat2">经纬度2</param>
/// <returns>直线距离(单位m)/null</returns>
public DataTable Get