12 votos

Ogr2ogr (u otro) simplificación de polígonos con límites compartidos

Estoy tratando de simplificar una colección de aproximadamente 100,000 polígonos que contienen cerca de 4 millones de vértices. Los datos se almacenan en un shapefile de 2GB, por lo que no hay una representación explícita de la topología entre los polígonos, pero consisten casi exclusivamente en arcos/vértices compartidos, y las coordenadas de los vértices compartidos se alinean extremadamente bien, tanto que no puedo ver ninguna diferencia sin importar cuánto haga zoom en QGIS, al menos en las muchas áreas donde he mirado.

He intentado usar ogr2ogr con la opción -simplify para hacer la simplificación, y aunque esto preserva la topología de cada polígono, no es consciente de los arcos compartidos entre polígonos, por lo que el resultado es que un arco compartido entre dos polígonos se simplifica de diferentes maneras para cada polígono, lo que resulta en superposiciones y brechas entre los polígonos resultado.

¿Existe algún formato de datos compatible con OGR que represente explícitamente la topología compartida entre polígonos, para poder convertir estos datos a ese formato, de manera que al simplificarlos, el conjunto resultante de polígonos tenga la misma topología (y por lo tanto no tenga brechas ni superposiciones)?

La razón por la que estoy haciendo esto es que en última instancia quiero representar los polígonos (simplificados) en un archivo topoJSON para su visualización web en leaflet.js. He intentado hacer la conversión y simplificación usando el comando topojson de JavaScript, que hace casi exactamente lo que quiero, excepto que no parece poder manejar un archivo de entrada tan grande. He intentado aumentar el límite de memoria con la bandera --max_old_space_size según se describe en https://github.com/mbostock/topojson/issues/71, sin éxito. Incluso probé esto en una gran instancia AWS EC2 con 30GB de memoria y se ejecutó durante un día sin ningún resultado. Si divido los datos en regiones geográficas más pequeñas y proceso cada región por separado con topojson, los resultados se ven maravillosos, pero luego surgen problemas a lo largo de las fronteras entre las regiones. Por lo tanto, estoy buscando soluciones que puedan (preferiblemente rápidamente) manejar el conjunto de datos original enorme.

He visto referencias al comando GRASS v.generalize en publicaciones relacionadas y lo estoy considerando como una opción, pero nunca he usado GRASS y estoy bastante familiarizado con las herramientas gdal / ogr y me pregunto si hay alguna forma de lograr esto con esas herramientas, en lugar de tener que subir por la empinada curva de aprendizaje de GRASS.

1voto

Joe Puntos 16

OpenJUMP Plus tiene una herramienta especial para ese propósito.

introducir descripción de la imagen aquí

Funciona bien si los datos fuente son topológicamente buenos y realmente tienen vértices compartidos. OpenJUMP también tiene herramientas para mejorar la topología como "Ajustar límites de polígonos" que elimina pequeños espacios y superposiciones y agrega vértices para que los límites coincidan.

Las herramientas "Encontrar brechas de cobertura" y "Encontrar superposiciones de cobertura" ayudan a verificar si la topología está bien.

introducir descripción de la imagen aquí

Una verificación de topología muy confiable es crear un grafo lineal a partir de los polígonos y luego crear una nueva capa de polígonos a partir de las áreas cerradas del grafo. El resultado debería contener los mismos polígonos que la capa fuente.

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