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.
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 .
fonte
Respostas:
O
ST_Polygonize
agregado no PostGIS retornará umgeometry_dump
contendo 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: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_Difference
para remover essa área dos polígonos do bloco.fonte