赤道上的方位角与非赤道上的方位角是否相等?

3

我希望能够全面地理解方位角的概念,但是我遇到了一些不一致的情况(或者可能是我的错误)。

我会展示一些不匹配的例子,希望有人能够解释这个真正的工作原理。

我会展示在EPSG:900913、PostGIS和使用自己的JavaScript函数中的坐标。

我的函数

/* Difference between the two longitudes */
var dLon = lon2 - lon1;
/* Y value */
var y = Math.sin(dLon) * Math.cos(lat2);
/* X value */
var x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);
/* Calculates the azimuth between the two points and converts it to degrees */
var angle = Math.atan2(y, x) / Math.PI * 180;

例子

/* Same Y, not on the equator */
Point A: (-81328.998084106, 7474929.8690234)
Point B: (4125765.0381464, 7474929.8690234)
Result in PostGIS: 90 degrees
Result in my JS function: 74.232 degrees

/* Same Y, on the equator */
Point A: (-81328.998084106, 0)
Point B: (4125765.0381464, 0)
Result in PostGIS: 90 degrees
Result in my JS function: 90 degrees

我理解,在赤道上,水平线的方位角为90度(或270度)。我认为,如果你在赤道稍微向北(或南)画一条水平线,那么方位角就不再是90度了。但是...PostGIS告诉我,当Y相同时,它始终是90度。
此外,这个计算器也显示,当Y!=0(不在赤道上)时,水平线的方位角不是90度。
这是如何正确的呢?
谢谢。

可能是重复的问题:如何在PostGIS中计算两点之间的方位角? - Peter O.
这个问题似乎不属于编程范畴(尽管它使用了编程)。请参阅帮助中心的我可以在这里提什么样的问题。也许地理信息系统 Stack Exchange更适合您的提问。 - jww
@jww,谢谢。我知道GIS.StackExchange更好。我两个都试过了,但是这里的回答更好。因此,非常感谢回答的人! :) 我以后会更加小心。 - joaorodr84
@joaorodr84 - 太棒了,很高兴你得到了一个好答案。(请不要把关闭问题当作个人攻击。我自己也曾经关闭过我的问题(我真的几年前问过那个问题吗?))。 - jww
没问题,@jww。 :) 我不会把它当成个人攻击。你是完全正确的。 ;) - joaorodr84
1个回答

2
在你的例子中,你使用了EPSG:900913,这是平面投影且单位为米。这意味着使用的公式将是atan2,当纬度相同时,它将始终为90,因为公式为:
方位角 = atan2(y1-y2, x1-x2)
第二部分将始终为0,导致方位角为90。因此,使用平面坐标,是的,具有相同纬度的坐标对的方位角将始终相同,这就是为什么在使用EPSG:900913时Postgis始终给出相同答案的原因。
如果切换到地理数据类型,因此使用大地坐标,则不再是这种情况。
例如:
select degrees(   
  st_azimuth(
   st_makepoint(0, 10)::geography, 
   st_makepoint(90, 10)::geography));

在Postgis中给出的是80.1318065,而你提供的计算器页面上给出的是80.139。
随着x/经度越来越接近,对于给定的纬度,这些值越接近90。例如,
select degrees(   
  st_azimuth(
   st_makepoint(0, 10)::geography, 
   st_makepoint(1, 10)::geography));

现在在Postgis中显示为89.9131737,在在线计算器中为89.333(略有差异)。
所有这些都是因为该公式现在考虑了曲率,因此两个具有相同纬度的向量的投影之间的角度将不再是90,除了赤道以外。
请查看Wikipedia方位角文章中椭球体版本的公式。将其编码成JavaScript应该很容易,并且应该与使用地理类型的Postgis给出可比较的答案。

嗨@JohnBarça。我之前使用PostGIS的方法不对。谢谢你。正如你所看到的,我已经在使用维基百科上的函数,稍作修改。或者你是指第二个函数 - joaorodr84
我指的是第二个,它考虑了扁球体,从http://upload.wikimedia.org/math/7/6/e/76e90f1c786b852709ce30d9504cb19a.png开始。如果您使用它,您应该可以更接近在Postgis中使用地理信息时得到的值。 - John Powell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接