Eu tenho uma tabela de ruas que selecionei com base em um conjunto de atributos (digamos que seja speed_limit < 25
). Existem grupos de ruas localmente contíguas; Gostaria de agrupar esses conjuntos de cadeias de linhas conectadas em GeometryCollections. Na imagem abaixo, haveria duas GeometryCollections: uma com as linhas vermelhas e outra com as linhas azuis.
Tentei executar algumas consultas "dissolver, desagregar" ao longo das linhas de:
SELECT (ST_Dump(st_union)).geom
FROM
(SELECT ST_Union(geom) FROM roads) sq
Com tudo o que tentei, acabei com um único recurso ( ST_Union
) ou minha geometria original ( ST_Dump
de ST_Union
).
Talvez seja possível fazer isso com algum tipo de WITH RECURSIVE
mágica?
Respostas:
Então, por exemplo. Aqui está uma tabela simples com dois grupos de arestas conectados:
Agora, aqui está uma função recursiva que, dada a identificação de uma aresta, acumula todas as arestas que tocam:
Isso nos deixa precisando encontrar, após a acumulação de cada grupo, o id de uma borda que ainda não faz parte de um grupo. O que, tragicamente, requer uma segunda consulta recursiva.
Juntos, eles retornam um bom conjunto com o ID da semente e cada grupo que ela acumulou. Deixo como um exercício para o leitor transformar as matrizes de id novamente em uma consulta para criar geometria para mapeamento.
fonte
grouplist
matriz:insert into lines (id, geom) values ( 15, 'LINESTRING(0 0, 10 10)');
. A alteraçãoarray_agg(id)
no retorno da função paraarray_agg(DISTINCT id)
parece resolver o problema.Aqui está uma abordagem que usa uma tabela temporária para agregar incrementalmente clusters. Eu realmente não me importo com a abordagem de tabela temporária, mas isso parece ter um desempenho muito bom à medida que o número de linhas aumenta (eu tenho 1,2 M linhas na minha entrada).
fonte
ST_ClusterIntersecting
função no PostGIS. Se seus dados forem pequenos o suficiente para caber na memória, sugiro que verifique se há uma solução com melhor desempenho.