GDAL 实现自定义数据坐标系

^ 关注我,带你一起学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开发 相关内容,欢迎关注


GeoTools 开发合集(全)

OpenLayers 开发合集

GDAL 实现矢量数据读写

GDAL 数据类型大全

百度宣布,良心画图工具停服!

GDAL 实现 GIS 数据读取转换(全)

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

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

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

相关推荐
我是伪码农7 小时前
Vue 1.23
前端·javascript·vue.js
毕设源码-郭学长13 小时前
【开题答辩全过程】以 基于Web的高校课程目标达成度系统设计与实现为例,包含答辩的问题和答案
前端
wuhen_n13 小时前
高阶函数与泛型函数的类型体操
前端·javascript·typescript
ヤ鬧鬧o.14 小时前
多彩背景切换演示
前端·css·html·html5
lethelyh14 小时前
Vue day1
前端·javascript·vue.js
酉鬼女又兒14 小时前
SQL113+114 更新记录(一)(二)+更新数据知识总结
java·服务器·前端
无风听海14 小时前
AngularJS中 then catch finally 的语义、执行规则与推荐写法
前端·javascript·angular.js
利刃大大15 小时前
【Vue】组件化 && 组件的注册 && App.vue
前端·javascript·vue.js
一起养小猫15 小时前
Flutter for OpenHarmony 实战:按钮类 Widget 完全指南
前端·javascript·flutter
css趣多多15 小时前
Vux store实例的模块化管理
前端