7 votos

¿Disolver o desdoblar líneas en atributos comunes en PostGIS o GRASS?

Tengo un shapefile de la línea central de la carretera que tiene carreteras divididas en cada intersección. Sin embargo, me gustaría unir LINESTRINGs que tienen un conjunto común de atributos en un solo LINESTRING. Mientras el nombre, el límite de velocidad, etc., no cambien, quiero unirlos. Esto es para la eventual confluencia en OpenStreetMap.

El software ArcGIS Desktop de Esri parece permitirlo con el comando Dissolve y la opción UNSPLIT_LINES.

También encontré un comando de Disolución en QGIS pero parece que sólo funciona en polígonos y campos individuales.

Suponiendo que no existe nada para QGIS, ¿alguien sabe cómo hacerlo en PostGIS o GRASS?

5voto

warsze Puntos 178

Una pregunta interesante. No me considero un gurú de PostGIS, pero he jugado con tu problema y he dado con la siguiente consulta que disuelve la carretera LINESTRING registros en MULTILINESTRING registros cuando tienen valores comunes en varios campos (en mi conjunto de datos, coincidí con el name y state campos). Utilicé OGR para introducir un archivo shape de carreteras (renombrado como ushwys) en PostgreSQL; así que mi campo de geometría se llama wkb_geometry . Intente modificar esta consulta para adaptarla a sus datos y condiciones de campo:

SELECT 
u.name, 
u.state, 
ST_AsText( ST_Multi( ST_Collect( u.wkb_geometry ) ) ) as multilines 
FROM ushwys u
GROUP BY u.name, u.state 
ORDER BY u.state 
LIMIT 100; --########### DROP THE LIMIT WHEN YOU'RE DONE EXPERIMENTING

Si esto funciona, puedes utilizar ogr2ogr para realizar esta consulta y exportar los resultados a cualquier formato vectorial que prefieras, como shapefile, GML, CSV o cualquier otro. Para obtener información sobre cómo llamar a las consultas SQL desde ogr2ogr, echa un vistazo a la página OGR SQL documentación.

Como referencia, he revisado el PostGIS ST_Collect de la instrucción, así como de este sitio que demuestra la agrupación en múltiples campos.

Si encuentras que las redacciones de esta consulta no te sirven, por favor házmelo saber y tacharé mi respuesta para que no se quede por ahí y confunda a la gente.


Si no estás familiarizado con el uso de ogr2ogr para introducir geodatos en PostGIS, he utilizado el siguiente script ogr2ogr para realizar mi importación de datos ( cuidado con copiar de la web y pegar directamente en la ventana de comandos de ogr2ogr, ya que he descubierto que el formato de la página introduce saltos de línea y sustituciones de fuentes/caracteres para las comillas dobles que rompen el script de ogr ):

ogr2ogr -f "PostGreSQL" PG:"host=127.0.0.1 user=postgres dbname=gisdb password=my_password" 
"E:\GISData\UnitedStates\highways.shp" -nln ushwys -nlt geometry

Quería ver cómo se "veía" esto en QGIS después de ejecutar esa consulta, así que modifiqué la consulta para aplicar esto WHERE cláusula (que me da todas las variantes de la US Highway 65 en el estado de Missouri):

where u.state = 'MO' and u.name LIKE '%US%65%'

A continuación, utilicé QGIS y el plugin QuickWKT para visualizar las ocho (8) carreteras resultantes MULTILINESTRING registros. Como se puede ver en la captura de pantalla, los resultados finales llevan a la autopista 65 desde la frontera norte de Missoui con Iowa hasta su frontera sur con Arkansas:

enter image description here

Para mí, esta visualización demuestra que mi consulta no produjo ninguna duplicación o eliminación inesperada de características. A continuación me pregunté: "De acuerdo, la disolución devolvió ocho características, pero ¿cuántas características de la tabla original representan realmente la autopista 65 en Missouri?". Mi siguiente consulta respondió a esta pregunta. Parece que el conjunto de datos original utiliza treinta y ocho (38) características para representar la carretera 65 en Missouri:

SELECT count(*) FROM ushwys WHERE state = 'MO' AND name LIKE '%US%65%';
-- returned 38

En el análisis final, la consulta redujo treinta y ocho (38) características a ocho (8) características que compartían valores en los campos de nombre y estado. En este punto, estoy relativamente seguro de que esta consulta es útil y adecuada para disolver geometrías de una sola parte en geometrías de varias partes cuando la tarea de disolución debe tener en cuenta varios campos.

3voto

tobes Puntos 19

En PostGIS, existe una función dedicada a la fusión de líneas

ST_LineMerge - Devuelve un (conjunto de) LineString(s) formado por la costura de un MULTILINETRING.

http://www.postgis.org/docs/ST_LineMerge.html

1voto

En el SIG de GRASS, eche un vistazo a v.construir.polilíneas

v.build.polylines puede utilizarse para reconstruir polilíneas rotas

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X