Simplificando polígonos adyacentes usando la herramienta QGIS Simplify Geometries

10

Tengo un gran Shapefile con 200,000 polígonos, pero el archivo es demasiado grande para la aplicación que lo usará. Me gustaría generalizar estos polígonos y crear un archivo mucho más pequeño.

He intentado hacer esto en QGIS usando la herramienta "Simplificar geometrías". He intentado esto en una porción muy pequeña de mi Shapefile y estoy contento con los resultados, pero tengo un pequeño problema que no sé cómo resolver. He adjuntado la imagen para mostrar el problema.

Los límites BLANCOS son límites antes de la simplificación. Los límites rojos son después de la simplificación. Las áreas problemáticas están rodeadas de color naranja. Como puede ver, los "límites simplificados" contienen algunas áreas que después de la simplificación no pertenecen a ninguno de los polígonos anteriores.

¿Cómo simplifico este Shapefile y mantengo límites comunes entre polígonos como una sola línea y elimino las áreas que se han creado después de la simplificación?

Polígonos Simplificados en QGIS

INFORMACIÓN ADICIONAL:

Después de seguir las instrucciones sugeridas

  1. Convertir polígonos en líneas
  2. Simplifica líneas
  3. Convertir líneas de nuevo a polígonos

Obtengo los siguientes resultados. Es un poco mejor que antes, pero aún obtengo áreas fuera de los polígonos originales (ver áreas blancas en la imagen a continuación).

@ Andrew sugirió que asocie cada línea con un polígono adyacente, pero no sé cómo hacerlo en QGIS.

ingrese la descripción de la imagen aquí

Todavía estoy tratando de completar el proceso de simplificación de polígonos. He seguido las instrucciones sugeridas en esta publicación y cuando pensé que obtuve resultados aceptables apareció un problema más. A continuación se muestra el resumen de lo que hice con imágenes de resultados. Todos los pasos se han realizado utilizando la caja de herramientas PROCESAMIENTO en QGIS.

  1. Primero, convertí polígonos en líneas
  2. En segundo lugar, limpié las líneas usando la opción v.clean with break. Esto resultó en CAPA DE VECTOR LIMPIO y CAPA DE ERROR. La capa de error (puntos verdes en la imagen proporcionada) tiene un punto verde en cada intersección de línea. No sé lo que ésto significa.
  3. En tercer lugar, simplifiqué las líneas con la herramienta "SIMPLIFICAR GEOMETRÍA" (el resultado son líneas rojas en las imágenes). Comparando líneas rojas simplificadas y líneas naranjas originales, estoy contento con el resultado.
  4. Cuarto, quería convertir las líneas nuevamente en polígonos usando la herramienta "Poligonalizar" en "PROCESAMIENTO" y obtuve resultados que no esperaba (segunda imagen con un polígono sombreado de color oliva oscuro). Parece que el polígono conectó intersecciones de capa de error y creó un conjunto completamente diferente de polígonos que ignora las líneas simplificadas.

¿Alguien podría explicar qué salió mal aquí?

¿Por qué las líneas rojas simplificadas no se convirtieron correctamente en polígonos simplificados?

Como puede ver, no soy un experto en SIG, pero necesito hacerlo yo mismo. No sé si estoy demasiado lejos de la solución, pero es frustrante que pueda ver líneas simplificadas que encontré aceptables para lo que me gustaría hacer, pero no puedo convertirlas en polígonos.

Aquí hay dos imágenes con resultados de los últimos dos pasos del proceso:

Líneas Simplificadas y Líneas Originales

Resultados de líneas simplificadas Plygonized

David
fuente
@nhopton En la página web de Polygonizer plugins.qgis.org/plugins/Polygonizer dice que "Crea polígonos a partir de líneas de intersección". Esto sugiere que se crearán polígonos siempre que haya una intersección de línea (pero tal vez mi interpretación sea incorrecta). Lo que necesito es deshacerme de esos huecos que se crearon al usar la herramienta "simplificar geometrías" y si Polygonizer puede hacerlo, estaría muy contento.
David
Pensando en ello, su capa de polígono original debería simplificarse sin problemas. Si no está haciendo esto, creo que probablemente significa que tienes polígonos incorrectos en los datos originales. Polígonos que se superponen ligeramente o que tienen pequeños espacios entre ellos. Intente ampliar las áreas problemáticas para ver si puede encontrar algo como esto. N.
nhopton
Una buena manera de preservar la topología consiste en el flujo de trabajo sugerido por @radouxju (excepto el cálculo del centroide que no es necesario) y representado en el modelo de Procesamiento en mi respuesta. Alternativamente, creo que GRASS v.generalizees otra gran opción. Espero que esto ayude.
Antonio Falciano
Pregunta relacionada: gis.stackexchange.com/questions/20799/…
simon04

