首页 > Python资料 博客日记
GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)
2024-05-30 12:00:04Python资料围观166次
Python资料网推荐GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)这篇文章给大家,欢迎收藏Python资料网享受知识的乐趣
文章目录
前言
地理信息系统 (GIS) 是一个创建、管理、分析和绘制所有类型数据的系统。GIS 将数据连接到地图,将位置数据(事物所在位置)与所有类型的描述性信息(事物在该位置的情况)集成到一起。这可以为适用于自然科学和几乎所有行业的制图和分析提供基础。GIS 帮助用户了解模式、关系和地理环境。其优势包括改善沟通、提高效率以及更好地管理和决策。
一、坐标系
坐标系是一种用于表示地理要素、影像和观察值位置的参照系统,为定义真实世界的位置提供了框架。
使用 [经度,纬度]来描述点的横纵坐标,经度(longitude)范围是[-180,180],纬度(latitude)范围是[-90,90],那么大于90或者小于90的一定不会是纬度,另外我们中国所覆盖的范围大约是经度73.66 ~ 135.05,纬度3.86 ~ 53.55
,因此在国内项目上可以通过坐标范围来判定经纬度顺序:经度缩写为lng,纬度缩写为lat。
1.地球坐标 (WGS84)
- 国际标准,从 GPS 设备中取出的数据的坐标系。
- 国际地图提供商使用的坐标系(谷歌地图国外、osm、mapbox)。
2.国测局坐标系(GCJ-02、火星坐标系)
- 中国标准,从国行移动设备中定位获取的坐标数据使用这个坐标系;
- 国家规定:国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密(高德地图、腾讯地图等) ;
- WGS84基础上的加密;
3.百度坐标(BD-09)
- 百度标准,百度 SDK,百度地图,百度GeoCoding 使用;
- GCJ-02基础上的二次加密。
4.国家大地2000坐标系(CGCS2000)
- 国家天地图使用的坐标系。
- 基本跟WGS84相近(厘米级)。
WGS84 通过国测局一次加密偏移后为 GCJ02(国测局2002)坐标系,BD09在此基础上进行了二次加密,而国家大地2000(CGCS2000)则是我们国家目前在推的标准规范平时精度要求不高,我们可以约等同于 WGS84。
二、百度坐标系(BD-09) 与火星坐标系(GCJ-02)的转换
1.核心代码
"""
*百度坐标系(BD-09) 与火星坐标系(GCJ-02)的转换
*即百度转谷歌(国内)、高德、腾讯
* @ parambd_lon
* @ parambd_lat
* @ returns{*[]}
"""
def bd09togcj02(bd_lon, bd_lat):
x = bd_lon - 0.0065
y = bd_lat - 0.006
z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_PI)
theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_PI)
gg_lng = z * math.cos(theta)
gg_lat = z * math.sin(theta)
return [gg_lng, gg_lat]
# print(bd09togcj02(120.199672, 30.331184))
2.转换验证
通过百度、高德和腾讯,国内3大主流LBS地图为测试蓝本,拾取百度坐标后,进行转换到各自版本做标注比对。
百度地图
120.199672,30.331184
高德地图
120.19312059585862, 30.325466905933578
腾讯地图
30.325466905933578, 120.19312059585862。腾讯地图的经纬度输入方式,和百度高德的不同,需要对调位置。
三、火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
核心代码
"""
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
* 即谷歌、高德 转 百度
* @param lng
* @param lat
* @returns {*[]}
"""
def gcj02tobd09(lng, lat):
z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_PI)
theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_PI)
bd_lng = z * math.cos(theta) + 0.0065
bd_lat = z * math.sin(theta) + 0.006
return [bd_lng, bd_lat]
# print(gcj02tobd09(120.19312059585862, 30.325466905933578))
四、wgs84坐标转换
1.坐标偏移和经纬度单独转换
"""
* 判断是否在国内,不在国内则不做偏移
* @param lng
* @param lat
* @returns {boolean}
"""
def out_of_china(lng, lat):
# 纬度3.86~53.55,经度73.66~135.05
if 73.66 < lng < 135.05 and 3.86 < lat < 53.55:
return False
"""
* 经纬度偏移转换
"""
def transform_lat(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.0
ret += (20.0 * math.sin(lat * PI) + 40.0 * math.sin(lat / 3.0 * PI)) * 2.0 / 3.0
ret += (160.0 * math.sin(lat / 12.0 * PI) + 320 * math.sin(lat * PI / 30.0)) * 2.0 / 3.0
return ret
def transform_lng(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.0
ret += (20.0 * math.sin(lng * PI) + 40.0 * math.sin(lng / 3.0 * PI)) * 2.0 / 3.0
ret += (150.0 * math.sin(lng / 12.0 * PI) + 300.0 * math.sin(lng / 30.0 * PI)) * 2.0 / 3.0
return ret
2.GCJ02 转换为 WGS84
"""
* GCJ02 转换为 WGS84
* @param lng
* @param lat
* @returns {*[]}
"""
def gcj02_to_wgs84(lng, lat):
# 判断是否为国外坐标
if out_of_china(lng, lat):
return [lng, lat]
else:
dlat = transform_lat(lng - 105.0, lat - 35.0)
dlng = transform_lng(lng - 105.0, lat - 35.0)
radlat = lat / 180.0 * PI
magic = math.sin(radlat)
magic = 1 - ee * magic * magic
sqrtmagic = math.sqrt(magic)
dlat = (dlat * 180.0) / ((aa * (1 - ee)) / (magic * sqrtmagic) * PI)
dlng = (dlng * 180.0) / (aa / sqrtmagic * math.cos(radlat) * PI)
mglat = lat + dlat
mglng = lng + dlng
return [lng * 2 - mglng, lat * 2 - mglat]
3.WGS84转GCj02
"""
* WGS84转GCj02
* @param lng
* @param lat
* @returns {*[]}
"""
def wgs84_to_gcj02(lng, lat):
if out_of_china(lng, lat):
return [lng, lat]
else:
dlat = transform_lat(lng - 105.0, lat - 35.0)
dlng = transform_lng(lng - 105.0, lat - 35.0)
radlat = lat / 180.0 * PI
magic = math.sin(radlat)
magic = 1 - ee * magic * magic
sqrtmagic = math.sqrt(magic)
dlat = (dlat * 180.0) / ((aa * (1 - ee)) / (magic * sqrtmagic) * PI)
dlng = (dlng * 180.0) / (aa / sqrtmagic * math.cos(radlat) * PI)
mglat = lat + dlat
mglng = lng + dlng
return [mglng, mglat]
4.WGS84 百度坐标系 (BD-09) 的转换
"""
*WGS84 百度坐标系 (BD-09) 的转换
*@param lng
*@param lat
*@returns {*[]}
"""
def wgs84_to_bd09(lng, lat):
point = wgs84_to_gcj02(lng, lat)
bdpoint = gcj02_to_bd09(point[0], point[1])
return [bdpoint[0], bdpoint[1], point[0], point[1]]
5.百度坐标系 (BD-09) WGS84 的转换
"""
* 百度坐标系 (BD-09) WGS84 的转换
* @param lng
* @param lat
* @returns {*[]}
"""
def bd09_to_wgs84(lng, lat):
point = bd09_to_gcj02(lng, lat)
wgs84point = gcj02_to_wgs84(point[0], point[1])
return [wgs84point[0], wgs84point[1]]
总结
- 解决使用百度webAPI坐标转换时的问题:X→GPS根据法律规定,不支持将任何类型的坐标转换为GPS坐标;
- 经纬度精准度和转换时估算的差异,会导致不同坐标在地图标注的差异,对实际地点的标注影响不大;
- 在实际开发中的产品应用:批量转化。即开发批量转化工具,减少对百度或高德地图限额的依赖。
@漏刻有时
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Anaconda版本和Python版本对应关系(持续更新...)
- Python与PyTorch的版本对应
- Windows上安装 Python 环境并配置环境变量 (超详细教程)
- Python pyinstaller打包exe最完整教程