取消

C#调用GDAL导出Shp数据

C#调用GDAL导出Shp数据示例。


代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
private void ExportShp()
{
    // 设置dll路径并注册驱动等,这是注册Ogr的,Ogr主要是矢量数据,必须先调用,否则会出现找不到dll的错误,也可以手动把gdal下的dll复制到exe所在目录,但是需要区分x86和x64
    GdalConfiguration.ConfigureOgr();
    // 注册驱动,GdalConfiguration.ConfigureOgr()会调用,可以不调用
    //Ogr.RegisterAll();
    // 设置dll路径并注册驱动等,这是注册Gdal的,Gdal主要是栅格数据,必须先调用,否则会出现找不到dll的错误,也可以手动把gdal下的dll复制到exe所在目录,但是需要区分x86和x64
    //GdalConfiguration.ConfigureGdal();
    // 注册驱动,GdalConfiguration.ConfigureGdal()会调用,可以不调用
    //Gdal.AllRegister();

    Ogr.RegisterAll();
    // 设置utf-8编码
    Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
    //设置空间参考文件位置,如果不设置后面执行sr.ImportFromEPSG(4326);会提示找不到proj.db。如果不设置空间参考可以不调用
    Osr.SetPROJSearchPath(Environment.GetEnvironmentVariable("PROJ_LIB"));
    var list = new List<MyPoint>(){
        new MyPoint() { X=0,Y=0,Z=0 },
        new MyPoint() { X=10,Y=0,Z=0 },
        new MyPoint() { X=10,Y=10,Z=0 },
        new MyPoint() { X=0,Y=10,Z=0 }
    };
    //调用gdal库实现把list的点坐标导出为shp文件
    // 创建SHP文件
    string driverName = "ESRI Shapefile";
    //OSGeo.OGR.Driver和OSGeo.GDAL.Driver都是GDAL/OGR库中的类,但它们位于不同的命名空间中,具有不同的作用。
    //OSGeo.GDAL.Driver是GDAL库中的驱动程序类,用于读取和写入各种栅格数据格式,例如GeoTIFF、JPEG、PNG等。您可以使用OSGeo.GDAL.Driver来打开、创建和操作栅格数据集。
    //OSGeo.OGR.Driver是OGR库中的驱动程序类,用于读取和写入各种矢量数据格式,例如SHP、GeoJSON、KML等。您可以使用OSGeo.OGR.Driver来打开、创建和操作矢量数据集。
    OSGeo.OGR.Driver shpDriver = Ogr.GetDriverByName(driverName);
    DataSource shpDataSource = shpDriver.CreateDataSource("output.shp", new string[] { });

    // 创建空间参考系统
    SpatialReference sr = new SpatialReference("");
    sr.ImportFromEPSG(4326);  // 假设投影为WGS84经纬度

    // 创建矢量图层
    Layer layer = shpDataSource.CreateLayer("points", sr, wkbGeometryType.wkbPoint, new string[] { });

    // 创建字段
    FieldDefn fieldDefn = new FieldDefn("id", FieldType.OFTInteger);
    layer.CreateField(fieldDefn, 1);

    // 添加点要素
    foreach (MyPoint p in list)
    {
        Feature feature = new Feature(layer.GetLayerDefn());
        feature.SetField("id", layer.GetFeatureCount(1) + 1);
        Geometry geom = new Geometry(wkbGeometryType.wkbPoint);
        geom.AddPoint(p.X, p.Y, p.Z);
        feature.SetGeometry(geom);
        layer.CreateFeature(feature);
    }

    // 释放资源
    shpDataSource.Dispose();
    sr.Dispose();
}
class MyPoint
{
    public double X { get; set; }
    public double Y { get; set; }
    public double Z { get; set; }
}


参考资料

本文会经常更新,请阅读原文: https://dashenxian.github.io/post/C-%E8%B0%83%E7%94%A8GDAL%E5%AF%BC%E5%87%BAShp%E6%95%B0%E6%8D%AE ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 小神仙 (包含链接: https://dashenxian.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (125880321@qq.com)

登录 GitHub 账号进行评论