如何使用经纬度坐标计算谷歌地图上两条路径线之间的角度

Posted

技术标签:

【中文标题】如何使用经纬度坐标计算谷歌地图上两条路径线之间的角度【英文标题】:how to calculate angle between two path lines on google map using lat-long coordinates 【发布时间】:2014-06-04 19:02:12 【问题描述】:

我想计算谷歌地图上两条路径线之间的角度。我有线条端点的经纬度坐标。 请提出建议,如果我可以使用 Google 地图上提供的其他信息来执行此操作。

【问题讨论】:

这实际上是一个非常棘手的问题,有很多上下文相关的信息。但是,如果线条相当短且靠近赤道并且您不需要惊人的精度,那么只需将纬度/经度坐标视为笛卡尔坐标并像在平面上一样计算它们之间的角度就足够了。 en.wikipedia.org/wiki/World_Geodetic_System 也可能有用。 哦,为了更准确地对待笛卡尔方法,请尝试将经度增量乘以纬度的余弦。 (不过,这在两极附近仍然行不通。) 您也可以将 lat/long 转换为 x/y/z 并将其视为正常的 3D 矢量,尽管这将是通过 3D 空间的角度(“as the neutrino flies” ),而不是地图投影的角度(“乌鸦飞”)。 如何将 lat long 转换为 x/y/z 是否有任何公式? 这很复杂。请参阅我链接到的 wiki 文章以了解正确的方法(这很困难),或者您可以将其作为两个普通 3D 旋转的组合来完成;从 的一个点开始,然后绕 X 轴旋转纬度,然后绕 Y 轴旋转经度。 【参考方案1】:

如果距离很小,您可以使用此方法。 距离越远,距离赤道越远,精度就会降低。 先用computeHeading()找轴承

computeHeading(from:LatLng, to:LatLng) 将航向从一个 LatLng 返回到另一个 LatLng。航向在 [-180,180) 范围内从北顺时针以度数表示。

function getBearings()
    var spherical = google.maps.geometry.spherical; 
    var point1 = markers[0].getPosition();// latlng of point1
    var point2 = markers[1].getPosition();
    var point3 = markers[2].getPosition();
    var bearing1 = google.maps.geometry.spherical.computeHeading(point1,point2);
    var bearing2 = google.maps.geometry.spherical.computeHeading(point2,point3);
    var angle =getDifference(bearing1, bearing2);
    return angle;

然后您可以使用此函数计算轴承之间的角度。

function getDifference(a1, a2) 
    al = (a1>0) ? a1 : 360+a1;
    a2 = (a2>0) ? a2 : 360+a2;
    var angle = Math.abs(a1-a2)+180;
    if (angle > 180)
        angle = 360 - angle;
    
   return   Math.abs(angle);

【讨论】:

【参考方案2】:

使用您拥有的 API 计算两个轴承。 然后写一个函数angleDiff(angle1, angle2)。

有两种可能的 angleDiff 类型:一种也返回负角。 并且只提供正角度。

使用这些测试用例测试该功能:

angleDiff(350, 10): diff = 20 10, 350: diff = 20(或-20)

170, 190 :diff = 20 190、170:差异 20(或 -20)

0,360 和 360,0:差异 = 0

【讨论】:

以上是关于如何使用经纬度坐标计算谷歌地图上两条路径线之间的角度的主要内容,如果未能解决你的问题,请参考以下文章

LBS高德地图百度地图的经纬度科普|MySQL和编程语言是如何计算两个坐标之间的距离?

LBS高德地图百度地图的经纬度科普|MySQL和编程语言是如何计算两个坐标之间的距离?

获取叠加在地图上的矩形的角的坐标

计算gps点之间的步行距离

谷歌地图返回两条不同的路线

如何从谷歌地图的经纬度坐标中获取城市名称?