为什么 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)。
我有两个多边形图层。我想在它们上面 运行 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
:
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)。