这些方位角值中哪一个是正确的?为什么
Which one of these azimuth values is the right one? And why?
首先,让我们明确一点,我想要地球表面的方位角,即两个位置之间的角度,例如纽约和莫斯科。
我正在用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;
椭球上方位角的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;
在计算器2中,我得到90º。
在PostGIS中,我得到了270º
在计算器1中,我得到180º。
我知道方位角在波兰附近变得越来越扭曲,但这正是我在这些地方测试的原因。各种不同的解决方案让我很困惑。你能帮我找到正确的答案吗?
这取决于用于方位角的参考,例如,地图类型使用0°表示北方,正数为顺时针,而数学类型使用0度表示东方,正数为逆时针。
坐标对A(-170,-89)和B(10,89)是对极,这是寻找最小距离和方位角的特殊情况。你的问题可以通过思考练习来回答。
首先要注意的是,地球的半周是:
- 赤道:20037.5085公里
- 子午线(从北到南):20003.93公里
对于北极和南极上的一对对对极,有无限多的方位角,因为沿着每个经度的距离是相同的。(从南极到北极你往哪个方向走?)
对于赤道上的一对对对极,最短的距离是北或南,因为它沿经向方向略短。
对于其他任何一对对对极,答案与赤道相同:北或南。
更新
使用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
相关文章:
- iPad虚拟键盘-哪一个-javasctript解决方案
- 哪一个是Angular2/Typescript for Windows的最佳IDE
- 哪一个在访问数组长度方面的性能更好
- Angular 2 + 打字稿或 Angular 2 + Javascript 建议使用哪一个
- 当使用promise时,为什么最后一个会被调用
- 为什么只有一个数字项的数组可以用一些算术运算
- 阻止表单提交 javascript 为什么有一个明显的错误语句返回 true
- 我如何比较一组数字,找出哪一个更接近生成的数字
- 这些选择器中哪一个更快
- 在一个随机生成图像的PHP脚本中,为什么在一个页面上多次调用它总是生成相同的图像
- 这些事件处理程序中的哪一个应该在窗口关闭时触发自定义函数
- jQuery icheck 回调 - 单击了哪一个
- 为什么有一个 HTMLAudioElement 和一个单独的 Audio 类
- 使用 apply() 与 call(),在这种情况下使用哪一个
- 现代化与仅为CSS中的前缀提供回退.哪一个,为什么
- 这些方位角值中哪一个是正确的?为什么
- 性能方面,算法复杂性方面,下面两个JS函数中哪一个用于将字符串的第一个字母大写更好,为什么?
- 两个令人困惑的陈述,使用哪一个以及为什么
- 这两个类中哪一个需要更多的内存,为什么?
- 这些原型声明中哪一个更好,为什么?