假设一个表的地理位置列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
,则会出现相同的问题。
答案 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多边形