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) 。