【问题标题】:ST_intersects geographyST_intersects 地理
【发布时间】:2017-10-09 10:42:59
【问题描述】:

我想弄清楚一些事情,我在 postgres 9.6 上使用 postgis 2.3

Geography 上的

ST_intersects 返回 false,尽管两个地理位置相交。 为了调试,我使用 Geometry 尝试了相同的查询,并且两者相交。

谁能帮我解释一下?

例子:

我正在运行这个查询:

select ST_intersects(ST_GeogFromText('POLYGON((12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890))'), ST_GeogFromText('POLYGON((-170 -47,174 -47,174 77,-170 77,-170 -47))'))  from table limit 1;

我明白了:

 st_intersects 
---------------
 f
(1 row)

当我跑步时:

 select ST_intersects(ST_GeomFromText('POLYGON((12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890))'), ST_GeomFromText('POLYGON((-170 -47,174 -47,174 77,-170 77,-170 -47))')) from  table limit 1;

我明白了:

 st_intersects
 ---------------
  t
 (1 row)

【问题讨论】:

  • 1.检查您的问题 - 这两个查询之间的区别只是 ';'在最后。 2.两者都没有地理...
  • 谢谢,我更新了第一个查询,区别是使用ST_GeogFromText 还是ST_GeomFromText

标签: postgis


【解决方案1】:

ST_Intersects -- returns True if Geometries/Geography spatially intersect in 2D。如果您从 POLYGON(在您的情况下为 5 个顶点)转换为 LINESTRING,您的查询应该返回相同的结果。测试:

SELECT 
 ST_Intersects(
 ST_GeomFromText('SRID=4326;LINESTRING(12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890)'), 
 ST_GeomFromText('SRID=4326;LINESTRING(-170 -47,174 -47,174 77,-170 77,-170 -47)'));


SELECT 
 ST_Intersects(
 ST_GeogFromText('SRID=4326; LINESTRING(12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890)'), 
 ST_GeogFromText('SRID=4326; LINESTRING(-170 -47,174 -47,174 77,-170 77,-170 -47)'));

更新::

实际上,使用PolygonST_Intersects 来说就很好了。我意识到 Linestring 不是您想要的——返回 false 因为一个完全在另一个内部。问题是这两个多边形在球坐标系中相距很远。检查:

SELECT 
 ST_Distance(
 ST_GeomFromText('SRID=4326;POLYGON((12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890))'), 
 ST_GeomFromText('SRID=4326;POLYGON((-170 -47,174 -47,174 77,-170 77,-170 -47))'));

==> 0

SELECT 
 ST_Distance(
 ST_GeogFromText('SRID=4326;POLYGON((12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890))'), 
 ST_GeogFromText('SRID=4326;POLYGON((-170 -47,174 -47,174 77,-170 77,-170 -47))'));

==> 6743507.32

您当然可以将geography 转换为geometry 输入如下以获得所需的输出:

SELECT 
 ST_Intersects(
 ST_GeogFromText('SRID=4326;POLYGON((12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890))')::geometry, 
 ST_GeogFromText('SRID=4326;POLYGON((-170 -47,174 -47,174 77,-170 77,-170 -47))')::geometry);

【讨论】:

  • 谢谢,没看懂你的回答,是不是说明POLYGON不是2d?
  • 同样,两个查询都返回 false
  • @GuyDoulberg 我的错。 POLYGON 确实是二维的,因为每个 virtex 有 2 个坐标——我将顶点与维度混淆了。我已经更新了我的答案。
  • 谢谢@Krishna,这样的选角有什么意义?我失去了什么吗?
  • @GuyDoulberg 简短的回答是,这并不重要,尤其是。对于小多边形。 workshops.boundlessgeo.com/postgis-intro/geography.html 第 18.3 和 18.4 节的长答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多