PostGIS:在涉及MultiPolygon的查询中识别匹配的多边形

时间:2018-10-06 22:17:36

标签: postgis geojson

假设一个表的地理位置列myGeoColumn包含MultiPolygon,如下所示:

MULTIPOLYGON( ((-99 56,-52 18,-88 -27,-99 56))),((-77 56, 90 30, 92 36, -77 56)) )') 

如果我发出这样的查询:

SELECT * from myTable where ST_Intersection(myGeoColumn, ST_GeomFromText('POINT (-77 56)') is not null

然后查询成功,我返回了该行-但我也返回了整个MultiPolygon。我无法确定匹配哪个多边形。

如何增强查询以仅返回MultiPolygon内部的实际匹配多边形(在上面的示例中,多边形#2)?我认为,如果该列包含GeometryCollection,则会出现相同的问题。

1 个答案:

答案 0 :(得分:1)

您需要在执行st_intersection之前分解多面体。

with polygon 
   as(select (st_dump(geom)).geom geom from mytable
      )    
select ST_Intersection(geom, ST_GeomFromText('POINT (-77 56)') from polygon

您还与一个点和多边形相交...因此,您永远都不应像提供的查询一样返回整个多多边形。这就是您的整个查询吗?

更新了我认为你想要的东西

with polygon 
   as(select (st_dump(geom)).geom geom from mytable
      )    
select geom from polygon where st_intersects(geom, ST_GeomFromText('POINT (-77 56)')

更新2

根据您的评论,这可能是另一种方式

with 
  polygon_inter as(select (ST_Dump(geom)).geom geom 
                     from mytable 
                     where ST_Intersects(geom,ST_GeomFromText('POINT (-77 56)')
  )
select geom from polygon_inter 
 where ST_Intersects(geom,ST_GeomFromText('POINT (-77 56)')

第一个CTE将仅选择并分解与该点相交的多面体(这消除了将所有多面体分解的优化恐惧),然后在cte之后的选择将仅选择与该点相交的INDIVIDUAL多边形