本文介绍了为什么st_cross返回非多边形?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个多边形层。我想对它们运行st_cross,以将它们重叠的区域作为新的层给出结果。新层应包含两个输入层的属性。我找到了这张图片,它似乎说明了我想要的最终结果。

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

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根据相对拓扑返回几种几何图形类型。

例如,对两个相邻的多边形运行ST_intersect将返回共享边界的公共部分。

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

从视觉上看,您可以通过左侧的相应图标将它们区分开来:

但是,您可以选择所需的几何图形类型,例如,使用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;

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

您可能已经注意到,诀窍在于ST_Dimension("clipped"."geom") = 2

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

这篇关于为什么st_cross返回非多边形?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 09:11