【Python&GIS】矢量数据投影转换(WGS84转地方坐标系)
阅读原文时间:2023年07月31日阅读:3

又是掉头发的一天,今天的任务是将WGS84坐标系的点转成地方坐标系,并判断点是否在某个面内,找了半天的资料什么四参数、七参数啥的太复杂了。这里使用Python的ogr, osr库内置的坐标转换函数直接转,当然如果你是转地方坐标系的话,你要现有一个地方坐标系的矢量文件,以便程序能读取其坐标信息,赋值给需要转换的矢量数据。

ogr库是一个处理地理空间矢量数据的开源库。它可以读取多种数据格式,进行地理处理、属性表操作、数据分析等操作。目前ogr和osr库已集成到GDAL库中,可以对栅格数据、矢量数据进行处理分析,被3S的研究人员广泛应用。感兴趣的可以自己去了解一下,不懂得可以一起交流!

1.获取需要转换的数据的坐标系信息

.GetSpatialRef()函数可以获取图层中的坐标系信息,注意该函数的作用空间为图层,所以要先将数据读入到图层中ds_original.GetLayer(),再去获取投影。

filepath_original = "G:/wgs84/p.shp"
ds_original = ogr.Open(filepath_original)
# 打开数据
layer_original = ds_original.GetLayer()
# 获取图层显示
proj_original = layer_original.GetSpatialRef()
# 获取坐标系信息

2.获取需要转换成的目标坐标系信息

filepath_target = "G:/local.shp"
ds_target = ogr.Open(filepath_target)
layer_target = ds_target.GetLayer()
proj_target = layer_target.GetSpatialRef()
# 同上,这是从已知文件中获取目标坐标系

3.当然你也可以使用内置的坐标系统作为转换的坐标系统(如果使用上面两步获取了坐标系统,这一步就不需要了)。

4386是WGS84的EPSG编码,32651是UTM/WGS84 51N的EPSG编码,库里面内置了很多坐标系的EPSG编码。可以在库包中找到一些EPSG编码。文件存放在“C:\Program Files\Python36\Lib\site-packages\osgeo\data\gdal”中的ozi_datum.csv文件中,其他的可以自己百度搜索,也可以去EPSG官网查询。

Source_EPSG = 4326
Target_EPSG = 32651
source = osr.SpatialReference()
# 初始化osr.SpatialReference对象以形成一个合法的坐标系统
source.ImportFromEPSG(Source_EPSG)
# 向对象中写入Source_EPSG坐标系统
target = osr.SpatialReference()
target.ImportFromEPSG(Target_EPSG)
# 这里是用内置的EPSG对应的坐标系作为转换参数

4.坐标转换参数

第一个参数是数据的坐标系,第二个参数是目标坐标系。

transform = osr.CoordinateTransformation(proj_original, proj_target)

5.创建点数据到内存,坐标转换

point = ogr.CreateGeometryFromWkt("POINT (126.1 31.45)"
# 报错的话,将经纬度翻过来
point.Transform(transform)
print(point)

6.完整代码

自己修改文件路径,以及点的经纬度列表。

# -*- coding: utf-8 -*-
"""
@Time : 2023/5/18 17:55
@Auth : RS迷途小书童
@File :Projection Transform.py
@IDE :PyCharm
@Purpose :对点文件进行投影转换
"""
from osgeo import ogr, osr
from pyproj import Proj
"""layer图层才能调用投影,数据资源是不能调用投影的。矢量数据分为datasource,layer,feature三个层次"""

def Projection_Transform(list_longitude, list_latitude):
    """
    :param list_longitude: 输入经度列表
    :param list_latitude: 输入纬度列表
    :return:
    """
    filepath_original = "G:/wgs84/p.shp"
    ds_original = ogr.Open(filepath_original)
    # 打开数据
    layer_original = ds_original.GetLayer()
    # 获取图层显示
    proj_original = layer_original.GetSpatialRef()
    # 获取坐标系信息
    filepath_target = "G:/local.shp"
    ds_target = ogr.Open(filepath_target)
    layer_target = ds_target.GetLayer()
    proj_target = layer_target.GetSpatialRef()
    # 同上,这是从已知文件中获取目标坐标系
    """Source_EPSG = 4326
    Target_EPSG = 32651
    source = osr.SpatialReference()
    # 初始化osr.SpatialReference对象以形成一个合法的坐标系统
    source.ImportFromEPSG(Source_EPSG)
    # 向对象中写入Source_EPSG坐标系统
    target = osr.SpatialReference()
    target.ImportFromEPSG(Target_EPSG)
    # 这里是用内置的EPSG对应的坐标系作为转换参数"""
    transform = osr.CoordinateTransformation(proj_original, proj_target)
    # 坐标系转换参数
    for i in range(len(list_longitude)):
        point = ogr.CreateGeometryFromWkt("POINT (%s %s)" % (list_longitude[i], list_latitude[i]))
        # 报错的话,将经纬度翻过来
        point.Transform(transform)
        print(point.GetX(), point.GetY())
        # print(point)

if __name__ == "__main__":
    list_longitude1 = [121.4, 121.4]
    list_latitude1 = [31.041, 31.042]
    Projection_Transform(list_longitude1, list_latitude1)

完整代码中使用for循环同时转换了多个点数据,当然转换线矢量数据、面矢量数据也可以实现,自己改下图层空间即可。

本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分借鉴了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章