首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >GCJ-02(高德) BD-09(百度) WGS-84(谷歌)坐标系之间的转换

GCJ-02(高德) BD-09(百度) WGS-84(谷歌)坐标系之间的转换

作者头像
andyhu
发布于 2022-12-14 07:23:07
发布于 2022-12-14 07:23:07
14K093
代码可运行
举报
文章被收录于专栏:andyhu-大前端andyhu-大前端
运行总次数:93
代码可运行

WGS-84、GCJ-02、BD-09 坐标系

先了解一下WGS-84、GCJ-02、BD-09 坐标系分别是什么

  • WGS84(World Geodetic System 1984):是 GPS 全球定位系统建立的坐标系统,通过GPS定位拿到的原始经纬度。
  • GCJ-02(国家测量局02号标准)GCJ-02 是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系统的坐标系统,是在WGS84经纬度的基础上执行加密算法而成。因为GPS得到的经纬度直接在 GCJ-02 坐标系下会定位到错误的地点,有种到了火星的感觉,因此在坊间也将 GCJ-02 戏称为火星坐标系国内的高德地图就是用的 GCJ-02 坐标系
  • BD-09(Baidu, BD)是百度地图使用的地理坐标系,其在GCJ-02上多增加了一次变换,用来保护用户隐私。从百度产品中得到的坐标都是BD-09坐标系。

WGS-84、GCJ-02、BD-09 坐标系之间的转换

新建一个 js 文件,直接把下面的代码copy进去。在需要使用的地方导入就可以调用下面的各个转换方法了 —.—

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 *  判断经纬度是否超出中国境内
 */
function isLocationOutOfChina(latitude, longitude) {
  if (longitude < 72.004 || longitude > 137.8347 || latitude < 0.8293 || latitude > 55.8271)
    return true;
  return false;
}


/**
 *  将WGS-84(国际标准)转为GCJ-02(火星坐标):
 */
function transformFromWGSToGCJ(latitude, longitude) {
  var lat = "";
  var lon = "";
  var ee = 0.00669342162296594323;
  var a = 6378245.0;
  var pi = 3.14159265358979324;

  if (isLocationOutOfChina(latitude, longitude)) {
    lat = latitude;
    lon = longitude;
  }
  else {
    var adjustLat = transformLatWithXY(longitude - 105.0, latitude - 35.0);
    var adjustLon = transformLonWithXY(longitude - 105.0, latitude - 35.0);
    var radLat = latitude / 180.0 * pi;
    var magic = Math.sin(radLat);
    magic = 1 - ee * magic * magic;
    var sqrtMagic = Math.sqrt(magic);
    adjustLat = (adjustLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
    adjustLon = (adjustLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
    latitude = latitude + adjustLat;
    longitude = longitude + adjustLon;
  }
  return { latitude: latitude, longitude: longitude };

}

/**
 *  将GCJ-02(火星坐标)转为百度坐标(DB-09):
 */
function transformFromGCJToBaidu(latitude, longitude) {  
  var pi = 3.14159265358979324 * 3000.0 / 180.0;

  var z = Math.sqrt(longitude * longitude + latitude * latitude) + 0.00002 * Math.sin(latitude * pi);
  var theta = Math.atan2(latitude, longitude) + 0.000003 * Math.cos(longitude * pi);
  var a_latitude = (z * Math.sin(theta) + 0.006);
  var a_longitude = (z * Math.cos(theta) + 0.0065);

  return { latitude: a_latitude, longitude: a_longitude };
}

/**
 *  将百度坐标(DB-09)转为GCJ-02(火星坐标):
 */
function transformFromBaiduToGCJ(latitude, longitude) {
  var xPi = 3.14159265358979323846264338327950288 * 3000.0 / 180.0;

  var x = longitude - 0.0065;
  var y = latitude - 0.006;
  var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * xPi);
  var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * xPi);
  var a_latitude = z * Math.sin(theta);
  var a_longitude = z * Math.cos(theta);

  return { latitude: a_latitude, longitude: a_longitude };
}

/**
 *  将GCJ-02(火星坐标)转为WGS-84(国际标准):
 */
