【Python&GIS】矢量数据投影转换(WGS84转地方坐标系)
又是掉头发的一天,今天的任务是将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过程中写过的一些代码。有些部分借鉴了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。
【Python&GIS】矢量数据投影转换(WGS84转地方坐标系)的更多相关文章
- python、js实现WGS84、高德(火星)、百度坐标转换
在日常工作学习中常会涉及到WGS84.高德(火星/谷歌).百度三种空间坐标系的坐标转换,本文将通过python.js两种语言实现坐标系的转换. 坐标系说明: wgs84:为一种大地坐标系,也是目前广泛 ...
- (数据科学学习手札147)Python GIS利器shapely全新2.0版本一览
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,我写过很多篇介绍geopand ...
- (数据科学学习手札60)用Python实现WGS84、火星坐标系、百度坐标系、web墨卡托四种坐标相互转换
一.简介 主流被使用的地理坐标系并不统一,常用的有WGS84.GCJ02(火星坐标系).BD09(百度坐标系)以及百度地图中保存矢量信息的web墨卡托,本文利用Python编写相关类以实现4种坐标系统 ...
- Python读写文件需要注意的地方 2015-03-31 23:19 69人阅读 评论(0) 收藏
<span style="font-family: 'Microsoft YaHei'; background-color: rgb(255, 255, 255);"> ...
- WGS84与CGCS2000坐标系
1.WGS84,WGS是世界大地测量系统World Geodetic System的缩写,84是说此坐标系是1984年建立的: 2.自上世纪60年代,美国军方相继推出WGS60.WGS66.WGS ...
- QGIS WGS84转其它坐标系并计算坐标
需求: 将带有经度.纬度(WGS84坐标系)坐标的文本(*.txt)转换成指定投影坐标系的shp文件并计算x,y坐标. 环境和工具: WIN10.QGIS2.16.带有经纬度坐标的文本.格式如下图: ...
- (数据科学学习手札94)QGIS+Conda+jupyter玩转Python GIS
本文完整代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 QGIS随着近些年的发展,得益于其开源免费 ...
- Python基础之容易忘记的地方
(1)编译型与解释型语言区别: 编译型:一次性,把所有代码编译成机器能识别的二进制码,再运行 代表语言:c,c++ 优点: 执行速度块 缺点: 开发速度慢,调试周期长 解释型:代码从上到下一行一行解释 ...
- 地球坐标系(WGS-84)转火星坐标系(GCJ)
/** * 单点坐标纠偏 */ var pi = 3.14159265358979324; var a = 6378245.0; var ee = 0.00669342162296594323; va ...
- 关于变量参数的传递,python让人蛋痛的地方
def find_file(file_table): with open(file_table, 'r', encoding='utf-8') as read_f: line_dict = {} fo ...
随机推荐
- springboot实现验证码功能
实现验证码功能 先在utils包下创建一个ValidateImageCodeUtils.class package com.wfszmg.demo.utils; import javax.imagei ...
- JVM Dump分析
Thread Dump介绍 Thread Dump是非常有用的诊断 Java应用问题的工具.每一个 Java虚拟机都有及时生成所有线程在某一点状态的 thread-dump的能力,虽然各个 Java虚 ...
- Kafka 事务
更多内容,前往IT-BLOG 在了解 Kafka的事务之前,先说一下 Kafka中幂等和事务(Kafka 0.11.0.0版本引入的两个特性)以此来实现 Exactly once(精确一次)了解更多链 ...
- Java 面试——Zookeeper
一.Zookeeper 实现机制 文件系统 + 通知机制 二.Zookeeper 高可用实现原理 一个 ZooKeeper 集群如果要对外提供可用的服务,那么集群中必须要有过半的机器正常工作并且彼此之 ...
- 汽车制造工艺 2.5D 可视化组态监控 | 图扑软件
前言 随着世界经济的不断发展,汽车作为一个如今随处可见的物体,从大体上概括是由四大部分组成:发动机.底盘.车身.电气系统.看似简单的几个名词组件,其内部却是由无数的细小零件构成,一辆汽车更是由上万个微 ...
- Edge解决默认Bing搜索跳转到国内版的问题
近期BingGPT申请通过以后,每次用PC端Edge去跳转的时候不管是否念Proxy咒都会进入国内版本Bing,排查得到默认Bing参数如下 因此,在edge://settings/searchEng ...
- vue之字符串的方法
目录 简介 indexOf方法 简介 本文会把遇到的字符串的方法慢慢补充进来 indexOf方法 indexOf方法判断字符串是否包含另一个字符串 判断结果如果包含返回的是索引,如果不包含,则返回-1 ...
- 【Spring5】数据库事务操作
Spring针对事务的操作 事务的概念:事务是数据库最基本的单元,逻辑上的一组操作,要么都成功,如果有一个操作失败则都失败. 事务的特性:ACID 原子性.一致性.隔离性.持久性 JavaEE环境三层 ...
- bash shell 无法使用 perl 正则
哈喽大家好,我是咸鱼.今天跟大家分享一个关于正则表达式的案例,希望能够对你有所帮助 案例现象 前几天有一个小伙伴在群里求助,说他这个 shell 脚本有问题,让大家帮忙看看 可以看到,这个脚本首先 ...
- 我的第一个NPM包:panghu-planebattle-esm(胖虎飞机大战)使用说明
好家伙,我的包终于开发完啦 欢迎使用胖虎的飞机大战包!! 为你的主页添加色彩 这是一个有趣的网页小游戏包,使用canvas和js开发 使用ES6模块化开发 效果图如下: (觉得图片太sb的可以自己改 ...