首先,让我们明确表示我想要地球表面上的方位角,即两个位置之间的角度,例如纽约和莫斯科。
我正在使用我的JS函数测试一些方位角计算(如下所示)。对于A点(-170,-89)到B点(10,89),我得到~90º。
球体上的方位角的JS函数(来自维基百科)
var dLon = lon2 - lon1;
var y = Math.sin(dLon) * Math.cos(lat2);
var x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);
var angle = Math.atan2(y, x) * 180 / Math.PI;
Azimuth对扁圆球体的JS函数(来自维基百科)
var dLon = lon2 - lon1;
var f = 1 / 298.257223563; /* Flattening for WGS 84 */
var b = (1 - f) * (1 - f);
var tanLat2 = Math.tan(lat2);
var y = Math.sin(dLon);
var x;
if (lat1 === 0) {
var x = b * tanLat2;
} else {
var a = f * (2 - f);
var tanLat1 = Math.tan(lat1);
var c = 1 + b * tanLat2 * tanLat2;
var d = 1 + b * tanLat1 * tanLat1;
var t = b * Math.tan(lat2) / Math.tan(lat1) + a * Math.sqrt(c / d);
var x = (t - Math.cos(dLon)) * Math.sin(lat1);
}
var angle = Math.atan2(y, x) * 180 / Math.PI;
在Calculator 2中,我得到90º。
在PostGIS中,我得到270º
在Calculator 1中,我得到180º。
我知道方位角在波兰人附近变得越来越扭曲,但这正是我在这些地方测试的原因。各种不同的解决方案令我困惑。能帮我解决这个问题吗?
答案 0 :(得分:2)
取决于用于方位角的参考,例如map-types使用0°表示北,正表示顺时针,而数学类型使用0°表示东方,正表示逆时针方向。
坐标对A(-170,-89)和B(10,89)是antipodes,这是查找最小距离和方位角的特殊情况。你的问题可以通过思考来回答。
首先请注意地球的半圆是:
对于北极和南极的一对对映,有无限多个方位角,因为每个经度的距离是相同的。 (你从南极到北极的方向是什么?)
对于赤道上的一对对映,最短的距离是北或南,因为它沿着经向方向略短。
对于任何其他对对象,它与赤道相同:北方或南方。
使用PostGIS SQL查询进一步研究问题:
SELECT ST_Distance(A, B), degrees(ST_Azimuth(A, B))
FROM (
SELECT 'POINT(-170 -89)'::geography A, 'POINT(10 89)'::geography B
) f;
使用PostGIS 2.0和2.1时,错误的结果是:
st_distance | degrees
-----------------+------------------
20003900.583699 | 270.005278779849
但是使用PostGIS 2.2(和PROJ 4.9.1),现在的结果是正确的:
st_distance | degrees
------------------+---------
20003931.4586255 | 180