Como transformar um conjunto de segmentos de rua em quarteirões, com o PostGIS2?

8

Teoricamente, é possível obter polígonos de quarteirões ( quarteirões urbanos) das ruas, quando as ruas são representadas pelo eixo das ruas ( LineStrings ).

Os quarteirões urbanos são delimitados por ruas, de modo que os segmentos de ruas podem ser usados ​​para formar um polígono que contém apenas um quarteirão dentro ... Veja ilustrações.

Existe um script (SQL) PostGIS 2.X para fazer isso? Um software de plug-in?
PS: geometrias aproximadas de quarteirões da cidade são suficientes.

Ilustrando

Iniciando o processo a partir de uma "malha de segmentos de linha conectados", pode ser: 1) obter polígonos associados; 2) isolar polígonos por tampão negativo e subtração de tampão das linhas.

insira a descrição da imagem aqui

Exemplo: o polígono 262 (representando um bloco da cidade) foi originado pelos segmentos 2496, 2494, 2369, 1513, ... E o polígono vizinho 263 pode usar alguns segmentos comuns, mas o próximo (por st_buffer negativo ou outra operação) será polígonos realmente isolados, portanto, baixa precisão é suficiente.


(EDITAR)

Acho que podemos traduzir esse problema específico em um problema mais genérico: o conjunto de segmentos de ruas pode ser visto como uma espécie de mosaico , ou seja, os segmentos separam o avião em regiões contíguas - os blocos urbanos estão no interior desses regiões. Cada segmento é um lado de duas regiões.

O principal problema é transformar o "conjunto de segmentos do mosaico" em polígonos independentes .

Peter Krauss
fonte
Talvez, com o novo módulo de topologia postgis, o limite da rua possa ser agrupado para formar esse polígono (área fechada).
Cavila
Como você proporia obter o bloco? A rua é (conceitualmente) uma cadeia de linhas, enquanto cada bloco é um polígono. Como você localizaria um único quarteirão urbano com uma cadeia de linhas, na presença de servidões, parques, reservas naturais, blocos de machados de batalha (por exemplo: anewhouse.com.au/2012/07/battleaxe-block ), blocos onde existe um rio / riacho / ridgeline entre as ruas, etc?
BradHards
Obrigado @Cavila, eu estava procurando por exemplos e encontrei alguns como este , algo que eu preciso, mas: todos começam com polígonos, não com "segmentos de mosaico" (veja minha generalização do problema). Minha entrada é um conjunto de segmentos.
Peter Krauss
@ BradHards, obrigado pela sua revisão (!), Editei para mostrar o foco do meu problema. Sim, existem muitas exceções, como um bloco de machado de batalha; e sim, preciso adicionar segmentos de rios, ferrovias etc. para um "mosaico completo". Eu preciso apenas da "primeira aproximação" dos blocos, não de uma construção completa e automatizada deles.
precisa
Eu acho que ele está disposto a obter o bloco ou setor com base no limite da rua. Nem um único lote urbano para uma única propriedade. Uma solução poderia ser a nova amostra de um caminhante que plota um símbolo no ponto de partida e começa a andar virando à direita até voltar ao ponto de partida onde plotou o símbolo. Então você terá um polígono ou limite fechado.
Cavila

Respostas:

7

O ST_Polygonizeagregado no PostGIS retornará um geometry_dumpcontendo todos os polígonos possíveis formados por um conjunto de linhas. Estou assumindo que os IDs de bloco mostrados no seu exemplo não estão relacionados aos IDs do trabalho de linha de entrada. Se for esse o caso, você pode obter seus polígonos e IDs com:

SELECT (st_dump).path[1] as poly_id, (st_dump).geom FROM
    (SELECT ST_Dump(ST_Polygonize(geom)) FROM 
        (SELECT ST_Union(geom) as geom FROM lines) mergedlines) polys

A parte lenta aqui é a ST_Union. Parece que isso deve funcionar sem essa chamada, desde que as linhas de entrada sejam adequadamente acenadas, mas não obtive sucesso.

Um buffer negativo não fornecerá os resultados exatos mostrados no seu exemplo, porque as ruas sem saída serão ignoradas pelo processo de poligonização. Mas você pode usar um buffer positivo do trabalho de linha original e usá-lo ST_Differencepara remover essa área dos polígonos do bloco.

dbaston
fonte