【问题解决】ogr.GetDriverByName(‘ESRI Shapefile‘),driver输出路径命名问题

场景描述

之前在写这篇博客的时候【GIS教程】使用GDAL实现栅格转矢量(GeoJSON、Shapefile)- 附完整代码,发现一个小Tips:在这里插入图片描述
意思是:当生成ESRI Shapefile时候,这里output_file指定的是一个文件夹的路径,这样生成的shpfile文件都会存在这个文件夹目录下。

但是当我今天写代码的时候发现,我生成的shp并不会整理到文件夹中,于是我有了一系列的尝试和总结。

源代码

这里代码是实现将数组中的点转为point-shp文件。默认坐标系为web墨卡托(3857),属性表定义为三个字段分别为id,X,Y,储存点的xy坐标。

def points_to_shapefile(points, output_shp_path):
        # shp空模板
        prj = osr.SpatialReference()
        prj.ImportFromEPSG(3857)
        # 创建一个空的矢量图层
        driver = ogr.GetDriverByName('ESRI Shapefile')
        data_source = driver.CreateDataSource(output_shp_path)
        layer = data_source.CreateLayer('points', geom_type=ogr.wkbPoint, srs = prj)
        layer.CreateField(ogr.FieldDefn('id', ogr.OFTInteger))
        layer.CreateField(ogr.FieldDefn('X', ogr.OFTReal))
        layer.CreateField(ogr.FieldDefn('Y', ogr.OFTReal))

        # 将点数组添加到Shapefile
        for idx, point in enumerate(points):
            # 创建一个Feature
            feature = ogr.Feature(layer.GetLayerDefn())

            # 设置Feature的属性
            feature.SetField('id', idx)
            feature.SetField('X', point[0])
            feature.SetField('Y', point[1])
            # 创建点几何
            point_geom = ogr.Geometry(ogr.wkbPoint)
            point_geom.AddPoint_2D(point[0], point[1])

            # 设置Feature的几何
            feature.SetGeometry(point_geom)

            # 将Feature添加到图层
            layer.CreateFeature(feature)

            # 销毁Feature对象
            feature.Destroy()

        # 保存并关闭数据源
        data_source.Destroy()

points=[(np.float64(13120637.15326138), np.float64(2836732.2116149245)), (np.float64(13120244.669731455), np.float64(2836903.800231201))]
output_shp_path = 'points' #是输出的文件路径
points_to_shapefile(points, output_shp_path)

解决

总结成果如下:

涉及参数有两个:
(1)output_shp_path :是输出的文件路径,以下简称参数1
(2)layer = data_source.CreateLayer('points', geom_type=ogr.wkbPoint, srs = prj)中的'points':是指定义的矢量要素的图层名称,这里我命名为points。可以按需修改。,以下简称参数2

情况1:

参数1 = 参数2 时:根目录下生成文件夹points,shp要素名称points。

output_shp_path = 'points' 
layer = data_source.CreateLayer('points', geom_type=ogr.wkbPoint, srs = prj)

在这里插入图片描述

情况2:

参数1 名字不变加后缀.shp,根目录下直接生成points.shp

output_shp_path = 'points.shp' 
layer = data_source.CreateLayer('points', geom_type=ogr.wkbPoint, srs = prj)

在这里插入图片描述

情况3:

参数1 名字改名字加后缀.shp,根目录下生成newname.shp

output_shp_path = 'newname.shp' 
layer = data_source.CreateLayer('points', geom_type=ogr.wkbPoint, srs = prj)

在这里插入图片描述

情况4:

参数1参数2名字不一样,且不加后缀.shp,会在根目录下生成newname文件夹,文件夹中是shp文件,名称为points.shp,与参数2名称一致。

output_shp_path = 'newname' 
layer = data_source.CreateLayer('points', geom_type=ogr.wkbPoint, srs = prj)

在这里插入图片描述

总结:

1、output_shp_path 不加后缀.shp时,会生成以该名称命名的文件夹矢量要素名称为data_source.CreateLayer中定义的图层名称

2、output_shp_path 加后缀.shp时,会生成以该名称命名的shp要素,data_source.CreateLayer中定义的图层名称失效

