赤道上的方位角是否等于赤道上的方位角?

时间:2014-08-27 14:01:47

标签: javascript postgis azimuth geodesic-sphere

我试图完全理解方位角的概念,但我遇到了一些不一致的问题(或许这是我的错误)。

我向您展示了一些不匹配的例子,希望有人能解释我这是如何运作的。

我在PostGIS中使用我自己的JavaScript函数显示EPSG中的坐标:900913。

我的功能

/* 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度。

此外,这个calculator还表明,当Y!= 0(不在赤道上)时,水平线的方位角不是90度。

怎么回事?

由于

1 个答案:

答案 0 :(得分:2)

在您的示例中,您使用的是EPSG:900913,它是平面的,投影的并且以米为单位。这意味着所使用的公式将是atan2,当纬度相同时,它将始终为90,公式为:

azimuth = atan2(y1-y2, x1-x2)

并且第二部分将始终为0,方位角为90.因此,使用平面坐标,是的,对于具有相同纬度的坐标对,方位角将始终相同,这就是为什么Postgis总是给出相同的答案使用EPS时:900913。

如果切换到地理数据类型,因此使用测地坐标,则不再是这种情况。

例如:

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 azimuth文章中关于椭球体版本的等式。这应该很容易用JavaScript编写代码,并且应该给Postgis提供类似的地理类型的答案。