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

You may also like...