首页 > 编程语言 >【Python&GIS】矢量数据投影转换(坐标转换)

【Python&GIS】矢量数据投影转换(坐标转换)

时间:2023-09-08 11:55:10浏览次数:57  
标签:layer GIS Python 投影 proj path 转换 gdal

        之前跟大家分享过面矢量数据投影转换点矢量数据投影转换,但博主在日常工作的过程中发现之前分享的面矢量数据投影转换有时候会出现错误,或者转换后的效果不好。再一次偶然的过程中发现了新的坐标转换(投影转换)函数,所以今天和大家分享一下,大家在进行坐标转换时可以两种方法都试试,哪个效果好用哪个。

一、导入库

from osgeo import gdal, ogr, osr

二、坐标转换函数

        这里最重要的就是gdal.VectorTranslate这个函数,这个函数包含了很多参数,代码中已给出相关注释,大家如果还有什么问题,可以直接去查看下官方文档。

        此外我这里的目标坐标系是使用EPSG编码定义的,之前分享的文章中展示过从已有文件中提取坐标系,大家可以去看下然后放入代码即可。这里给大家分享两个查询EPSG编码的网站。

mygeodata.cloudhttps://mygeodata.cloud/cs2cs/

epsg.oihttps://epsg.io/

def Projection_Transform(shape_path, save_path, epsg):
    ogr.RegisterAll()
    # 注册所有驱动
    gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8")
    # 定义编码类型为UTF8,防止字段乱码
    ds = ogr.Open(shape_path)
    layer = ds.GetLayer()
    # 打开需要转换的矢量数据,获取图层
    src_proj = layer.GetSpatialRef()
    # 获取其源坐标信息
    layer_name = layer.GetName()
    # 获取图层名称
    ds.Destroy()
    dst_proj = osr.SpatialReference()
    dst_proj.ImportFromEPSG(epsg)
    # 定义目标投影的空间信息
    options = gdal.VectorTranslateOptions(
        format="ESRI Shapefile",
        # 输出格式
        accessMode=None,
        srcSRS=src_proj,
        # 源坐标系
        dstSRS=dst_proj,
        # 目标坐标系
        reproject=True,
        selectFields=None,
        # 保留全部字段
        layerName=layer_name,
        # 图层名称
        geometryType="POLYGON",
        # 数据类型
        dim="XY"
    )
    gdal.VectorTranslate(save_path, srcDS=shape_path, options=options)

三、完整代码

# -*- coding: utf-8 -*-
"""
@Time : 2023/8/22 17:59
@Auth : RS迷途小书童
@File :Vector Data Projection Transform.py
@IDE :PyCharm
@Purpose :矢量数据投影转换/坐标转换
"""
from osgeo import gdal, ogr, osr


def Projection_Transform(shape_path, save_path, epsg):
    ogr.RegisterAll()
    # 注册所有驱动
    gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8")
    # 定义编码类型为UTF8,防止字段乱码
    ds = ogr.Open(shape_path)
    layer = ds.GetLayer()
    # 打开需要转换的矢量数据,获取图层
    src_proj = layer.GetSpatialRef()
    # 获取其源坐标信息
    layer_name = layer.GetName()
    # 获取图层名称
    ds.Destroy()
    dst_proj = osr.SpatialReference()
    dst_proj.ImportFromEPSG(epsg)
    # 定义目标投影的空间信息
    options = gdal.VectorTranslateOptions(
        format="ESRI Shapefile",
        # 输出格式
        accessMode=None,
        srcSRS=src_proj,
        # 源坐标系
        dstSRS=dst_proj,
        # 目标坐标系
        reproject=True,
        selectFields=None,
        # 保留全部字段
        layerName=layer_name,
        # 图层名称
        geometryType="POLYGON",
        # 数据类型
        dim="XY"
    )
    gdal.VectorTranslate(save_path, srcDS=shape_path, options=options)


if __name__ == "__main__":
    in_path = "B:/Personal/九段西.shp"
    out_path = "B:/Personal/九段西1.shp"
    in_path.replace("/", "\\")
    Projection_Transform(in_path, out_path, epsg=4550)
    # 输入文件,输出文件,目标坐标系

 

        今天给大家分享了矢量数据投影转换、坐标转换的新方法,大家可以结合一下之前发的博客,挑选适合自己的方法。

        如果大家在学习Python或者RS时有什么问题,可以随时留言交流!如果大家对批量处理有兴趣同样可以留言给博主,博主会分享相关代码

