【问题标题】:ST_Contains. Find all road that are within the scopeST_包含。查找范围内的所有道路
【发布时间】:2016-05-15 02:02:06
【问题描述】:

我正在尝试查找范围内的所有道路。

这是我的要求:

select osm_id, 
name,
from planet_osm_roads 
where ST_Contains(ST_GeomFromEWKT('SRID=900913;POLYGON((4355764.028 6715445.513, 4364401.418 6715674.192, 4364248.577 6708736.416, 4354808.572 6709155.795, 4355764.028 6715445.513))'), way)
LIMIT 100;

或者那个:

select osm_id, 
name,
from planet_osm_roads 
where ST_Contains(ST_GeomFromText('LINESTRING(4355764.028 6715445.513, 4364401.418 6715674.192, 4364248.577 6708736.416, 4354808.572 6709155.795, 4355764.028 6715445.513)', 900913), way)
LIMIT 100;

我在本地数据库上做所有事情,需要的数据都有。

多边形这样的:

查询结果为空。 告诉我出了什么问题。谢谢。

【问题讨论】:

  • 您的数据在哪个 SRID 中?您的查询中似乎使用了 900913
  • ST_SRID(way) 在查询中返回 900913
  • 第一个创建多边形的例子是正确的。 LineStrings 只包含精确在线上的点,因为根据定义,它们没有面积。

标签: postgresql openstreetmap postgis


【解决方案1】:

ST_Contains 可能不适合这份工作

ST_Contains — 当且仅当 B 的点不位于 A 的外部,并且 B 的内部至少有一个点位于 A的内部。

由于这些是道路,因此至少其中的某些部分会位于您的多边形之外。这意味着 ST_Contains 将返回 false。也许ST_Intersects 可能是更好的选择。

【讨论】:

  • 结果是“ST_Intersects”,但在我看来,我选择了错误的多边形点。我已经更新了图片,数字显示了多边形点。我的多边形如 1-2-3-4-1。也许我错了,我形成了一个多边形?
  • 对不起,我不太明白那条评论
  • 我认为错误是为了指定多边形的点。我按以下顺序指出它们:1-2-3-4-1。不会错吧?
  • 它需要一个封闭的多边形,因此您传递坐标的方式似乎是正确的
  • ST_Intersects 祝你好运
【解决方案2】:

错误出现在空间参考中。 这是一个有效的请求:

select osm_id, name,  
ST_AsText(ST_Transform(way,4326)) from planet_osm_roads 
where ST_Contains(ST_Transform(ST_GeomFromText('POLYGON((39.128494  51.716394, 39.206085 51.71767, 39.204712 51.678942, 39.119911 51.681284, 39.128494 51.716394))',4326),900913), way)  
LIMIT 120;

ST_Transform — 返回一个新几何,其坐标转换为整数参数引用的 SRID。

【讨论】:

    猜你喜欢
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多