本文介绍了为什么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返回非多边形?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!