我有一个PostGIS地理点,我想在理想球体(不是球体)上旋转一个设定的距离。我看到了ST_Project()函数,但它似乎旋转了球体上的点。例如,如果我向北旋转(0,10)1度,则结果略大于1度

select ST_AsText(ST_Project(ST_Point(0,10), 111194.68229846345*1,radians(0.0)));

   st_astext
---------------------------
 POINT(0 11.0052750273178)
(1 row)

按相同距离旋转(0,60)得到的结果略小于1度。
POINT(0 60.9979713953998)

我也可以用球体计算点之间的距离
select ST_Distance(ST_Project(ST_Point(60,89.9)::geography, 111194.68229846345*1,radians(0.0)),ST_Point(60,89.9),'t');
    st_distance
------------------
 111194.682298475
(1 row)

完美的球体
select ST_Distance(ST_Project(ST_Point(60,89.9)::geography, 111194.68229846345*1,radians(0.0)),ST_Point(60,89.9),'f');
   st_distance
-----------------
 110698.09475313
(1 row)

所以不是我把地球的周长弄错了。
对于许多操作地理对象的函数,例如ST_DWithin,有一个使用球体或完美球体的选项。我看不到ST_Project的选项。
一般来说,我的方位角是0、90、180和270的一个,它必须在极点周围正常工作。

最佳答案

您只需要创建一个新的空间投影,其中球体的半主轴和半主轴是相同的。对于半径为6370986 m的球体,这里有一个新的SRID=123456:

INSERT INTO spatial_ref_sys(srid, auth_name, srtext, proj4text)
VALUES (123456, NULL, '', '+proj=longlat +a=6370986 +b=6370986 +ellps=sphere +no_defs ');

对于geography类型,默认SRID=4326用于WGS84椭球体。要使用新的球体椭球体,需要将SRID设置为非默认值。
SELECT ST_AsText(ST_Project(ST_SetSRID(ST_Point(0,10), 123456), 111194.68229846345, 0.0));

  st_astext
-------------
 POINT(0 11)
(1 row)

关于postgresql - 在完美领域上相当于PostGIS的ST_Project,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45777223/

10-13 00:47