我正在尝试找到一个方程来查找 Javascript 中两个纬度/经度点之间的纬度/经度点。 它会像这样工作。
getMiddle(lat1, lng1, lat2, lng2)
<= would return [lat3, lat3] halfway distance wise (going around the earth obviously).
我发现了这个:
日期:2001年10月11日11:41:08 来自:瑞克医生 主题:回复:确定两个给定点之间的纬度和经度 点
嗨,查克。
这可能比你想象的要复杂一些。这 对我来说最简单的方法就是用向量来思考。一些 我们的档案中有关纬度和经度使用主题的项目 矢量方法,因此您可以看到它们作为背景。例如:
地球上两点之间的距离
链接我们将两点命名为A和B,并选择一个直角坐标 赤道位于 x-y 平面且经度为 A 点位于 x-z 平面内。设 lat1 为 A 的纬度,设 lat2 是 B 的纬度,令 dlat 是 B 的经度减去 A 的经度。最后,使用距离单位,使得 A 的半径 地球为 1。然后从地心到 A 的向量和 B 是
A = (cos(lat1), 0, sin(lat1)) B = (cos(lat2)*cos(dlon), cos(lat2)*sin(dlon), sin(lat2))
C 点,A 和 B 之间最短线的中点,位于 向量 A 和 B 的总和。(这是有效的,因为 A 和 B 具有相同的 长度,因此向量之和是菱形的对角线,并且 这条对角线平分角度。)
A+B = (cos(lat1)+cos(lat2)*cos(dlon), cos(lat2)*sin(dlon), 正弦(纬度1)+正弦(纬度2))
为了得到实际的向量C,我们需要将该向量缩放到长度R 所以它终止于地球表面。因此我们必须将其除以 |A+B|,即向量A+B的长度。那会变得非常混乱。 但我们可以找到纬度lat3和经度差(lon3-lon1) 通过查看 A+B 坐标的比率,这些比率是 无论我们是否缩放向量,都是一样的。要看到这一点,请回顾一下 向量 B 的公式。知道该向量,我们可以恢复 lat2 和 德龙:
dlon = tan^-1(B_y/B_x) lat2 = tan^-1(B_z/sqrt(B_x^2+B_y^2))
这里,B_x、B_y、B_z 分别是向量 B 的 x、y、z 坐标。
我们可以用向量 A+B 做同样的事情来找到纬度和 C点经度:
dlon3 = tan^-1(cos(lat2)*sin(dlon)/ (cos(lat1)+cos(lat2)*cos(dlon))) lat3 = tan^-1((sin(lat1)+sin(lat2))/ sqrt((cos(lat1)+cos(lat2)*cos(dlon))^2+ (cos(lat2)*sin(dlon))^2))
这就是您寻求的公式。由于两个公式都涉及除法,我们 必须考虑特殊情况。经度计算失败时 C_x = 0,即当C与A经度相差90度时,所以 dlon3 将为+90 或-90;该符号取决于 dlon 的符号。这 当 C_x 和 C_y 都为零时,纬度计算失败,因此我们 知道在这种情况下,lat3 = 0。完整的算法将检查 这些情况,但如果您只对以下内容感兴趣,它们就不会发生 美国大陆。
当我输入洛杉矶和纽约市的纬度和经度时,我得到:
洛杉矶 34.122222 118.4111111 纽约 40.66972222 73.94388889 中部 39.54707861 97.201534
希望这对您有帮助。
- Rick 博士,数学论坛 链接
我相信有答案,但不是 Javascript。
这就是我正在处理的事情:
我花了一些时间创建地图点并确定它们之间的距离,但找到它们之间的中间点对我来说很困难。 到目前为止,我发现转换方程并不成功。
一旦找到中点,我想使用递归+(根据距离,两点之间需要多少个点)来构建适当间隔的虚线。
对这篇文章的任何帮助将不胜感激。
Python答案:http://code.activestate.com/recipes/577713-midpoint-of-two-gps-points/
另外:对于那些想直接盈利的人(是的,我知道我修补了数学。从这里无耻地借用:https://nickthecoder.wordpress.com/2012/04/15/radian-and- Degree-conversion-in -javascript/)
getMidpoint: function(lat1, lng1, lat2, lng2) {
Math.degrees = function(rad) {
return rad * (180 / Math.PI);
}
Math.radians = function(deg) {
return deg * (Math.PI / 180);
}
lat1 = Math.radians(lat1);
lng1 = Math.radians(lng1);
lat2 = Math.radians(lat2);
lng = Math.radians(lng2);
bx = Math.cos(lat2) * Math.cos(lng - lng1)
by = Math.cos(lat2) * Math.sin(lng - lng1)
lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + bx) * (Math.cos(lat1) + bx) + Math.pow(by, 2)));
lon3 = lng1 + Math.atan2(by, Math.cos(lat1) + bx);
return [Math.round(Math.degrees(lat3), 5), Math.round(Math.degrees(lon3), 5)]
}
我认为这就是您正在寻找的公式:
这是两点之间沿大圆路径的中点。
Formula: Bx = cos φ2 ⋅ cos Δλ
By = cos φ2 ⋅ sin Δλ
φm = atan2( sin φ1 + sin φ2, √(cos φ1 + Bx)² + By² )
λm = λ1 + atan2(By, cos(φ1)+Bx)
JavaScript:
(all angles
in radians)
var Bx = Math.cos(φ2) * Math.cos(λ2-λ1);
var By = Math.cos(φ2) * Math.sin(λ2-λ1);
var φ3 = Math.atan2(Math.sin(φ1) + Math.sin(φ2),
Math.sqrt( (Math.cos(φ1)+Bx)*(Math.cos(φ1)+Bx) + By*By ) );
var λ3 = λ1 + Math.atan2(By, Math.cos(φ1) + Bx);
我可能遗漏了一些东西,但这些都是角度,所以我的答案:-
var Midpnt = "lat:" + toString((P1.lat+P2.lat)/2) + ";lat:"+toString((P1.lng+P2.lng)/2);