function transformFromGCJToWGS(latitude, longitude) {
  var threshold = 0.00001;

  // The boundary
  var minLat = latitude - 0.5;
  var maxLat = latitude + 0.5;
  var minLng = longitude - 0.5;
  var maxLng = longitude + 0.5;

  var delta = 1;
  var maxIteration = 30;

  while (true) {
    var leftBottom = transformFromWGSToGCJ(minLat, minLng);
    var rightBottom = transformFromWGSToGCJ(minLat, maxLng);
    var leftUp = transformFromWGSToGCJ(maxLat, minLng);
    var midPoint = transformFromWGSToGCJ((minLat + maxLat) / 2, (minLng + maxLng) / 2);
    delta = Math.abs(midPoint.latitude - latitude) + Math.abs(midPoint.longitude - longitude);

    if (maxIteration-- <= 0 || delta <= threshold) {
      return { latitude: (minLat + maxLat) / 2, longitude: (minLng + maxLng) / 2 };
    }

    if (isContains({ latitude: latitude, longitude: longitude }, leftBottom, midPoint)) {
      maxLat = (minLat + maxLat) / 2;
      maxLng = (minLng + maxLng) / 2;
    }
    else if (isContains({ latitude: latitude, longitude: longitude }, rightBottom, midPoint)) {
      maxLat = (minLat + maxLat) / 2;
      minLng = (minLng + maxLng) / 2;
    }
    else if (isContains({ latitude: latitude, longitude: longitude }, leftUp, midPoint)) {
      minLat = (minLat + maxLat) / 2;
      maxLng = (minLng + maxLng) / 2;
    }
    else {
      minLat = (minLat + maxLat) / 2;
      minLng = (minLng + maxLng) / 2;
    }
  }

}

function isContains(point, p1, p2) {
  return (point.latitude >= Math.min(p1.latitude, p2.latitude) &amp;&amp; point.latitude <= Math.max(p1.latitude, p2.latitude)) &amp;&amp; (point.longitude >= Math.min(p1.longitude, p2.longitude) &amp;&amp; point.longitude <= Math.max(p1.longitude, p2.longitude));
}

function transformLatWithXY(x, y) {
  var pi = 3.14159265358979324;
  var lat = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
  lat += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
  lat += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0;
  lat += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0;
  return lat;
}

function transformLonWithXY(x, y) {
  var pi = 3.14159265358979324;
  var lon = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
  lon += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0;
  lon += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0;
  lon += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0;
  return lon;
}



module.exports = {
  isLocationOutOfChina: isLocationOutOfChina,
  transformFromWGSToGCJ: transformFromWGSToGCJ,
  transformFromGCJToBaidu: transformFromGCJToBaidu,
  transformFromBaiduToGCJ: transformFromBaiduToGCJ,
  transformFromGCJToWGS: transformFromGCJToWGS
}

总结

为了方便阅读,我把这些坐标系分别用百度地图、高德地图、谷歌地图这些产品名字代替了,谷歌坐标系(WGS-84)、高德坐标系(GCJ-02)、百度坐标系(BD-09)

有些项目可能会用调用第三方 API 拿到数据,假如这个第三方的数据是高德地图坐标系的数据,而自己项目中却是用的百度坐标系的数据,这个时候就需要把 高德坐标系 转成 百度坐标系 的数据。

又因业务需要,假如又调了另一个第三方接口拿到的是谷歌地图的坐标系,这个时候你得先把 谷歌坐标系 转成 高德坐标系的数据 ,再把 高德坐标系的数据 转成你项目中的 百度坐标系数据,坐标系的转成是这样的 谷歌坐标系(WGS-84) => 高德坐标系(GCJ-02) => 百度坐标系(BD-09),这样就比较麻烦。

我的建议:因为 谷歌坐标系 转成 百度坐标系 是需要先转成 高德坐标系 才能进一步转成 百度坐标系。为了减少转换的次数,我是直接统一把几个坐标系都转成中间的 高德坐标系。

写在最后

我是 AndyHu,目前暂时是一枚前端搬砖工程师。

文中如有错误,欢迎在评论区指正,如果这篇文章帮到了你,欢迎点赞和关注呀😊

未经许可禁止转载💌

