0

我有一个基于 OpenLayers 的 GIS API。我一直在尝试在 JavaScript 中实现方位角计算,我需要一些方法来计算方位角以执行测试。

我开始使用 PostGIS,但似乎有很多方法可以计算两点之间的方位角。我向您展示了其中的三个,其中一些返回了不同的结果。

-- Example 1 - Result 90

SELECT ST_Azimuth(
   ST_Transform(st_geomfromtext('POINT(-81328.998084106 7474929.8690234)', 900913), 4326),
   ST_Transform(st_geomfromtext('POINT(4125765.0381464 7474929.8690234)', 900913), 4326)
)/pi()*180

-- Example 2 - Result 155.692090425822
SELECT degrees(
   ST_Azimuth(
   ST_MakePoint(-81328.998084106, 7474929.8690234)::geography,
   ST_MakePoint(4125765.0381464, 7474929.8690234)::geography)
)

-- Example 3 - Result 90

SELECT degrees(
   ST_Azimuth(
   ST_MakePoint(-81328.998084106, 7474929.8690234),
   ST_MakePoint(4125765.0381464, 7474929.8690234))
)

在 PostGIS 中计算方位角的正确方法是什么?当然,我想考虑测地坐标。

有没有办法知道 PostGIS 如何实现计算?我的意思是,是否可以看到“ST_Azimuth”功能的实现方式?

4

1 回答 1

3

首先回答你的第二个问题,基本上有两种方位角计算,一种是在平面坐标上完成的,另一种是在球体或椭球体上完成的,就像地理数据类型一样。维基百科方位角文章很好地解释了这一点。

在第一种情况下,计算非常简单,基本上只是atan两对点之间的计算。方法中可以看到github上azimuth_pt_pt的源码。

对于第二种情况,计算稍微复杂一些,在一个球体上,你可以在github 的方法中spheroid_direction再次找到实际的计算。

原因 2 不同是因为您使用的地理数据类型应该在 [-180,180],[-90,90] 范围内。实际上,我很惊讶它没有给出错误。

示例 1 和示例 3 基本相同,因为您只是从一个坐标参考系切换到另一个坐标参考系,因此点的相对方向没有变化。

没有正确的方法可以做到这一点,但是如果您想使用geodetic coordinates,请使用geography datatype.

请注意,两者之间存在差异:

select degrees(
   st_azimuth(
       st_makepoint(0, 0)::geography, 
       st_makepoint(45, 45)::geography)
);

产生35.4100589051161

尽管,

select degrees(
    st_azimuth(
       st_setsrid(st_makepoint(0, 0),4326),
       st_setsrid(st_makepoint(45, 45),4326))
);

产量45 . 一个是在平面上做点对点方位角,而另一个是做椭球方位角,正如它们的函数名称所暗示的那样。

于 2014-08-27T13:26:33.803 回答