Criar diagrama voronoi a partir de segmentos de linha

14

Estou procurando uma maneira de criar um diagrama de voronoi com base em segmentos de linha em vez de pontos. Veja o exemplo abaixo (extraído desta apresentação ).

Idealmente, eu gostaria de algo que eu possa escrever em Python, mas uma solução usando ArcGIS ou similar também seria aceitável.

diagrama voronoi a partir de segmentos de linha

A única biblioteca para fazer isso que encontrei até agora é o openvoronoi , que parece promissor. Existem outros?

Snorfalorpagus
fonte
1
Provavelmente, isso ajudará: gis.stackexchange.com/questions/53414/…
Dan C
Obrigado. Não sei por que essa pergunta não apareceu nas minhas pesquisas.
Snorfalorpagus

Respostas:

5

Nós (uma equipe da universidade) projetamos uma implementação para isso usando um complemento ArcGIS 10.0 e ArcObjects. O aplicativo é totalmente gratuito. A implementação usa uma metodologia raster que usa como pontos de entrada, linhas ou polígonos para criar diagramas de Voronoi comuns ou com pesos múltiplos (ou uma combinação dos itens acima, ou seja, você pode usar um de cada tipo de forma, criando um único diagrama definido de até três classes de recursos distintos). Ele ainda está em desenvolvimento, mas deve ser bastante estável, especialmente se você quiser apenas criar linhas. O complemento requer a licença do Spatial Analyst para operar. O código em si é de código aberto, portanto, sinta-se livre para fazer o que quiser.

https://github.com/UNTGeography/VoronoiDiagramsGIS

Ele usa um método semelhante ao da "Alocação Euclidiana" descrita na resposta do @ radouxju e usa o raster Flow Flow / Basin para criar polígonos vetoriais a partir do raster resultante.

Conor
fonte
Parte importante para os interessados: github.com/UNTGeography/VoronoiDiagramsGIS/blob/master/…
Sancarn
3

Voronoï é inicialmente projetado para ganhar pontos. Aqui estão os dois métodos que posso imaginar para o seu problema (citando ferramentas do ArcGIS, mas provavelmente possíveis com formas bem torneadas):

1)

a) criar pontos ao longo das linhas (por exemplo, densificar e apresentar vértices para a linha)

b) criar polígonos de Thiessen

c) dissolva os polígonos de Thiessen com base nas linhas que eles cruzam

2)

a) com o analista espacial, calcule a alocação euclidiana para as linhas

b) converta cada zona em um polígono

radouxju
fonte
3

Para alguns clientes, eu e alguns colegas de trabalho estamos trabalhando na criação de duas ferramentas de geoprocessamento que fazem isso. Embora as ferramentas de geoprocessamento não estejam disponíveis ao público, o python e o C # que usamos são:

Tanto o C # quanto o wrapper python realmente contam com a API C ++ Boost Voronoi: http://www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm

Observe que a API consome muita memória. Isso não é um problema se você estiver usando Geoprocessamento para 64 bits, ArcGIS Pro ou QGIS. Essa é uma limitação se você estiver no ArcGIS Desktop, pois possui 32 bits. (Uma rede rodoviária detalhada de 40.000 linhas ou mais deve ser suficiente para atingir o limite de memória)

Fabien Ancelin
fonte
1
Eu, na verdade criou uma ferramenta de geoprocessamento para ArcMap e ArcGIS Pro que se baseia na biblioteca pyvoronoi: github.com/fabanc/Boost-Voronoi-For-ArcGIS
Fabien Ancelin
2

ET Geowizards (um plugin para Arc) tem uma ferramenta para isso que aceita Polylines (veja a captura de tela abaixo). Infelizmente, você precisará do produto licenciado para executar a ferramenta, mas acho que deve funcionar.

insira a descrição da imagem aqui

MAJ742
fonte
0

Além disso, mais uma maneira de resolver sua tarefa usando o PostgreSQL / PostGIS.

Se as linhas forem curtas e simples, execute o script:

WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (SELECT (ST_DumpPoints(geom)).geom geom FROM tbla
        UNION
        SELECT ST_Centroid(geom) geom FROM tbla),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;

Veja o resultado.

Se as linhas forem longas, execute o script:

WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (WITH btbl AS (SELECT (ST_Dump(geom)).geom geom FROM tbla),
intervals AS (SELECT generate_series (0, 9) as steps)
SELECT steps AS stp, ST_LineInterpolatePoint(geom, steps/(SELECT count(steps)::float-1 FROM intervals)) geom FROM btbl, intervals GROUP BY intervals.steps, geom),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;

Veja o resultado.

Se necessário, compacte o número de pontos nas linhas; no meu exemplo, este é o ponto 10.

Soluções originais.

Este script é chamado: ST_VoronoiDiagramsFromLines.

Cyril M
fonte
Ainda não executei isso, mas parece que ele cria os polígonos de voroni usando os vértices das geometrias e os funde (com uma união) se eles tocarem nas geometrias originais. Isso está correto? Nesse caso, é uma aproximação aceitável, desde que suas geometrias originais tenham muitos vértices e sem segmentos longos sem nenhum.
Snorfalorpagus 22/01
Testado por: PostgreSQL 11.1, PostGIS 2.5 USE_GEOS = 1 USE_PROJ = 1 USE_STATS = 1 ...
Cyril M