Eu tenho que criar buffers dissolvidos a partir de recursos de entrada multiponto. No exemplo abaixo, a tabela de entrada contém 4 recursos. O recurso #2
consiste em duas geometrias de pontos. Depois de criar um buffer, recebo 4 geometrias de polígono:
Existe uma maneira de agrupar o resultado? Os buffers dos pontos #1
e #2
são dissolvidos, e deverá ser uma única característica multi-polígono ( a
).
O que eu fiz até agora:
-- 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;
EDITAR:
-- 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));
Respostas:
Começando com alguns pontos aleatórios, em uma tentativa de imitar aqueles na imagem do OP, onde os dois primeiros se cruzam espacialmente, o segundo e o terceiro têm o mesmo atributo id (2), com alguns outros pontos que não se cruzam nem têm o mesmo atributo, a seguinte consulta produz 3 clusters:
Existem várias etapas aqui:
ST_Union
, agrupando por ID, para agrupar primeiro por atributoST_ClusterIntersecting
para combinar aqueles do mesmo grupo que se cruzam espacialmenteBastante longo, mas funciona (e, tenho certeza, há um caminho mais curto).
O uso da ferramenta WKT no QGIS (e a descoberta do quão péssimo sou com as ferramentas de edição) produz agrupamentos como os seguintes, onde você pode ver o agrupamento rotulado como a, todos juntos - ou seja, uma cor.
Se você colocar um ST_AsText na final, ST_UNION (d.geom), poderá ver os resultados diretamente.
EDITE seguindo mais informações nos comentários: Como você está começando com os pontos, precisará incorporar o buffer na minha solução original - que eu coloquei no temp CTE no início para imitar seu diagrama. Seria mais fácil adicionar o buffer nos uniões CTE, para que você possa fazer todas as geometrias de uma só vez. Portanto, usando uma distância do buffer de 1000, como exemplo, o seguinte agora retorna 3 clusters, conforme o esperado.
fonte
ST_SetSRID
,ST_Multi
e::geometry(Multipolygon, /*SRID*/)
, mas no momento não está funcionando.Uma maneira de fazer isso é
ST_Union
reunir todos os buffers,ST_Dump
o resultado para obter os componentes do polígono resultante e juntarST_Intersects
-se aos pontos de entrada para descobrir quantos / quais pontos compunham cada cluster.Isso pode ser feito sem a necessidade de uma junção, agrupando os pontos antes da chamada
ST_Buffer
. Para que dois pontos sejam localizados no mesmo buffer dissolvido, eles devem ser alcançados por saltos entre pontos com uma distância menor queeps
. Este é apenas um problema de agrupamento de ligação mínima, que pode ser resolvido usandoST_ClusterDBSCAN
:Observe que isso não produzirá exatamente o mesmo resultado que o método buffer-first, porque os buffers PostGIS não são círculos perfeitos e dois pontos a 1000m de distância podem não estar conectados por dois buffers de 500m.
fonte
De acordo com esta resposta, você deseja executar ST_DUMP em sua subconsulta.
Algo assim:
A razão disso é que
ST_UNION
retorna um multipolígono dissolvido de todos os recursos eST_DUMP
divide isso nos recursos poligonais individuais (que foram dissolvidos).fonte
ST_Multi((ST_Dump(ST_Union(ST_Buffer(geom, 1000, 8)))).geom)::geometry(MultiPolygon, /*SRID*/) AS geom
, mas isso cria 4 recursos em vez de 3. #GROUP_BY
antes de vocêST_UNION
.