为什么 st_intersection return 不是多边形?

Why does st_intersection return non-polygons?

我有两个多边形图层。我想在它们上面 运行 st_intersection ,将它们重叠的区域作为一个新层给出结果。新层应包含两个输入层的属性。我发现这张图片似乎说明了我想要的最终结果。

我的两个输入层都是多边形:

SELECT      st_geometrytype(geom),
            COUNT(*)
FROM        a
GROUP BY    st_geometrytype(geom)
-- Result is 1368 st_polygons

SELECT      st_geometrytype(geom),
            COUNT(*)
FROM        b
GROUP BY    st_geometrytype(geom)
-- Result is 539548 st_polygons

我运行的查询如下:

SELECT      a.*,
            b.*,
            st_intersection(a.geom, b.geom) as geom
FROM        a,b
WHERE       st_intersects(a.geom, b.geom)

然而,在结果中我得到的不仅仅是多边形(如我所料),还有线、点、多面体和几何集合。我猜是因为我的一些输入多边形共享点但不是真正的交点?

感谢您提供有关如何处理此问题、我的查询是否正确、我可以做些什么来提高性能等方面的建议。谢谢。

ST_intersect returns 几种几何类型,取决于相关拓扑。

例如,运行宁 ST_intersect 在两个相邻多边形上 returns 共享边界的公共部分。

虽然它输出单个 table(例如,您可以在 pgadmin 中验证),但在 QGIS 的浏览器样本中,它将显示为多个 table 不同几何类型(例如:POLYGON、MULTIPOLY、LINE 和 POINT)但(有点令人困惑)具有相同的名称。

在视觉上,您可以通过观察左侧的伴随图标来区分它们:

但是您可以 select 您想要哪种类型的几何图形,例如通过使用 ST_Dimension:

添加 WHERE 过滤器
SELECT      a.*,
            b.*,
            st_intersection(a.geom, b.geom) as geom
FROM        a,b
WHERE       st_intersects(a.geom, b.geom) 
            AND ST_Dimension(st_intersects(a.geom, b.geom)) = 2;

或者,为了性能起见,以类似于以下的方式重写它:

SELECT clipped.* 
FROM (
         SELECT a.id, b."fieldName",
             (ST_Dump(ST_Intersection(a.geom, b.geom))).geom AS geom
         FROM "public"."table_A_name" AS a INNER JOIN "public"."table_B_name" AS b   
         ON ST_Intersects(a.geom, b.geom)
     ) AS clipped
WHERE ST_Dimension("clipped"."geom") = 2;

后一种解决方案创建了一个匿名临时 table,它只允许 ST_Intersection 到 运行 一次。

您可能已经注意到技巧就在 ST_Dimension("clipped"."geom") = 2

ST_Dimensions 过滤来自 ST_Intersection 的输出,以便仅保留多边形(拓扑维度为 2)。