我试图完全理解方位角的概念,但我遇到了一些不一致的问题(或许这是我的错误)。
我向您展示了一些不匹配的例子,希望有人能解释我这是如何运作的。
我在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度。
怎么回事?
由于
答案 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提供类似的地理类型的答案。