标签:layer,GIS,Python,投影,proj,path,转换,gdal
From: https://www.cnblogs.com/RSran/p/17687226.html

相关文章

  • 【Python&RS】基于GDAL修改栅格数据的DN值
    ​    遥感工作者离不开栅格数据,有时候我们可能需要修改栅格数据的值,但ENVI和ArcGIS中并没有直接修改DN值的工具,只有栅格计算器、Bandmath这些工具去计算整个波段的值,或者EditClassificationImage工具可以修改ENVI分类后的像元值,但这个工具只对分类格式有效,博主整不......
  • 【题解】《PTA-Python程序设计》题目集分享
    第1章-1从键盘输入两个数,求它们的和并输出(30分)本题目要求读入2个整数A和B,然后输出它们的和。输入格式:在一行中给出一个被加数在另一行中给出一个加数输出格式:在一行中输出和值。输入样例:在这里给出一组输入。例如:18-48输出样例:在这里给出相应的输出。例如:......
  • Python学习日记 京东工单信息获取
    importrequestsimportcsvimportrandomf=open('vc.csv',mode='a',encoding='utf-8',newline='')csv_writer=csv.DictWriter(f,fieldnames=['客户姓名','订单编号','pin'])csv_wri......
  • Python FastAPI 异步获取 Neo4j 数据
    前提条件先往Neo4j里,准备数据参考:https://www.cnblogs.com/vipsoft/p/17631347.html#创建传承人搭建FastAPI项目:https://www.cnblogs.com/vipsoft/p/17684079.html改造utils/neo4j_provider.py增加了暴露给外面调用的属性,同时提供了同步和异步执行的驱动#!/usr/bin/py......
  • Python实操:内存管理与优化策略
    在Python开发过程中,合理有效地管理和优化内存使用是提高程序性能和效率的关键。本文将深入探讨Python中的内存管理机制,并分享一些实用的优化策略和具体操作步骤,帮助您更好地利用资源、减少内存占用并提升代码执行速度。一、了解Python的垃圾回收机制垃圾回收是自动处理不再被......
  • python3中几乎所有的内置函数以及简述
    以下是Python3中的所有内置函数以及它们的简单中文描述:abs(x):返回x的绝对值。all(iterable):如果可迭代对象中的所有元素都为True,则返回True;否则返回False。any(iterable):如果可迭代对象中的任何一个元素为True,则返回True;否则返回False。ascii(object):返回一个可打印的字符串,其中非......
  • postgis数据库导出csv表再导入postgis
    1、导出csv表fromsettings_Addressimport*fromsqlalchemyimportcreate_engine,MetaDataimportpandasaspddefcreate_conn(Postgis_user,Postgis_password,Postgis_host,Postgis_port,dbname_PG):#returncreate_engine('Postgis+pyPostgis://{}:{}@{}:{}/......
  • Linux系统上安装.tar.gz格式的Python源码包
    要在Linux系统上安装.tar.gz格式的Python包,您可以按照以下步骤进行操作:解压文件:使用以下命令将.tar.gz文件解压缩:tar-zxvfpackage.tar.gz这将在当前目录下创建一个包含源代码的新文件夹。进入源代码目录:使用cd命令进入解压后的源代码目录:cdpackage检查依赖库:执行以下命令检查......
  • .NET应用多语言-葡萄牙语软件,如何处理本地化,特别是数字的转换和计算
    在葡萄牙语软件中,数字本地化通常涉及小数点和千位分隔符的使用。在葡萄牙语中,小数点用“,”表示,而不是英语中使用的“.”。千位分隔符通常是一个空格或一个点。例如:62.5,其实代表的不是62.5而是625M 为了正确地处理数字本地化,可以使用.NET框架中提供的CultureInfo类。此类允许......
  • python:列表实现队列​
    什么是队列队列是一种先进先出的数据结构,类似食堂排队打饭,先入队的元素当然要先出队,先请用Python列表模拟队列。现有一列表queue=[1,2,3,4,5]被视作队列,请使用pop函数连续两次取出队首元素,再使用append函数将输入元素添加到队尾,每次操作后都要输出完整的列表。功能需求输入......