Teóricamente es posible obtener los polígonos de bloques de ciudades ( bloques urbanos) de las calles, cuando las calles están representadas por el eje de la calle ( LineStrings ).
Los bloques urbanos están delimitados por calles, por lo que los segmentos de calles se pueden usar para formar un polígono que contiene solo una cuadra dentro ... Ver ilustraciones.
Hay un script (SQL) PostGIS 2.X para hacer esto? ¿Un software de complemento?
PD: las geometrías aproximadas de bloques de ciudades son suficientes.
Ilustrando
Comenzando el proceso desde una "malla de segmentos de línea conectados", puede ser: 1) obtener polígonos asociados; 2) aislar los polígonos mediante tampón negativo y restar el tampón de las líneas.
Ejemplo: el polígono 262 (que representa una manzana) se originó en los segmentos 2496, 2494, 2369, 1513, ... Y el polígono vecino 263 puede usar algunos segmentos comunes, pero a continuación (por st_buffer negativo u otra operación) será polígonos realmente aislados, por lo tanto, baja precisión es suficiente.
(EDITAR)
Creo que podemos traducir este problema específico en uno más genérico: el conjunto de segmentos de calles puede verse como una especie de teselación , es decir, los segmentos separan el plano en regiones contiguas : los bloques urbanos se encuentran en el interior de estos regiones. Cada segmento es un lado de dos regiones.
El principal problema es transformar el "conjunto de segmentos de la teselación" en polígonos independientes .
fuente
Respuestas:
El
ST_Polygonize
agregado en PostGIS devolverá un quegeometry_dump
contiene todos los polígonos posibles formados por un conjunto de líneas. Supongo que las ID de bloque que se muestran en su ejemplo no están relacionadas con las ID del trabajo de línea de entrada. Si este es el caso, puede obtener sus polígonos e ID con:La parte lenta aquí es la
ST_Union
. Parece que esto debería funcionar sin esa llamada, siempre que las líneas de entrada estén correctamente anudadas, pero no he tenido éxito al hacerlo.Un búfer negativo no dará los resultados exactos que se muestran en su ejemplo, porque el proceso de poligonalización ignorará las calles sin salida. Pero puede tomar un búfer positivo del trabajo de línea original y usarlo
ST_Difference
para eliminar esa área de los polígonos de bloque.fuente