GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)

简介: GIS数据格式坐标转换(地球坐标WGS84、GCJ-02、火星坐标、百度坐标BD-09、国家大地坐标系CGCS2000)

文章目录

前言

一、坐标系

1.地球坐标 (WGS84)

2.国测局坐标系(GCJ-02、火星坐标系)

3.百度坐标(BD-09)

4.国家大地2000坐标系(CGCS2000)

二、百度坐标系(BD-09) 与火星坐标系(GCJ-02)的转换

1.核心代码

2.转换验证

百度地图

高德地图

腾讯地图

三、火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换

四、wgs84坐标转换

1.坐标偏移和经纬度单独转换

2.GCJ02 转换为 WGS84

3.WGS84转GCj02

4.WGS84 百度坐标系 (BD-09) 的转换

5.百度坐标系 (BD-09) WGS84 的转换

总结


前言

地理信息系统 (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坐标;

经纬度精准度和转换时估算的差异,会导致不同坐标在地图标注的差异,对实际地点的标注影响不大;

在实际开发中的产品应用:批量转化。即开发批量转化工具,减少对百度或高德地图限额的依赖。


@漏刻有时


相关文章
|
Java 定位技术 数据处理
windows下gdal的java开发环境搭建
本文介绍了gdal在windows环境下怎么搭建java开发,同时提供一个开发示例,通过输出gdal支持的数据驱动来演示其支持的数据类型,同时表明我们的环境搭建完成,可以基于java进行相应开发。
1140 0
windows下gdal的java开发环境搭建
|
算法 定位技术 数据安全/隐私保护
简谈百度坐标反转至WGS84的三种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 基于百度地图进行数据展示是目前项目中常见场景,但是因为百度地图是基于BD09坐标系的,GPS坐标(WGS84)或者其他常见的标准坐标是无法准确在地图上进行展示的,但是互联网在线情况下,百度提供了将WGS84经纬度转换成百度经纬度坐标的API,这里不再对其进行研究(离线情况下也有专门方法解决)。
1869 0
|
算法 JavaScript 前端开发
84坐标系、02坐标系、百度坐标之间相互转换算法
最近有同学反馈之前的坐标系转换有问题,对之前的工具类进行了修正。 一、地图坐标转换java工具类 包含84坐标系、02坐标系、百度地图、高德地图、腾讯地图坐标之间相互转换的算法 wgs84ToGcj02:将 WGS84 坐标系下的经纬度转换为 GCJ02 坐标系下的经纬度。 gcj02ToWgs84:将 GCJ02 坐标系下的经纬度转换为 WGS84 坐标系下的经纬度。 gcj02ToBd09:将 GCJ02 坐标系下的经纬度转换为 BD09 坐标系下的经纬度。 bd09ToGcj02:将 BD09 坐标系下的经纬度转换为 GCJ02 坐标系下的经纬度。
1499 0
84坐标系、02坐标系、百度坐标之间相互转换算法
|
4月前
|
开发者 容器
小白必看 HarmonyOS Next HMRouter 轻松上手秘籍
本文详细介绍了HarmonyOS页面跳转解决方案——HMRouter的使用方法,帮助开发者快速上手。HMRouter封装了系统Navigation能力,提供路由拦截、页面生命周期管理、自定义转场动画等功能,简化开发流程。文章通过具体示例讲解模块内及跨模块页面跳转、路由传参、自定义动画、拦截器和生命周期管理等核心功能。同时,提供了丰富的资源链接,包括接口文档、高级动画教程和常见问题解答,适合初学者系统学习HMRouter的使用与原理。
247 9
小白必看 HarmonyOS Next HMRouter 轻松上手秘籍
|
消息中间件 SQL 分布式计算
DataX插件开发-KafkaWriter
DataX插件开发-KafkaWriter
406 0
|
11月前
|
算法 C++
大地经纬度坐标与地心地固坐标的的转换
大地经纬度坐标与地心地固坐标的的转换
286 0
|
11月前
|
算法 定位技术
大地经纬度坐标系与Web墨卡托坐标系的转换
大地经纬度坐标系与Web墨卡托坐标系的转换
302 0
|
存储 NoSQL 关系型数据库
深入探索地理空间查询:如何优雅地在MySQL、PostgreSQL及Redis中实现精准的地理数据存储与检索技巧
深入探索地理空间查询:如何优雅地在MySQL、PostgreSQL及Redis中实现精准的地理数据存储与检索技巧
2807 0
|
分布式计算 MaxCompute Python
【Maxcompute】bd09、gcj02、wgs84经纬度坐标系转换udf函数
该文介绍了在Maxcompute平台上处理经纬度的实战应用,包括`bd09`、`gcj02`和`wgs84`坐标系之间的转换。提供了`CoordTransform` Python UDF类,支持六种转换操作。代码中包含了转换方法如`bd09togcj02`等,以及辅助计算静态方法。欢迎读者批评指正。
256 0
使用JTS及其姐妹项目GeoTools进行坐标系转换
【6月更文挑战第7天】使用JTS及其姐妹项目GeoTools进行坐标系转换
1161 0