You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
}

额外注意事项

  1. 坐标定位:(0.0, 0.0)位于几内亚湾附近,在QGIS里你需要手动缩放至该区域,或者使用"定位到坐标"功能输入0,0直接跳转,才能看到点。
  2. 文件名拼写:你代码里写的ERSI_TEST_ShapeFile.shp是拼写错误,正确缩写是ESRI,虽然不影响功能,但建议修正避免混淆。
  3. 版本兼容性:确保你使用的GDAL版本与Visual Studio的平台(x86/x64)完全匹配,否则可能出现隐性运行错误。

内容的提问来源于stack exchange,提问作者Umar Dastgir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:05:49