【问题标题】:PostGIS: Filtering multipolygon by BoundaryPostGIS:按边界过滤多面体
【发布时间】:2014-08-26 05:53:34
【问题描述】:

我的 PostgreSQL 数据库(9.3 版)中有一个包含 geom 列的表,其中包含一个多面体。然后我有一个线对象,它建立了一个边界。我正在尝试使用边界对象内的所有几何对象构建视图。

我尝试了函数 ST_Within(不能处理多面体)和 ST_Intersects...

这是我的 SQL 命令:

CREATE VIEW buildings_intersect_boundary AS
SELECT ROW_NUMBER() OVER (ORDER BY "buildings".gid ASC) AS ROW_NUMBER,
      "buildings".name,"buildings".type,
      "buildings".geom
FROM   "buildings" INNER JOIN "boundary" ON 
      ST_Intersects("buildings".geom,"boundary".geom)

目前我通过使用边界框来解决问题:

CREATE VIEW osm_buildings_intersect_project_boundary AS
SELECT  ROW_NUMBER() OVER (ORDER BY "buildings_fromOSMShape".gid ASC) AS ROW_NUMBER,
       "buildings_fromOSMShape".name,"buildings_fromOSMShape".type,
       "buildings_fromOSMShape".geom
FROM   "buildings_fromOSMShape" INNER JOIN "boundary_project_area" ON 
       "buildings_fromOSMShape".geom @ "boundary_project_area".geom

但这会返回太多对象...

操作系统:Ubuntu 14.04

【问题讨论】:

    标签: postgresql postgis intersection polygons


    【解决方案1】:

    您是否正在寻找 ST_Contains,它类似于 ST_Intersects,但不包括未完全包含的几何图形 - 您说您想要其他对象中的对象。 ST_Within 为您提供与其他人相距一定距离内的几何图形,而不是在他们内部。

    CREATE VIEW osm_buildings_intersect_project_boundary AS 
      SELECT  ROW_NUMBER() OVER (ORDER BY buildings.gid ASC) AS ROW_NUMBER,
         buildings.name, buildings.type, buildings.geom
      FROM  "buildings_fromOSMShape" buildings, "boundary_project_area" boundaries  
          WHERE ST_Contains(boundaries.geom, buildings.geom)
    

    就个人而言,我更喜欢以这种方式编写 ST_Contains 和 ST_Intersects 查询,因为我认为当连接键实际上是空间条件而不是等式约束时,它比使用内部连接更清晰,尽管查询将执行相同的操作。出于可读性/简洁的目的,我还为您的表名起了别名。请注意,对于 ST_Contains,几何顺序很重要,而 ST_Intersects 则不重要。

    【讨论】:

    • 嘿,约翰,谢谢您的回答。我试过了,数据无法显示。不幸的是,我认为您的查询对我没有帮助。官方文档说,不支持几何集合(postgis.refractions.net/documentation/manual-1.4/…)......还有其他建议吗?
    • 啊,你有几何集合。是的,与他们一起工作很痛苦。你只有多边形和多多边形还是你也有线和点?
    • 我认为只有多边形,但不幸的是我不能排除还有其他一些几何形状......
    • 您之前说过我的方法行不通,因为不支持 GeometryCollections 而现在您只是说您只有多边形。一旦我们清楚您的数据是什么样子,就有处理这些事情的方法。您能否编辑您的问题以包含几何图形的示例以及您对查询的期望。
    • 抱歉这么晚才回复。不幸的是它太久以前了,所以我不能说......我没有我的数据,因为我的旧笔记本电脑坏了:-/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2012-12-15
    • 2012-11-13
    • 2014-03-10
    • 1970-01-01
    相关资源
    最近更新 更多