speak less,do more.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
UC伯克利发现「没有免费午餐定理」加强版:每个神经网络,都是一个高维向量
经典的「没有免费午餐定理」表明:如果某种学习算法在某些方面比另一种学习算法更优,则肯定会在其它某些方面弱于另一种学习算法。
AI科技评论
2021/11/17
3950
探索无限大的神经网络
平时难住我们的是,有再多资源也承载不了无限大的网络。但其实可以证明无限宽的网络和核方法是等效的,给了我们揭开无限宽网络面纱的机会。另外我们还有一些额外的收获——原来核方法和神经网络也沾亲带故。
AI科技评论
2019/10/14
7970
探索无限大的神经网络
ECCV 2020 | 从一种拓扑视角来优化神经网络的连通性的解读
本文是计算机视觉领域顶级会议 ECCV 2020 入选论文《Learning Connectivity of Neural Networks from a Topological Perspective》的解读。
AI科技评论
2020/08/20
7520
ECCV 2020 | 从一种拓扑视角来优化神经网络的连通性的解读
KDD 2022 | 深度图神经网络中的特征过相关:一个新的视角
题目:Feature Overcorrelation in Deep Graph Neural Networks: A New Perspective
Cyril-KI
2022/11/29
1.3K0
KDD 2022 | 深度图神经网络中的特征过相关:一个新的视角
深度学习不再是炼丹术!谷歌给出首个神经网络训练理论证明
谷歌AI的研究人员日前在arxiv贴出一篇文章,给出了首个神经网络训练相关的理论证明。
abs_zero
2019/05/05
5040
深度学习不再是炼丹术!谷歌给出首个神经网络训练理论证明
图神经网络越深,表现就一定越好吗?
数十层甚至数百层神经网络的应用,是深度学习的重要标志之一。但现实情况却远非如此:比如今年被视作机器学习领域最火热的研究方向之一——图神经网络,大多数都只运用了寥寥几层网络。
AI科技评论
2020/08/10
7240
图神经网络越深,表现就一定越好吗?
ICLR 2020 | 如何让图卷积网络变深?腾讯AI Lab联合清华提出DropEdge
腾讯 AI Lab 和清华大学的这项研究表明,图神经网络无法做深由两个原因造成:过拟合 (Overfitting) 和过平滑(Oversmoothing)。为了解决这两个问题,文章提出了一种简洁但非常有效的方法:随机删边技术,DropEdge,极大提升了超深图卷积网络的训练效率和节点分类效果。值得注意的是,文章投稿到 openreview 的时候就引来了众多研究同行的关注。文章正式被接收后,图灵奖获得者 Yoshua Bengio 的团队成员 Petar Veličković(注意力图网络 GAT 的发明者)在 openreview 平台上也给与了关注与好评。
机器之心
2020/04/14
4870
ICLR 2020 | 如何让图卷积网络变深?腾讯AI Lab联合清华提出DropEdge
Transformer 能代替图神经网络吗?
当Transformer模型发布时,它彻底革新了机器翻译领域。虽然最初是为特定任务设计的,但这种革命性的架构显示出它可以轻松适应不同的任务。随后成为了Transformer一个标准,甚至用于它最初设计之外的数据(如图像和其他序列数据)。
deephub
2024/07/01
2510
Transformer 能代替图神经网络吗?
图神经网络上的统一的彩票假设
GNN的花式研究越来越多了~ 本来读了这篇后想写一下, 发现AI in Graph的小伙伴已经写的挺好了~
Houye
2021/07/30
1.4K0
11种主要神经网络结构图解
随着深度学习的快速发展,人们创建了一整套神经网络结构来解决各种各样的任务和问题。尽管有无数的神经网络结构,这里有十一种对于任何深度学习工程师来说都应该理解的结构,可以分为四大类: 标准网络、循环网络、卷积网络和自动编码器。
McGL
2020/09/02
7.7K0
【KDD20】深度图神经网络专题
图神经网络在处理基于图数据问题方面取得了巨大的成功,受到了广泛的关注和应用。GNNs通常是基于消息传递的方式设计的,本质思想即迭代地聚合邻居信息,而经过
zenRRan
2020/09/22
1.1K0
【KDD20】深度图神经网络专题
谷歌开源Neural Tangents:简单快速训练无限宽度神经网络
近日,谷歌一项研究成果在社区引发了关注,该研究宣称可通过神经正切核(Neural Tangent Kernel)使用贝叶斯推理或梯度下降分析式地训练无限宽度的神经网络。使用谷歌开源的软件库 Neural Tangents,这个过程不仅简单且快速,而且效果非常好,甚至只需 5 行代码就能一步到位地构建并训练这种无限宽度网络的集成模型!该论文已被 ICLR 2020 接收为 Spotlight 论文,相关链接见文末。
机器之心
2020/04/14
7840
谷歌开源Neural Tangents:简单快速训练无限宽度神经网络
ICLR 2020 | 神经正切,5行代码打造无限宽的神经网络模型
本文是对 ICLR 2020 论文《NEURAL TANGENTS: FAST AND EASY INFINITE NEURAL NETWORKS IN PYTHON》的解读,作者来自谷歌。
AI科技评论
2020/04/21
5900
ICLR 2020 | 神经正切,5行代码打造无限宽的神经网络模型
图神经网络 GNN GAT & GCN(一)
知乎: https://www.zhihu.com/people/gong-jun-min-74
zenRRan
2020/04/21
3.6K0
图神经网络 GNN GAT & GCN(一)
深度学习与统计力学(IV) :深层网络的信号传播和初始化
在对公式(3)的误差曲面运行梯度下降之前,我们必须要选择参数 的初始配置。 对应公式(1)神经网络中所有 层中的权重和偏置 。通常,这些参数的初始值是随机选择的。权重 从一个零均值方差为 的高斯分布中独立同分布采样,其中 为突触前层的神经元数量。偏置则是从一个零均值方差为 的高斯分布中独立同分布采样。权重和偏置的相对尺度确保两者在同等的基础上影响突触后活动,即使对于大的 。
数据科学人工智能
2022/03/31
9710
深度学习与统计力学(IV) :深层网络的信号传播和初始化
关于图神经网络(Graph Neural Networks,GNN)基础知识汇总1.0
图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
江夏四卯
2023/09/30
9.5K0
详细对比深度神经网络DNN和高斯过程GP
深度神经网络 (DNN) 和高斯过程 (GP)* 是两类具有高度表现力的监督学习算法。在考虑这些方法的应用时会出现一个自然的问题:“什么时候以及为什么使用一种算法比另一种更有意义?”
deephub
2021/10/09
1.2K0
学界 | 深度神经网络为什么不易过拟合?傅里叶分析发现固有频谱偏差
众所周知,过参数化的深度神经网络(DNN)是一类表达能力极强的函数,它们甚至可以以 100% 的训练准确率记住随机数据。这种现象就提出了一个问题:为什么它们不会轻易地过度拟合真实数据?为了回答这个问题,我们使用傅立叶分析研究了深度神经网络。我们证明了具有有限权重(或者经过有限步训练)的深度神经网络天然地偏向于在输入空间上表示光滑的函数。具体而言,深度 ReLU 网络函数的一个特定频率分量(k)的大小至少以 O(k^(-2))的速率衰减,网络的宽度和深度分别以多项式和指数级别帮助网络对更高的频率建模。这就说明了为什么深度神经网络不能完全记住 delta 型的峰函数。我们的研究还表明深度神经网络可以利用低维数据流形的几何结构来用简单的函数逼近输入空间中存在于简单函数流形上的复杂函数。结果表明,被网络分类为属于某个类的所有样本(包括对抗性样本)都可以通过一条路径连接起来,这样沿着该路径上的网络预测结果就不会改变。最后,我们发现对应于高频分量的深度神经网络(DNN)参数在参数空间中所占的体积较小。
机器之心
2018/07/26
9910
学界 | 深度神经网络为什么不易过拟合?傅里叶分析发现固有频谱偏差
深度学习与统计力学(IV) :深层网络的信号传播和初始化
有趣的是,这种输入几何形状的信息传播的发散深度尺度与训练极深的临界网络的能力相吻合[31](如图3所示)。此外,在远离临界点时,可靠的前向信息传播的深度尺度决定了神经网络可以训练的深度。这种临界相变、发散的深度尺度和临界状态下的深度可训练性不仅在全连接网络中观察到[31],而且还在卷积网络[63],自编码器[64]和循环网络[65,66]中观察到。
数据酷客
2020/04/28
5890
深度学习与统计力学(IV) :深层网络的信号传播和初始化
神经网络可解释性、深度学习新方法, 2020 年有哪些势不可挡的研究趋势?
作为 2019 年最后一场重量级的人工智能国际学术顶会,NeurIPS 2019 所反映出的一些人工智能研究趋势,例如神经网络可解释性、深度学习新方法、神经科学等等,想必对于大家在新的一年开展研究工作,具有一定的借鉴和参考价值。
数据派THU
2020/02/12
1.2K0
神经网络可解释性、深度学习新方法, 2020 年有哪些势不可挡的研究趋势?
推荐阅读
相关推荐
UC伯克利发现「没有免费午餐定理」加强版:每个神经网络,都是一个高维向量
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档