Найдите соседние полигоны с максимум 3 другими полигонами

У меня есть случай как на следующей картинке

// gbr

Скажем, у меня 9 многоугольников, и я хочу получить многоугольник, который является максимальным соседом с тремя другими многоугольниками, такими как многоугольники 1, 3, 7, 9 (желтый).

Я думаю, что это делается с помощью ST_Touches в postgis, но я просто придумал представить это в коде 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

Итак, как я могу с этим покончить?


person Herlambang Permadi    schedule 02.06.2021    source источник


Ответы (1)


Ваша подсказка с ST_Touches верна, однако, чтобы получить количество соседних ячеек из одного столбца, связанных с другими записями в той же таблице, вам нужно либо запустить подзапрос, либо дважды вызвать таблицу в предложении FROM.

Учитывая следующую сетку на таблице с именем tb ..

введите описание изображения здесь

.. вы можете отфильтровать ячейки с тремя или менее соседними ячейками следующим образом:

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

введите описание изображения здесь

Если вы хотите также перечислить соседние ячейки, вы можете сначала присоединиться к ячейкам, которые касаются в предложении WHERE и в подзапросе или _ 6_ подсчитайте результаты:

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

Дальнейшее чтение:

person Jim Jones    schedule 03.06.2021
comment
Большое спасибо за ваше четкое объяснение! ваше здоровье! - person Herlambang Permadi; 04.06.2021