У меня есть таблица улиц, которую я выбрал на основе набора атрибутов (скажем, так speed_limit < 25
). Есть группы улиц, которые являются местными смежными; Я хотел бы сгруппировать эти наборы связанных строк в GeometryCollections. На изображении ниже будет две GeometryCollections: одна с красными линиями и одна с синими линиями.
Я попытался выполнить несколько запросов «распустить, дезагрегировать» по следующим направлениям:
SELECT (ST_Dump(st_union)).geom
FROM
(SELECT ST_Union(geom) FROM roads) sq
Со всем, что я пробовал, я либо получаю одну особенность ( ST_Union
) или мою исходную геометрию ( ST_Dump
из ST_Union
).
Может быть, это можно сделать с помощью какой-то WITH RECURSIVE
магии?
Ответы:
Итак, к примеру. Вот простая таблица с двумя связными группами ребер:
Теперь, вот рекурсивная функция, которая, учитывая идентификатор ребра, накапливает все ребра, которые касаются:
Это просто заставляет нас искать после накопления каждой группы идентификатор ребра, которое еще не является частью группы. Что, к сожалению, требует второго рекурсивного запроса.
Которые вместе взятые, возвращают хороший набор с идентификатором семени и каждой группой, которую он накопил. Я оставляю это в качестве упражнения для читателя, чтобы превратить массивы идентификаторов обратно в запрос, чтобы создать геометрию для отображения.
источник
grouplist
массиве:insert into lines (id, geom) values ( 15, 'LINESTRING(0 0, 10 10)');
. Изменениеarray_agg(id)
в функции возврата к,array_agg(DISTINCT id)
кажется, решает проблему.Вот подход, который использует временную таблицу для постепенного агрегирования кластеров. Мне не очень важен подход к временным таблицам, но, похоже, он работает достаточно хорошо, так как количество строк увеличивается (у меня на входе 1,2 миллиона строк).
источник
ST_ClusterIntersecting
функцию в PostGIS. Если ваши данные достаточно малы, чтобы поместиться в памяти, я бы посоветовал проверить это для более производительного решения.