^ 关注我,带你一起学GIS ^
前言
❝
在GIS开发中,经常需要进行数据的转换处理,特别是Shapefile数据的投影转换更是重中之重,如何高效、准确的将源数据坐标系转换到目标坐标系是我们需要研究解决的问题。
在之前的文章中讲了如何使用GDAL或者ogr2ogr工具将txt以及csv文本数据转换为Shp格式,本篇教程在之前一系列文章的基础上讲解如何使用GDAL实现自定义数据坐标系。
如果你还没有看过,建议从以上内容开始。
1. 开发环境
本文使用如下开发环境,以供参考。
时间:2025年
系统:Windows 11
Python:3.11.7
GDAL:3.11.1
2. 数据重投影
定义一个方法ShpProjection用于实现Shp数据的投影转换,其中参数sourcePath为源数据路径,targetPath为目标文件路径。
python
"""
说明:Shapfile 文件重投影
参数:
-sourcePath:Shp 源文件路径
-targetPath:投影文件目标路径
"""
def ShpProjection(sourcePath,targetPath):
先检查源数据文件是否存在,若不存在则退出程序
lua
# 检查Shp源文件是否存在
if os.path.exists(sourcePath):
print("源文件存在!")
else:
print(f"源文件不存在:{sourcePath}")
return
添加Shp数据驱动用于创建Shp数据源和图层,GetDriverByName方法需要一个驱动器名称。还需要检查一下目标数据路径是否正常,只有在目标路径正常时才创建数据源。
python
# 获取Shp数据驱动
shpDriver = gdal.GetDriverByName("ESRI Shapefile")
# 检查Shp文件是否存在
if os.path.exists(targetPath):
try:
shpDriver.DeleteDataSource(targetPath)
print("文件已删除!")
except Exception as e:
print(f"文件路径不存在!:{e}")
return False
# 创建数据源
targetDataSource = shpDriver.CreateDataSource(targetPath)
获取源数据图层信息并创建坐标系统。osr模块下的SpatialReference方法用于定义空间参考信息。其中空间参考信息具有三种形式,可以传递字符串名称,EPSG代码或者wkt形式的坐标定义内容。
如下采用name参数形式。
ini
# 获取Shp数据图层
sourceDataSource = ogr.Open(sourcePath)
sourceLayer = sourceDataSource.GetLayer()
# 获取坐标系
srs = osr.SpatialReference(epsg=5646)
print(f"坐标系统名称:{srs.GetName()}")
打印坐标系统名称如下:
使用CreateLayer方法创建目标图层,本例中数据类型为LineString,所以geom_type参数为ogr.wkbLineString。之后遍历源图层数据,将属性字段和要素值写入投影图层之中。
ini
# 创建Shp投影数据图层
geomType = sourceLayer.GetGeomType()
shpProjectLayer = targetDataSource.CreateLayer(
"layer",
srs=srs,
geom_type=ogr.wkbLineString
)
# 获取源图层属性结构
layerDefn = sourceLayer.GetLayerDefn()
print(layerDefn.GetFieldCount())
fieldCount = layerDefn.GetFieldCount()
# 添加属性字段
for i in range(fieldCount):
fieldDefn = layerDefn.GetFieldDefn(i)
shpProjectLayer.CreateField(fieldDefn)
for feature in sourceLayer:
shpProjectLayer.CreateFeature(feature)
if __name__ == "__main__":
sourcePath = "E:\data\test_data\geojson\river.shp"
targetPath = "E:\data\test_data\geojson\river_project.shp"
ShpProjection(sourcePath,targetPath)
运行成功之后在ArcGIS中打开图层属性显示如下:


❝
OpenLayers示例数据下载,请在公众号后台回复:ol数据
全国信息化工程师-GIS 应用水平考试资料,请在公众号后台回复:GIS考试
❝GIS之路 公众号已经接入了智能 助手,可以在对话框进行提问,也可以直接搜索历史文章进行查看。
都看到这了,不要忘记点赞、收藏 + 关注 哦 !
本号不定时更新有关 GIS开发 相关内容,欢迎关注 



GIS 数据转换:使用 GDAL 将 Shp 转换为 GeoJSON 数据