是否基于PostGIS / PostGresQL中的最大重叠量进行联接?


11

我在两个表中有两组多边形。这些集合彼此重叠。对于集合A中的每个多边形,我想获取集合B中重叠最多的多边形的ID。我正在使用带有PostGIS扩展名的PostgreSQL。

我对SQL足够了解,因此只能基于对/错条件进行联接。所以这行不通:

SELECT
  a.id as a_id,
  b.id as b_id,
FROM
  a
JOIN
  b
ON
  max(ST_Area(ST_Intersection(a.geom, b.geom)))

因为max()不能在ON子句中。

ST_Intersects()是对/错测试,因此我可以参加,但是集合A中的多边形通常会与集合B中的多个多边形重叠,因此我需要知道哪个重叠最多。无论重叠的程度如何,ST_Intersects大概只会返回遇到的第一个重叠ID。

这似乎应该可行,但这超出了我。有什么想法吗?

Answers:


13

您可以使用类似:

SELECT DISTINCT ON (a.id)
  a.id as a_id,
  b.id as b_id,
  ST_Area(ST_Intersection(a.geom, b.geom)) as intersect_area
FROM a, b
ORDER BY a.id, ST_Area(ST_Intersection(a.geom, b.geom)) DESC

它:

1)为每对(a,b)对记录计算ST_Area(ST_Intersection(a.geom,b.geom))。

2)当a.id相等时,按a.id和intersect_area对其排序。

3)在每个相等a.id的组中,它选择firs记录(由于在步骤2上的排序,第一条记录具有最高的intersect_area)。


那很巧妙地解决了问题。谢谢谢谢!DISTINCT ON对我来说是新手-在这种情况下非常方便。
休·斯汀森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.