【问题标题】:Equivalent of PostGIS' ST_Project on the perfect sphere等效于完美球体上的 PostGIS 的 ST_Project
【发布时间】:2017-08-19 23:43:04
【问题描述】:

我有一个 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 之一,并且它必须在极点周围正常工作。

【问题讨论】:

    标签: postgresql postgis


    【解决方案1】:

    您只需要创建一个新的空间投影,其中椭球体的半长轴和半短轴是相同的。所以对于一个半径为 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2016-07-03
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多