高精度WGS84与GCJ-02坐标转换

本文介绍了如何利用Ceres库实现WGS84到GCJ-02坐标的高精度转换。通过解析求导和数值求导方法,即使在公式不精确或黑箱模式下也能实现高精度转换。文中提供了详细的方法解释和代码实现,并对比了不同方法的精度和时间消耗。
摘要由CSDN通过智能技术生成
  • 一、转换原理

参见这一篇文章《使用ceres实现WGS84到GCJ-02坐标相互转换》

在上一篇日志提到,如果公开的WGS84坐标到GSJ-02坐标转换公式是精确公式,可借助Ceres自动求导进行高精度坐标转换;如果公开的WGS84坐标到GSJ-02坐标转换公式并非精确公式,且国测局使用的转换公式依然是多项式,在黑箱模式下,通过调用国测局提供的加密插件的WGS84坐标转GSJ-02坐标API,利用Ceres数值求导方式,依然可以实现高精度坐标转换。

利用Ceres库实现高精度转换已经是可行的,只是经过测试,Ceres的自动求导与数值求导相对于简单迭代法速度慢太多,在批量转换坐标时,已经不具备实用性了。因此,这一篇日志对坐标相互转换进行了改进。

  1. 假定公开的WGS84转GCJ-02公式是精确公式:进行逆转换时,以GCJ-02坐标为观测值,WGS84坐标为未知数列误差方程,对误差方程进行泰勒展开,取线性项作为近似方程。通过解析求导计算线性化后误差方程的系数矩阵(雅克比矩阵),进行迭代求解,获得高精度的转换坐标。
  2. 假定未知WGS84转GCJ-02公式,但是可以调用加密插件API:与1中方法类似,只是计算误差方程系数矩阵时因为不知道数学模型而无法解析求导,可以利用数值求导做替代。数值求导的效率会低于解析求导,但依然可以在“黑箱模式”下获取高精度的转换坐标。

公开的WGS84坐标转GCJ-02坐标公式为:

\Delta lo{n_0} = lo{n_{WGS84}} - 105

\Delta la{t_0} = la{t_{WGS84}} - 35

\Delta lo{n_1} = 300 + \Delta lo{n_0} + 2\Delta la{t_0} + 0.1\Delta lo{n_0}^2 + 0.1\Delta lo{n_0} \cdot \Delta la{t_0} + 0.1\sqrt {\left| {\Delta lo{n_0}} \right|}

+ \frac{2}{3}\left( {20\sin \left( {6\pi \cdot \Delta lo{n_0}} \right) + 20\sin \left( {2\pi \cdot \Delta lo{n_0}} \right)} \right)

+ \frac{2}{3}\left( {20\sin \left( {\pi \cdot \Delta lo{n_0}} \right) + 40\sin \left( {\frac{​{\pi \cdot \Delta lo{n_0}}}{3}} \right)} \right)

+ \frac{2}{3}\left( {150\sin \left( {\frac{​{\pi \cdot \Delta lo{n_0}}}{​{12}}} \right) + 300\sin \left( {\frac{​{\pi \cdot \Delta lo{n_0}}}{​{30}}} \right)} \right)

\Delta la{t_1} = - 100 + 2\Delta lo{n_0} + 3\Delta la{t_0} + 0.2\Delta la{t_0}^2 + 0.1\Delta lo{n_0} \cdot \Delta la{t_0} + 0.2\sqrt {\left| {\Delta lo{n_0}} \right|}

+ \frac{2}{3}\left( {20\sin \left( {6\pi \cdot \Delta lo{n_0}} \right) + 20\sin \left( {2\pi \cdot \Delta lo{n_0}} \right)} \right)

+ \frac{2}{3}\left( {20\sin \left( {\pi \cdot \Delta la{t_0}} \right) + 40\sin \left( {\frac{​{\pi \cdot \Delta la{t_0}}}{3}} \right)} \right)

+ \frac{2}{3}\left( {160\sin \left( {\frac{​{\pi \cdot \Delta la{t_0}}}{​{12}}} \right) + 320\sin \left( {\frac{​{\pi \cdot \Delta la{t_0}}}{​{30}}} \right)} \right)

{B_{WGS84}} = Deg2Rad(la{t_{WGS84}})

GCJ-02坐标是一种加密坐标系,使用的是国测局制定的加密算法,因此需要进行转换才能得到标准的WGS-84坐标。以下介绍两种常见的转换方法: 1. 使用在线转换工具 目前网络上有很多在线的坐标转换工具,可以很方便地将GCJ-02坐标转换为WGS-84坐标。例如,可以使用坐标转换网站https://www.gpsspg.com/maps.htm 进行转换。具体步骤为: - 打开网站,点击左上方的“坐标转换”按钮; - 在弹出的页面中,选择“坐标系转换”; - 在“待转换坐标系”中选择“GCJ-02坐标系”,在“目标坐标系”中选择“WGS-84坐标系”,输入需要转换的坐标点; - 点击“开始转换”按钮,即可得到转换后的WGS-84坐标点。 2. 使用程序进行转换 除了使用在线转换工具,还可以通过编写程序实现GCJ-02坐标到WGS-84坐标的转换。例如,可以使用Python编写以下代码实现: ```python import math def gcj02_to_wgs84(lng, lat): a = 6378245.0 ee = 0.00669342162296594323 pi = 3.14159265358979324 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) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi) dLng = (dLng * 180.0) / (a / sqrtMagic * math.cos(radLat) * pi) wgsLat = lat - dLat wgsLng = lng - dLng return wgsLng, wgsLat def transform_lat(lng, lat): pi = 3.14159265358979324 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): pi = 3.14159265358979324 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 # 示例 lng, lat = 116.3975, 39.9086 wgs_lng, wgs_lat = gcj02_to_wgs84(lng, lat) print(wgs_lng, wgs_lat) ``` 运行以上代码,即可将GCJ-02坐标转换为WGS-84坐标
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值