GDAL(C#)中向Shapefile添加点几何图形无法显示问题求助
问题分析与修复方案
我看了你的代码,主要有几个关键问题导致生成的Shapefile在QGIS里无法显示点,下面帮你梳理并给出修复方案:
- 重复创建Feature对象且未合理使用:你初始化了
featureSH但完全没用到,反而新建的feature也没设置属性字段,虽然这不直接影响几何显示,但属于冗余代码,容易引发混淆。 - 未指定空间参考:创建图层时没有设置空间参考,QGIS可能无法正确识别坐标系统,导致点无法被定位或显示。
- 未正确释放GDAL/OGR资源:GDAL的核心对象(比如Feature、Geometry、DataSource等)需要手动调用
Dispose方法释放,否则数据可能没有真正写入磁盘。 - 未触发数据持久化:创建Feature后需要刷新图层,完成操作后关闭数据源,确保所有修改都保存到文件。
修正后的完整代码
public void testSF(Dataset ds) { Console.WriteLine("Writing ESRI shapefile"); // Registering drivers OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver driverSH = OSGeo.OGR.Ogr.GetDriverByName("ESRI Shapefile"); if (driverSH == null) { Console.WriteLine("Cannot get drivers. Exiting"); System.Environment.Exit(-1); } Console.WriteLine("Drivers fetched"); // Creating a shapefile OSGeo.OGR.DataSource dataSourceSH = driverSH.CreateDataSource("ESRI_TEST_ShapeFile.shp", new string[] { }); if (dataSourceSH == null) { Console.WriteLine("Cannot create datasource"); System.Environment.Exit(-1); } Console.WriteLine("Shapefile created"); // 创建WGS84空间参考(EPSG:4326),可根据需求替换为其他坐标系 OSGeo.OGR.SpatialReference spatialRef = new OSGeo.OGR.SpatialReference(""); spatialRef.ImportFromEPSG(4326); // 创建点图层(图层名改为PointLayer更贴合实际,也可保留原名称) OSGeo.OGR.Layer layerSH; layerSH = dataSourceSH.CreateLayer("PointLayer", spatialRef, OSGeo.OGR.wkbGeometryType.wkbPoint, new string[] { }); if (layerSH == null) { Console.WriteLine("Layer creation failed, exiting..."); System.Environment.Exit(-1); } Console.WriteLine("Point Layer created"); // 创建并添加属性字段到图层 OSGeo.OGR.FieldDefn fdefnName = new OSGeo.OGR.FieldDefn("Name", OSGeo.OGR.FieldType.OFTString); fdefnName.SetWidth(32); OSGeo.OGR.FieldDefn fdefnGPS = new OSGeo.OGR.FieldDefn("GPS", OSGeo.OGR.FieldType.OFTString); fdefnGPS.SetWidth(32); if (layerSH.CreateField(fdefnName, 1) != 0) { Console.WriteLine("Creating Name field failed"); System.Environment.Exit(-1); } if (layerSH.CreateField(fdefnGPS, 1) != 0) { Console.WriteLine("Creating GPS field failed"); System.Environment.Exit(-1); } Console.WriteLine("Fields created and added to layer"); // 创建Feature并设置属性与几何信息 OSGeo.OGR.Feature feature = new OSGeo.OGR.Feature(layerSH.GetLayerDefn()); feature.SetField("Name", "This is a NAME"); feature.SetField("GPS", "Test GPS point"); // 创建点几何 OSGeo.OGR.Geometry geom = OSGeo.OGR.Geometry.CreateFromWkt("POINT(0.0 0.0)"); feature.SetGeometry(geom); // 将Feature添加到图层 if (layerSH.CreateFeature(feature) != 0) { Console.WriteLine("Failed to create feature"); System.Environment.Exit(-1); } Console.WriteLine("Feature added successfully"); // 刷新图层,确保数据写入磁盘 layerSH.SyncToDisk(); // 释放所有GDAL资源,避免内存泄漏和数据丢失 feature.Dispose(); geom.Dispose(); layerSH.Dispose(); dataSourceSH.Dispose(); spatialRef.Dispose(); }
额外注意事项
- 坐标定位:(0.0, 0.0)位于几内亚湾附近,在QGIS里你需要手动缩放至该区域,或者使用"定位到坐标"功能输入
0,0直接跳转,才能看到点。 - 文件名拼写:你代码里写的
ERSI_TEST_ShapeFile.shp是拼写错误,正确缩写是ESRI,虽然不影响功能,但建议修正避免混淆。 - 版本兼容性:确保你使用的GDAL版本与Visual Studio的平台(x86/x64)完全匹配,否则可能出现隐性运行错误。
内容的提问来源于stack exchange,提问作者Umar Dastgir
相关产品推荐
相关产品推荐

