Python实现GCJ02坐标系向WGS84坐标系的转换

2024-02-03 06:04

本文主要是介绍Python实现GCJ02坐标系向WGS84坐标系的转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GCJ02坐标系

GCJ-02(官方称地形图非线性保密处理算法,俗称火星坐标系国测局坐标)是一种基于WGS-84制定的大地测量系统,由中国大陆国家测绘地理信息局制定。此坐标系所采用的混淆算法会在经纬度中加入看似随机的偏移。

使用GCJ-02记录下的地点在GCJ-02的地图中会显示在正确位置,然而换成WGS-84的地图或地点记录就可能造成100-700米不等的偏移。据测量,Google.com的地图与真实坐标相差约50-500米,而中国大陆区的Google.cn地图则与卫星图无偏差,雅虎地图显示的街道图也与卫星图偏差不大。MapQuest地图与众包测绘、不受限制的OpenStreetMap重合。


WGS84坐标系

WGS-84坐标系(World Geodetic System一1984 Coordinate System)是一种国际上采用的地心坐标系。坐标原点为地球质心,其地心空间直角坐标系的Z轴指向BIH (国际时间服务机构)1984.0定义的协议地球极(CTP)方向,X轴指向BIH 1984.0的零子午面和CTP赤道的交点,Y轴与Z轴、X轴垂直构成右手坐标系,称为1984年世界大地坐标系统。
GPS广播星历是以WGS-84坐标系为根据的。


总结

WGS84是大地坐标系,这是一种国际通用的坐标,中国的大地坐标是CGCS2000,也是原始坐标系,一般的终端设备,如果自己有定位功能,比如车载系统,他们发出的gps坐标就是原始坐标,我们在一些地图应用中使用的定位,比如打车软件,其他自带地图的软件,他们一般都是火星坐标系GCJ02,需要进行一个坐标转换。而百度地图相关的应用,基本都是使用的百度坐标,这个是在火星坐标基础上进行的再次加密,所以它还是与火星坐标有关系。

国内的一般都是GCJ02坐标系
国外的很多都是WGS84坐标系

应用需求

我需要把国内平台的数据集,使用Python的Folium库进行地图可视化,但是该可视化库是基于WGS84坐标系实现的。直接把国内平台基于GCJ02坐标系的坐标点使用Folium库进行地图可视化,会有很大的偏移,看起来乱七八糟。
因此,需要先将国内平台的数据集的点的坐标从GCJ02坐标系转换为WGS84坐标系,再使用Folium库进行地图可视化


代码

import mathpi = math.pi
es = 0.00669342162296594323  # 偏心率平方
a = 6378245.0  # 长半轴def _transformlat(lng, lat):ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lat * pi) + 40.0 * math.sin(lat / 3.0 * pi)) * 2.0 / 3.0ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * math.sin(lat * pi / 30.0)) * 2.0 / 3.0return retdef _transformlng(lng, lat):ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lng * pi) + 40.0 * math.sin(lng / 3.0 * pi)) * 2.0 / 3.0ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 * math.sin(lng / 30.0 * pi)) * 2.0 / 3.0return retdef GCJ02_to_WGS84(gcj_lng, gcj_lat):'''                                                               实现GCJ02坐标系向WGS84坐标系的转换:param gcj_lng: GCJ02坐标系下的经度:param gcj_lat: GCJ02坐标系下的纬度:return: 转换后的WGS84下经纬度'''dlat = _transformlat(gcj_lng - 105.0, gcj_lat - 35.0)dlng = _transformlng(gcj_lng - 105.0, gcj_lat - 35.0)radlat = gcj_lat / 180.0 * pimagic = math.sin(radlat)magic = 1 - es * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((a * (1 - es)) / (magic * sqrtmagic) * pi)dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)mglat = gcj_lat + dlatmglng = gcj_lng + dlnglng = gcj_lng * 2 - mglnglat = gcj_lat * 2 - mglatreturn lng, lat

这篇关于Python实现GCJ02坐标系向WGS84坐标系的转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/673182

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码