Я должен создать растворенные буферы из многоточечных входных функций. В приведенном ниже примере входная таблица содержит 4 функции. Особенность #2
состоит из двух точечных геометрий. После создания буфера я получаю 4 геометрии полигона:
Есть ли способ сгруппировать результат? Буферы точек #1
и #2
распущены, и должны представлять собой одну многоугольную особенность ( a
).
Что я сделал до сих пор:
-- collect all buffers to a single multi-polygon feature
-- dissolve overlapping polygon geometries
CREATE TABLE public.pg_multibuffer AS SELECT
row_number() over() AS gid,
sub_qry.*
FROM (SELECT
ST_Union(ST_Buffer(geom, 1000, 8))::geometry(MultiPolygon, /*SRID*/) AS geom
FROM
public.multipoints)
AS sub_qry;
РЕДАКТИРОВАТЬ:
-- create sample geometries
CREATE TABLE public.multipoints (
gid serial NOT NULL,
geom geometry(MultiPoint, 31256),
CONSTRAINT multipoints_pkey PRIMARY KEY (gid)
);
CREATE INDEX sidx_multipoints_geom
ON public.multipoints
USING gist
(geom);
INSERT INTO public.multipoints (gid, geom) VALUES
(1, ST_SetSRID(ST_GeomFromText('MultiPoint(12370 361685)'), 31256)),
(2, ST_SetSRID(ST_GeomFromText('MultiPoint(13520 360880, 19325 364350)'), 31256)),
(3, ST_SetSRID(ST_GeomFromText('MultiPoint(11785 367775)'), 31256)),
(4, ST_SetSRID(ST_GeomFromText('MultiPoint(19525 356305)'), 31256));
Ответы:
Начиная с некоторых случайных точек, в стремлении имитировать те, что на изображении ОП, где первые два пространственно пересекаются, затем вторые и третьи имеют одинаковый атрибут id (2) с парой других точек, которые пространственно не пересекаются и не имеют тот же атрибут, следующий запрос производит 3 кластера:
Здесь есть несколько шагов:
ST_Union
, группировать по идентификатору, для первой группы по атрибутуST_ClusterIntersecting
для объединения тех же групп, которые пересекаются в пространствеДовольно долго, но это работает (и, я уверен, есть более короткий путь).
Использование инструмента WKT в QGIS (и обнаружение того, насколько я ужасен с инструментами редактирования) создает кластеры, подобные следующему, где вы можете видеть кластер, помеченный вами как a, - все вместе - то есть один цвет.
Если вы поместите ST_AsText вокруг финала, ST_UNION (d.geom), то вы сможете увидеть результаты напрямую.
РЕДАКТИРУЙТЕ, следуя дополнительной информации в комментариях: Поскольку вы начинаете с точек, вам нужно будет включить буфер в мое исходное решение, которое я поместил в временный CTE в начале, чтобы имитировать вашу диаграмму. Было бы проще добавить буфер в союзы CTE, чтобы вы могли выполнять все геометрические операции одновременно. Таким образом, используя в качестве примера буферное расстояние 1000, следующий код теперь возвращает 3 кластера, как и ожидалось.
источник
ST_SetSRID
,ST_Multi
и::geometry(Multipolygon, /*SRID*/)
, но на данный момент он не работает.Один из способов сделать это -
ST_Union
объединить все буферы,ST_Dump
чтобы получить компоненты полученного многоугольника и соединиться сST_Intersects
входными точками, чтобы выяснить, сколько / какие точки составляют каждый кластер.Это можно сделать без необходимости объединения, сгруппировав точки перед вызовом
ST_Buffer
. Чтобы две точки находились в одном и том же растворенном буфере, они должны быть достижимы прыжками между точками на расстоянии меньше, чемeps
. Это просто проблема кластеризации с минимальной связью, которая может быть решена с помощьюST_ClusterDBSCAN
:Обратите внимание, что это не даст точно такой же результат, как и метод с первым буфером, потому что буферы PostGIS не являются идеальными кругами, и две точки на расстоянии 1000 м друг от друга могут не соединяться двумя буферами по 500 м.
источник
Согласно этому ответу вы хотите сделать ST_DUMP в вашем подзапросе.
Что-то вроде этого:
Причина в том, что это
ST_UNION
возвращает растворенный мультиполигон всех объектов иST_DUMP
разбивает его на отдельные объекты полигона (которые были распущены).источник
ST_Multi((ST_Dump(ST_Union(ST_Buffer(geom, 1000, 8)))).geom)::geometry(MultiPolygon, /*SRID*/) AS geom
, но это создает 4 функции вместо 3.GROUP_BY
до васST_UNION
.