如何在PostGIS中计算两点之间的方位角



我有一个基于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"函数的实现方式吗?

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

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

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

2不同的原因是您使用的地理数据类型应在[-180180],[-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。一种是在平面上进行点对点方位角,而另一种是按照函数名称的建议进行球体方位角。

最新更新