我有一个基于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”功能的实现方式?
答案 0 :(得分:3)
首先回答你的第二个问题,基本上有两种类型的方位角计算,即在平面坐标上完成的,以及在球体或椭球体上完成的那些,就像地理数据类型一样。 wikipedia azimuth文章很好地解释了这一点。
在第一种情况下,计算非常简单,基本上只是两对点之间的atan
。您可以在github in the method azimuth_pt_pt
上看到源代码。
对于第二种情况,计算有点复杂,在球体上,您可以在github in the method 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 。一个是在平面上进行点对点方位角,而另一个是按照它们的函数名称进行球体方位角。