文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-09-10 15:10

关注

文章目录


前言

地理信息系统 (GIS) 是一个创建、管理、分析和绘制所有类型数据的系统。GIS 将数据连接到地图,将位置数据(事物所在位置)与所有类型的描述性信息(事物在该位置的情况)集成到一起。这可以为适用于自然科学和几乎所有行业的制图和分析提供基础。GIS 帮助用户了解模式、关系和地理环境。其优势包括改善沟通、提高效率以及更好地管理和决策。


一、坐标系

坐标系是一种用于表示地理要素、影像和观察值位置的参照系统,为定义真实世界的位置提供了框架。

使用 [经度,纬度]来描述点的横纵坐标,经度(longitude)范围是[-180,180],纬度(latitude)范围是[-90,90],那么大于90或者小于90的一定不会是纬度,另外我们中国所覆盖的范围大约是经度73.66 ~ 135.05,纬度3.86 ~ 53.55,因此在国内项目上可以通过坐标范围来判定经纬度顺序:经度缩写为lng,纬度缩写为lat。

1.地球坐标 (WGS84)

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

3.百度坐标(BD-09)

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

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

在这里插入图片描述

腾讯地图

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 retdef 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]]

总结

@漏刻有时

来源地址:https://blog.csdn.net/weixin_41290949/article/details/128994210

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