我使用Haversine公式来计算两个纬度 - 经度对的距离 .
function getDistanceFromLatLonInKm(lat1,lon1,lat2,lon2) {
var R = 6371; // Radius of the earth in km
var dLat = deg2rad(lat2-lat1);
var dLon = deg2rad(lon2-lon1);
var lat1 = deg2rad(lat1);
var lat2 = deg2rad(lat2);
var a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.sin(dLon/2) * Math.sin(dLon/2) *
Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return d;
}
给定起点(lat1,lat2),在直线上移动所需的距离和角度,我需要确定 endpoints (如lat2和lon2) .
看下面我的尝试:
function getFinalLatLon(lat1, lon1, distance, angle) {
var R = 6371; // Radius of the earth in km
var c = distance/R;
// Math.atan2(Math.sqrt(a), Math.sqrt(1-a)) = c/2
var a = // stuck here
// looking for this part of the code
return [lat2, lon2];
}
2 回答
我刚刚发现了一个类似的问题here,我按照解决方案提出了一个适合我案例的功能 .
希望它可以帮助其他人:
水平移动的角度为0度 . 您可以根据需要切换 . 如果有人向北移动那将是90度 . 西北135度,依此类推......
如果您正在水平移动,则可以将经度增加
distance / (R * cos(lat))
. 不需要atan
.编辑:由于您需要一般情况的公式,请考虑以下几何推导:
笔记:
r
是起始位置的单位矢量,s
是 endpoints .a, b, c
是帮助计算的中间向量 .(θ, φ)
是(lat,long)坐标 .γ
是您要前往的方向的方向 .δ
是行进的角度(距离/半径R = 6400000m
) .我们需要
a, b
与r
垂直,并且a
与North对齐 . 这给出了:c
由(简单三角法)给出:因此我们得到
s
(通过一些非常乏味的代数):现在我们可以使用以下方法计算
s
的最终(纬度,长度)坐标:码:
测试用例:
输入
(lat, long) = (45, 0)
,angle = 0
,distance = radius * deg2rad(90)
=>(45, 180)
(正如我之前所说)输入
(lat, long) = (0, 0)
,angle = 90
,distance = radius * deg2rad(90)
=>(0, 90)
(正如预期的那样 - 从赤道开始,向东行驶90度经度)输入
(lat, long) = (54, 29)
,angle = 36
,distance = radius * deg2rad(360)
=>(54, 29)
(正如预期的那样 - 从任意随机位置开始,向任意方向转圈)有趣的案例:输入
(lat, long) = (30, 0)
,其他一切都一样 . =>(0, 90)
(我们预计(30, 90)
? - 不是从赤道开始,向北行进90度)这样做的原因是北方90度不是东方(如果你不在赤道)!该图表应说明原因:
如您所见,向北90度的移动路径不在东方向 .