【问题解决】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中定义的图层名称失效。