ESRI Shape文件是一种常用的矢量数据格式,它包含了点、线、面等要素和属性信息。为了处理这种格式的数据,我们可以使用GDAL/OGR库。本文将介绍如何使用C#语言和GDAL/OGR库读写ESRI Shape文件。 一、安装GDAL/OGRGDAL/OGR库是一个开源的地理信息系统扩展库,它可以读写各种GIS数据格式。我们可以从官网(https://gdal.org/download.html)下载最新的二进制版本,并进行安装。 二、创建工作空间 在C#中使用GDAL/OGR库进行ESRI Shape文件的读写,需要先创建一个工作空间。工作空间是一个抽象的概念,它代表了一个包含多个数据集的环境。我们可以使用以下代码创建一个工作空间: ```csharp using OSGeo.OGR; using OSGeo.GDAL; Gdal.AllRegister(); Ogr.RegisterAll(); string workspace = @"C:\data\shapefiles"; Driver driver = Ogr.GetDriverByName("ESRI Shapefile"); DataSource dataSource = driver.Open(workspace, 0); ``` 这里使用了GDAL/OGR库中的`Driver`、`DataSource`和`Gdal`等类。首先,我们调用`Gdal.AllRegister()`方法和`Ogr.RegisterAll()`方法注册GDAL/OGR库中的所有驱动程序。然后,我们指定了一个路径作为工作空间,并使用`Ogr.GetDriverByName()`方法获取ESRI Shapefile驱动程序。最后,我们调用`driver.Open()`方法打开工作空间,并将返回的`DataSource`对象存储到`dataSource`变量中。 三、读取ESRI Shape文件 在创建了工作空间之后,我们可以使用`dataSource`对象读取ESRI Shape文件中的要素和属性信息。以下代码演示了如何读取ESRI Shape文件中的所有点要素: ```csharp Layer layer = dataSource.GetLayerByName("points"); Feature feature = null; while ((feature = layer.GetNextFeature()) != null) { Geometry geometry = feature.GetGeometryRef(); double x = geometry.GetX(0); double y = geometry.GetY(0); Console.WriteLine($"Point ({x}, {y})"); } ``` 这里使用了GDAL/OGR库中的`Layer`、`Feature`和`Geometry`等类。首先,我们使用`dataSource.GetLayerByName()`方法获取名为“points”的图层,并将返回的`Layer`对象存储到`layer`变量中。然后,我们使用`layer.GetNextFeature()`方法循环遍历图层中的所有要素,并将返回的`Feature`对象存储到`feature`变量中。接着,我们使用`feature.GetGeometryRef()`方法获取要素的几何体,并将返回的`Geometry`对象存储到`geometry`变量中。最后,我们使用`geometry.GetX(0)`和`geometry.GetY(0)`方法获取要素的坐标,并将其打印到控制台上。 四、写入ESRI Shape文件 在读取了ESRI Shape文件之后,我们可以使用`dataSource`对象写入新的要素和属性信息。以下代码演示了如何创建一个新的ESRI Shape文件,并向其中添加一个点要素: ```csharp Layer layer = dataSource.CreateLayer("new_points", null, wkbGeometryType.wkbPoint, null); FieldDefn fieldDefn = new FieldDefn("name", FieldType.OFTString); layer.CreateField(fieldDefn, 1); Feature feature = new Feature(layer.GetLayerDefn()); Geometry geometry = new Point(121.5, 31.2); feature.SetGeometry(geometry); feature.SetField("name", "Shanghai"); layer.CreateFeature(feature); dataSource.SyncToDisk(); ``` 这里使用了GDAL/OGR库中的`FieldDefn`、`Point`和`wkbGeometryType`等类。首先,我们使用`dataSource.CreateLayer()`方法创建一个名为“new_points”的图层,并将返回的`Layer`对象存储到`layer`变量中。然后,我们使用`new FieldDefn("name", FieldType.OFTString)`语句创建一个名为“name”的字符串型属性。接着,我们使用`layer.CreateField()`方法创建一个新的属性字段,并将`fieldDefn`变量和`1`参数传递给该方法。接下来,我们使用`new Point(121.5, 31.2)`语句创建一个新的点几何体,并将其存储到`geometry`变量中。然后,我们使用`new Feature(layer.GetLayerDefn())`语句创建一个新的要素,并将其存储到`feature`变量中。接着,我们使用`feature.SetGeometry(geometry)`方法设置要素的几何体。最后,我们使用`feature.SetField("name", "Shanghai")`方法设置要素的属性值,并使用`layer.CreateFeature(feature)`方法将要素添加到图层中。最后,我们使用`dataSource.SyncToDisk()`方法将修改保存到磁盘中。 总结 本文介绍了如何使用C#语言和GDAL/OGR库读写ESRI Shape文件。我们首先创建了一个工作空间,并使用它读取了ESRI Shape文件中的点要素。然后,我们创建了一个新的ESRI Shape文件,并向其中添加了一个点要素。使用GDAL/OGR库可以方便地处理各种GIS数据格式,为GIS应用程序的开发提供了便利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值