查找最多 3 个其他多边形的相邻多边形

Find neighboring polygons with maximum of 3 other polygons

我有一个案例如下图

假设我有 9 个多边形,并且想要得到一个与其他 3 个多边形最大相邻的多边形,例如多边形 1, 3, 7, 9(黄色)

我认为这是在 postgis 中使用 ST_Touches 完成的,但我只是想出了在 postgis 代码中表示它,例如

select a.poly_name, b.poly_name from tb a, tb b where ST_Touches(a.geom, b.geom)

然后说我想这样输出:

 poly_name      poly_name
     1               2
     1               4
     1               5

那么我是如何想到完成这个的呢?

您对 ST_Touches 的提示是正确的,但是要从与同一 table 中的其他记录相关的一列中获取相邻单元格的数量,您需要 运行 一个子查询或者在 FROM 子句中调用 table 两次。

在名为 tb 的 table 上给出以下网格 ..

..您可以像这样过滤具有三个或更少相邻单元格的单元格:

SELECT * FROM tb q1
WHERE (
  SELECT count(*) FROM tb q2
  WHERE ST_Touches(q2.geom,q1.geom)) <=3;

如果您还想列出哪些相邻单元格,您可能想首先加入在 WHERE 子句和子查询中接触的单元格或 CTE 计算结果:

WITH j AS (
  SELECT 
    q1.poly_name AS p1,q2.poly_name p2, 
    COUNT(*) OVER (PARTITION BY q1.poly_name) AS qt
  FROM tb q1, tb q2
  WHERE ST_Touches(q2.geom,q1.geom))
SELECT * FROM j
WHERE qt <= 3;

演示:db<>fiddle

延伸阅读: