DotSpatial对于PostGreSql数据库中空间数据读取
在DotSpatial中对于空间数据库的访问,并未提供对于开源数据库PostGreSql的空间数据访问方法,基于其源代码进行部分修改封装,完成了上述的需求。
在DotSpatial.Data.Rasters.GdalExtension命名空间下的OgrDataReader类中可以发现,DotSpatial中对于空间数据的读取其实还是是基于GDAL。其类的构造函数如下:
public OgrDataReader(string sDataSource)
{
_ogrDataSource = Ogr.Open(sDataSource, 0);
_fileName = sDataSource;
}
通过GDAL的访问驱动,可扩展此类支持PG数据库的访问。在OgrDataReader中添加如下方法:
public IDictionary<IFeatureSet, IList<string>> GetPGLayers(string layerName)
{
using (var layer = _ogrDataSource.GetLayerByName(layerName))
using (var ogrFeatureDefinition = layer.GetLayerDefn())
{
var schema = BuildSchemaTable(ogrFeatureDefinition);
var projInfo = GetProjectionInfo(layer);
var fs = new FeatureSet
{
Name = Path.GetFileNameWithoutExtension(layer.GetName()),
Filename =@”PG\”+ layer.GetName()
};
AddColumns(fs, schema);
if (projInfo != null) fs.Projection = projInfo;
var styles = new List<string>();
AddFeatures(fs, styles, layer, ogrFeatureDefinition, schema);
return new Dictionary<IFeatureSet, IList<string>> { { fs, styles } };
}
}
然后自己封装了一个服务于PG数据库工作的类 PostGisFactory。构造函数如下:
public PostGisFactory(string constr,string ogrstr ,string tempSrid) {
ogr = new OgrDataReader(ogrstr);
connInstance = new NpgsqlConnection(constr);
srid = tempSrid;
}
然后配合如下函数,可将数据库中的图层转换为DotSpatial中的DataSet:
/// <summary>
/// 返回数据库中指定名称的图层数据
/// </summary>
/// <param name=”layerName”></param>
/// <returns></returns>
public IFeatureSet GetVectorLayer(string layerName) {
try
{
//此处为dataset的属性信息挂接,可使用dataset.features[i].datarow的方式获取属性信息,但是未设置PG客户端编码的情况下会出现乱码,此处直接通过数据库查询表格挂接,暂未发现属性数据和空间数据挂接错误的情况,如此处出现情况,就需自己处理一下
string attrDtSql = string.Format(“select * from {0}”, layerName);
DataTable attrDt = GetPGDt(attrDtSql);
var layer = ogr.GetPGLayers(layerName);
layer.Keys.ToList()[0].DataTable = attrDt;
return layer.Keys.ToList()[0];
}
catch (Exception ex)
{
throw;
}
}
转载自:https://blog.csdn.net/weixin_41012454/article/details/81463150