Respuestas:

7

Obtuve un resultado bastante bueno usando GRASS v.generalize de Processing Toolbox usando los valores predeterminados:

ingrese la descripción de la imagen aquí

Algunas líneas permanecen intactas.

AndreJ
fuente
Tuve un buen éxito con este método después de establecer la tolerancia de ajuste v.in.ogr de -1 (sin ajuste) a 0.00001 como lo sugiere @Kantan.
cm1
4

Me metí en ese problema con Qgis2.16, pero no pude hacer que GRASS diera un resultado topológicamente correcto como @AndreJ.

Una buena solución es cambiar la tolerancia de ajuste v.in.ogr en los parámetros avanzados de la herramienta v.generalize.simplify . El valor predeterminado es -1, lo que evita el ajuste en GRASS.

Al poner un valor pequeño aquí (como 1e-05 m), se habilita el ajuste y GRASS reconoce los bordes compartidos de los polígonos. La simplificación proporciona una capa topológicamente correcta, sin agujeros.

Nota: Al establecer la tolerancia de ajuste a valores más altos, incluso es posible alterar los polígonos para que se puedan eliminar los muy delgados si lo desea. Siga esa operación con v.clean usando rmarea y un umbral lo suficientemente grande como para eliminar las sobras pequeñas, ¡y listo!

Kantan
fuente
3

primero convierta su polígono en líneas

use v.clean para limpiar su topología (con la opción "break")

entonces simplificas tus líneas

Finalmente vuelves tus líneas a polígonos. (Usando polygonize)

EDITAR: para obtener los atributos de sus polígonos, la mejor manera, si no tiene polígonos multiparte en el conjunto de datos original , es obtener los centroides de los antiguos y de los polígonos simplificados y unirlos en función de la ubicación más cercana (los centroides deberían no se mueva mucho si solo modifica ligeramente sus límites)

radouxju
fuente
1
Esto me parece que omite algunos pasos, aunque el flujo de trabajo podría funcionar al final. Cuando convierta los polígonos en líneas, es posible que deba asociar la línea con todos los polígonos adyacentes. Luego, después de la simplificación, debe convertir las líneas nuevamente en polígonos de varias partes. Si los polígonos originales son convexos, puede hacer coincidir el original con el simplificado utilizando el centroide (por ejemplo, si el centroide del original está contenido en el poli simplificado, es una coincidencia). Si no son convexas, será mucho más difícil.
Andy W
Hola, he seguido el procedimiento sugerido por radouxju, pero aún obtengo partes del polígono original fuera de sus límites originales. ¿Cómo asocio la línea con todos los polígonos adyacentes en QGIS? Estoy planeando usar estos polígonos en las aplicaciones web y necesito reducir el número de nodos para una carga más rápida. Lo que obtengo ahora es una buena reducción, pero no puedo deshacerme de estas pequeñas áreas que existen después de la simplificación. Cualquier idea para resolver esto será muy apreciada.
David
@David. Creo que su problema podría ser con el Paso 3, líneas a polígonos. En Processing Toolkit hay una herramienta llamada "Polygonize" y probaría esto. Creo que esto todavía necesita que se instalen los paquetes Shapely y Numpy. Dicho esto, no puedo hacer que "Polygonize" funcione para mí en QGIS-Master por el momento. N.
nhopton
2

Puede resolver el problema con un modelo de procesamiento (ex SEXTANTE) como este:

ingrese la descripción de la imagen aquí

Versión de script:

##Simplify polygons=name
##vectorlayer_input=vector
##number_tolerance=number 0.0
##output_layer_alg3=output vector
outputs_0=Processing.runalg("qgis:polygonstolines", vectorlayer_input, None)
outputs_1=Processing.runalg("qgis:simplifygeometries", outputs_0['OUTPUT'], number_tolerance, None)
outputs_2=Processing.runalg("qgis:linestopolygons", outputs_1['OUTPUT'], None)
outputs_3=Processing.runalg("qgis:joinattributestable", outputs_2['OUTPUT'], vectorlayer_input, ID, ID, output_layer_alg3)

Nota: la única limitación es que el campo común tiene que ser IDen Join attributes table, porque es el único campo de la producción de Lines to polygons. Es por eso que el campo común no es una entrada variable del modelo. Por lo tanto, un IDcampo debe estar disponible en la capa de polígono de entrada.

Antonio Falciano
fuente