postgresql - 等同于完美球体上的 PostGIS ST_Project

标签 postgresql postgis

我有一个 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/

相关文章:

sql - Postgres : convert array of elements to multiple rows

ruby-on-rails - 在 Heroku 上使用 texticle 与 postgresql 全文搜索进行部分匹配

postgresql - PostGIS 2.0 安装问题

postgresql - 无法连接到 PostGIS 数据库

java - 使用 JDBC 在 PostgreSQL 中插入点(几何)值

sql - 错误 : GEOSIntersects: TopologyException: side location conflict

Postgresql:按 CompanyID 和 CustomerID 删除重复记录

javascript - 同步执行 Sequelize 查询

Django - 类型字符变化的值太长(但似乎在 max_length 限制内)

postgresql - 搜索表中任何记录的 X 距离内的所有记录