1.介绍
GDAL(Geo Data Abstraction Library)是一个在MIT许可证下发行的开源栅格数据处理库。它由加拿大Open Source Geospatial Foundation开发,目的是为了支持对常用地理空间文件格式(如TIF、DEM、SHP等)进行读取、写入以及修改。
本文将探讨使用Python Gdal库对Shp文件进行读取,新建和更新的实例。
2.安装
首先需要安装Gdal库,可以使用pip安装:
!pip install gdal
3.读取Shp文件
读取Shp文件需要导入GDAL库,然后指定需要读取的文件路径。接下来,使用GDAL库的OpenEx方法打开文件,并使用GetLayer方法获取Shp文件中的图层。最后,可以遍历该图层的每一个要素,获取要素的属性和几何体。
以下是一个示例代码,读取Shp文件中的所有要素并输出它们的属性信息和几何体:
import gdal
# 指定Shp文件路径
filename = 'path/to/shpfile.shp'
# 打开文件
ds = gdal.OpenEx(filename, gdal.OF_VECTOR)
# 获取Shp文件中的图层
layer = ds.GetLayer()
# 遍历每一个要素
for feature in layer:
# 获取属性信息
attributes = feature.items()
# 获取几何体
geometry = feature.GetGeometryRef()
# 输出属性信息
print(attributes)
# 输出几何体信息
print(geometry.ExportToWkt())
4.新建Shp文件
新建Shp文件需要先定义文件的投影和要素属性结构,然后创建文件和对应的图层,最后可以添加单个要素或多个要素。
4.1 定义投影和要素属性结构
定义投影需要用到SpatialReference类,定义属性结构需要用到Fields和FieldDefn类。
from osgeo import osr, ogr
# 定义投影
inSpatialRef = osr.SpatialReference()
inSpatialRef.SetWellKnownGeogCS("WGS84")
# 定义属性结构
fields = ogr.Fields()
fields.AddField("id", ogr.OFTInteger)
fields.AddField("name", ogr.OFTString)
# 定义属性结构的字段类型
fieldDefn = fields.GetFieldDefn(0)
fieldDefn.SetWidth(4)
fieldDefn = fields.GetFieldDefn(1)
fieldDefn.SetWidth(32)
4.2 创建文件和对应的图层
创建文件需要用到Driver类和Create方法,创建图层需要用到CreateLayer方法和LayerDefn类。
# 定义Driver
driver = ogr.GetDriverByName("ESRI Shapefile")
# 创建新的Shp文件和对应的图层
outDataSource = driver.CreateDataSource('path/to/newShpfile.shp')
outLayer = outDataSource.CreateLayer('layername', inSpatialRef, geom_type=ogr.wkbPolygon)
# 定义图层结构
outLayer.CreateFields(fields)
outLayerDefn = outLayer.GetLayerDefn()
4.3 添加单个或多个要素
定义要素需要用到Feature和Geometry类,在创建要素之前,还需要使用CreateFeature方法创建要素的实例,并设置要素的属性和几何体。
# 定义新要素
newFeature = ogr.Feature(outLayerDefn)
# 设置要素的属性
newFeature.SetField('id', 1)
newFeature.SetField('name', 'test')
# 创建几何体
ring = ogr.Geometry(ogr.wkbLinearRing)
ring.AddPoint(0, 0)
ring.AddPoint(0, 10)
ring.AddPoint(10, 10)
ring.AddPoint(10, 0)
ring.AddPoint(0, 0)
polygon = ogr.Geometry(ogr.wkbPolygon)
polygon.AddGeometry(ring)
# 设置要素的几何体
newFeature.SetGeometry(polygon)
# 添加单个要素
outLayer.CreateFeature(newFeature)
# 添加多个要素
for i in range(10):
newFeature = ogr.Feature(outLayerDefn)
newFeature.SetField('id', i + 1)
newFeature.SetField('name', 'test')
newFeature.SetGeometry(polygon)
outLayer.CreateFeature(newFeature)
5.更新Shp文件
更新Shp文件需要首先打开文件和对应的图层,然后遍历每个要素并修改它们的属性或几何体信息。最后需要使用SyncToDisk方法把更新的内容写入到文件中。
# 指定Shp文件路径
filename = 'path/to/shpfile.shp'
# 打开文件
ds = ogr.Open(filename, update=True)
# 获取Shp文件中的图层
layer = ds.GetLayer()
# 遍历每一个要素
for feature in layer:
# 修改属性信息
feature.SetField('id', feature.GetField('id') + 1)
# 修改几何体
geometry = feature.GetGeometryRef()
geometry.Scale(1.2, 1.2, 1.2)
# 更新要素
layer.SetFeature(feature)
# 将更改写入文件
ds.SyncToDisk()
6.总结
本文详细介绍了如何使用Python Gdal库对Shp文件进行读取、新建和更新。读取Shp文件需要使用GDAL库的OpenEx方法打开文件,然后使用GetLayer方法获取Shp文件中的图层。新建Shp文件需要定义文件的投影和要素属性结构,然后创建文件和对应的图层,最后可以添加单个要素或多个要素。更新Shp文件需要打开文件和对应的图层,然后遍历每个要素并修改它们的属性或几何体信息,最后使用SyncToDisk方法把更新的内容写入到文件中。