我有一个 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 米的球体,这里有一个新的 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/