使用osgeo.osr模块在Python中读取和导出Shapefile文件的投影信息
发布时间:2023-12-24 11:13:30
osgeo.osr(OGR Spatial Reference)是一个用于处理空间参考系统的Python模块,可以用来读取、转换和导出Shapefile文件的投影信息。下面是一个使用osgeo.osr模块读取和导出Shapefile文件投影信息的简单示例:
from osgeo import ogr, osr
# 设置Shapefile文件路径
shapefile_path = "path/to/shapefile.shp"
# 打开Shapefile文件
driver = ogr.GetDriverByName("ESRI Shapefile")
dataset = driver.Open(shapefile_path, 0) # 使用0表示只读模式
# 获取 个图层
layer = dataset.GetLayer()
# 获取图层的Spatial Reference对象
spatial_ref = layer.GetSpatialRef()
# 获取投影信息
print("Shapefile投影信息:")
print("坐标系统名称:", spatial_ref.GetAttrValue("PROJCS"))
print("地理坐标系统名称:", spatial_ref.GetAttrValue("GEOGCS"))
print("投影名称:", spatial_ref.GetAttrValue("PROJECTION"))
# 创建新的Spatial Reference对象
new_spatial_ref = osr.SpatialReference()
# 设置新的投影类型和坐标系统
new_spatial_ref.SetWellKnownGeogCS("WGS84")
new_spatial_ref.SetUTM(51, True) # 使用带号51的UTM投影,True表示北半球
# 进行投影转换
transform = osr.CoordinateTransformation(spatial_ref, new_spatial_ref)
# 创建新的Shapefile文件
output_shapefile_path = "path/to/output_shapefile.shp"
output_driver = ogr.GetDriverByName("ESRI Shapefile")
output_dataset = output_driver.CreateDataSource(output_shapefile_path)
output_layer = output_dataset.CreateLayer("output_layer", new_spatial_ref)
# 复制原始Shapefile的属性字段
layer_definition = layer.GetLayerDefn()
for i in range(layer_definition.GetFieldCount()):
field_defn = layer_definition.GetFieldDefn(i)
output_layer.CreateField(field_defn)
# 插入转换后的要素
feature = layer.GetNextFeature()
while feature:
geom = feature.GetGeometryRef()
geom.Transform(transform)
new_feature = ogr.Feature(output_layer.GetLayerDefn())
new_feature.SetGeometry(geom)
for i in range(layer_definition.GetFieldCount()):
new_feature.SetField(i, feature.GetField(i))
output_layer.CreateFeature(new_feature)
feature = layer.GetNextFeature()
# 释放资源
dataset.Destroy()
output_dataset.Destroy()
上述示例中,我们首先打开Shapefile文件,并获取 个图层的Spatial Reference对象。然后,我们使用该对象获取Shapefile的投影信息,并打印出来。
接下来,我们创建了一个新的Spatial Reference对象,并设置了新的投影类型和坐标系统。然后,我们使用CoordinateTransformation对象对原始Shapefile中的要素进行投影转换。在投影转换期间,我们遍历原始图层中的每个要素,并将其几何对象转换为新的投影坐标系下的坐标。
最后,我们创建一个新的Shapefile文件,并在其中创建一个新图层。我们复制了原始图层的属性字段,并根据投影转换后的要素创建新的要素对象,并将其插入到新图层中。
使用osgeo.osr模块可以方便地读取和导出Shapefile文件的投影信息,以及进行投影转换。这样可以使我们更容易地处理不同投影坐标系统之间的空间数据。
