Disolver polígonos en QGIS (GEOS) con tolerancia

11

Tengo una capa de vector poligonal que representa el área inundada en una inundación. La capa ha sido producida de tal manera que algunas de las áreas están compuestas de múltiples polígonos conmovedores más pequeños (vea la captura de pantalla a continuación, etiquetada como "datos originales").

Me gustaría disolver los polígonos donde se tocan. Si uso la herramienta de geoprocesamiento disolver en fTools de QGIS, que usa la biblioteca GEOS, obtengo algunos resultados inesperados (consulte "disolver con fTools QGIS"). Parece que GEOS no usa un umbral para determinar si los polígonos se tocan, como se menciona en estos temas:

http://trac.osgeo.org/qgis/ticket/3126

http://trac.osgeo.org/qgis/ticket/3184

http://hub.qgis.org/issues/2806

El mismo enfoque en ArcGIS da el resultado esperado (ver "disolver con ArcGIS 10.1").

Aparentemente, esta es una "característica" de GEOS, en lugar de un error. ¿Hay alguna forma de arreglar los datos que tengo para producir el resultado esperado? Una pequeña pérdida de precisión (¿unos pocos cm?) Podría ser aceptable para mí. Idealmente, la solución sería algo que pudiera escribir en un complemento QGIS, como un paso de preprocesamiento.

Pregunta relacionada (sin respuestas): ¿Cómo establecer el valor de tolerancia de la herramienta de geoprocesamiento en QGIS?

Enlace a datos de muestra como un archivo de forma: https://www.dropbox.com/s/c8ns7wwfv289ad0/sample.zip

disolver polígonos v.dissolve

Snorfalorpagus
fuente
Una solución alternativa sería primero crecer y luego reducir el polígono disuelto fTools (amortiguando primero con un amortiguador positivo y luego con un amortiguador negativo).
Jake
Intenté esto, pero terminé con otros problemas (por ejemplo, i.stack.imgur.com/LnFJy.png ). Aquí, el área azul se crea cuando guardo / disuelvo / neg-buffer, donde no debería estar. Esto no es mucho mejor que el problema original. No puedo ver cómo puedo recuperar la esquina "afilada" original.
Snorfalorpagus

Respuestas:

14

En este caso, parece que necesita ayudar a la herramienta de disolución al arreglar primero la topología. Así es como puedes hacer esto en GRASS.

Cuando carga el archivo de forma, así es como GRASS lo ve:

Cada cruz marca un área. Puede ver que hay algunas cruces en las líneas de límite: estos son los polígonos de astilla causados ​​por el ligero desplazamiento entre las líneas de límite.

  1. Elimine los polígonos de astilla formados por los espacios entre los polígonos reales:

    v.clean input=sample output=tempA --o tool=rmarea thresh=0.001
  2. Ajusta las líneas de límite:

    v.clean input=tempA output=tempB --o tool=snap thresh=0.001
  3. Rompe las líneas de límite en las nuevas intersecciones:

    v.clean input=tempB output=tempA --o tool=break thresh=0.001
  4. Elimine las líneas de límite ahora duplicadas:

    v.clean input=tempA output=tempB --o tool=rmdupl thresh=0.001
  5. Disuelve los polígonos.

    v.dissolve input=tempB output=cleaned --o column=ID

Et voilà:

Jake
fuente
Gracias @Jake. Esta es una respuesta muy clara. Desafortunadamente, cuando trato de aplicar el proceso a todo mi conjunto de datos (cubriendo 2500km2), recibo un error de la herramienta de ajuste "ERROR: G_realloc: incapaz de asignar 144720024 bytes de memoria en snap.c: 186". Creo que voy a tener que dividirlo en trozos más pequeños. Sin embargo, eso debería estar bien, ya que lo estoy dividiendo en cuadrados de 0.25 km2 para acelerar las intersecciones / indexación espacial (este es el campo "ID" en los datos de muestra).
Snorfalorpagus
7

Use el comando GRASS GIS v.dissolve (en el complemento Sextante -> Comandos GRASS -> Vector)

Si reproduzco rápidamente tu ejemplo: ingrese la descripción de la imagen aquí

El resultado con v.dissolve:

ingrese la descripción de la imagen aquí

Explicación

El problema es fácil de entender. Un archivo de forma no tiene topología, si dos áreas comparten un borde común, ese borde se digitalizaría dos veces y también se almacenaría por duplicado.

Usted ve esto claramente cuando intenta editar el archivo de forma:

ingrese la descripción de la imagen aquí

GRASS GIS (como ArcGIS) es un GIS topológico. Cuando importa el archivo de forma en GRASS, la capa resultante tiene una topología: el borde común entre dos áreas existe una vez y se comparte.

ingrese la descripción de la imagen aquí

Por esta razón, cuando desee disolver un archivo de forma ( disolver dos límites ) puede encontrar problemas (en QGIS, GvSIG, OpenJUMP o el antiguo ArcView 3.x), consulte ArcUserI: Descripción de la topología y los archivos de forma .

En GRASS, v.dissolve está diseñado para disolver límites comunes entre áreas con el mismo número de categoría.

gene
fuente
1
Supongo que este es un problema numérico, y me pregunto si su buena copia de la geometría del OP capturaría las mismas propiedades numéricas.
Chau
@Chau: v.dissolvetiene un parámetro de tolerancia, que aborda el problema del OP.
Jake
Ese detalle debe incorporarse en la respuesta anterior, gracias por aclarar :)
Chau
Agregué un enlace a los datos originales como un archivo de forma en la pregunta. Cuando lo uso v.dissolveparece funcionar, excepto que "llena" el pequeño cuadrado en el medio de las características. i.stack.imgur.com/AA59l.png
Snorfalorpagus
1
Propongo una explicación
gen