4 votos

Simplificación de polígonos adyacentes sólo en un subconjunto de vértices

Tenemos muchos polígonos adyacentes que son muy complejos y necesitamos simplificar sólo algunas porciones de ellos.

No hay huecos ni solapamientos entre dos polígonos adyacentes.

Lo que nos gustaría hacer es seleccionar un subconjunto de los vértices que delimitan dos polígonos adyacentes juntos, y luego simplificar sólo este subconjunto, manteniendo sin huecos o solapamientos entre dos polígonos adyacentes resultantes:

example

¿Es posible conseguirlo en QGIS, por ejemplo (o en cualquier otra herramienta)?

Hemos buscado algunas opciones para simplificar los polígonos adyacentes, pero no encontramos la manera de hacerlo sólo en un subconjunto de los polígonos.

2voto

ARUNBALAN NV Puntos 101

Espero haber entendido bien su pregunta.

Supongamos que hay una capa "polygons" con su correspondiente tabla de atributos en consecuencia, véase la imagen siguiente.

input

Y, por supuesto, hay algunas lagunas o solapamientos.

gaps_and_overlaps

A continuación sugiero un proceso paso a paso de cómo simplificar sólo el subconjunto de polígonos, manteniendo sin espacios o solapamientos entre dos polígonos resultantes adyacentes.

Paso 1. Divida su capa original en "bueno" y "malo" características. He utilizado 'Extract by expression' Por ejemplo "id" IN (2,3) y "id" NOT IN (2,3) . Sin embargo, puede utilizar cualquier otra técnica disponible para separar sus características.

step_1

Paso 2. Convertir polígonos en líneas con 'Polygons to lines' .

step_2

Paso 3. Aplicando 'Line intersections' donde las líneas se cruzan entre sí. Además explotar 'Delete duplicate geometries' .

step_3

Paso 4. Continúe con 'Points to path' .

step_4

Paso 5. Aplicar 'Dissolve' a su "malo" características.

step_5

Paso 6. Utilice 'Delete holes'

step_6

Paso 7. Aquí se trabaja con 'Split with lines' entre el resultado de Paso 6 y Paso 4 .

step_7

Paso 8. Debido a la inconsistencia de los atributos evocados en los pasos anteriores, se requieren algunos pasos adicionales sobre cómo lograr los atributos correctos. Probablemente extraeré los geocentroides del resultado del Paso 7 y, a continuación, aplique 'Join attributes by location' y después un 'Join' entre polígonos con geometrías correctas y puntos con atributos correctos.

Paso 9. Fusión "bueno" características con el resultado de Paso 8 a través de 'Merge vector layers' . Y, por supuesto, un ajuste básico de los atributos es un plus.

step_9


Si necesita líneas rectas para el paso Paso 4. entonces hay que aplicar un par de pasos más.

Paso 4.1. Disuelve tus caminos con 'Dissolve' .

Paso 4.2. Obtención de una línea recta por medio de un "Virtual Layer" a través de Layer > Add Layer > Add/Edit Virtual Layer... aplicar esta consulta

SELECT setsrid(make_line(start_point(geometry), end_point(geometry)), #put your srid here)
FROM "Paths"

step_42

Puede que haya mejores opciones con algoritmos de simplificación de líneas, aún no lo he comprobado.


P.D. En mi opinión, es mejor implementar este algoritmo en un modelador gráfico.


Referencias:

1voto

Cyril Puntos 141

Aclaración: si no tiene un "id" en su tabla, créelo y utilízalo para identificar los polígonos adyacentes derecho e izquierdo (superior e inferior).

  1. Una de las formas de resolver este problema es la siguiente. Mi situación inicial se representa en la figura siguiente:

enter image description here

  1. Ejecuta el script (CTE), que creo que es apropiado para tu caso de procesamiento de geodatos, estableciendo el nombre de tu tabla y el nombre del campo, por ejemplo "id"

    WITH tbla as (SELECT id, ((ST_Dump(geom)).geom) geom FROM <table_name> ),

    tblb as (SELECT a.id, ((ST_Dump(ST_Difference(ST_ExteriorRing(a.geom), ST_ExteriorRing(b.geom)))).geom) geom FROM tbla a LEFT JOIN tbla b ON ST_Intersects(a.geom, b.geom) AND a.id < b.id ),

    tblc as (SELECT id, ST_MakePolygon(ST_AddPoint(geom, ST_StartPoint(geom))) geom FROM tblb ),

    tbld as (SELECT a.id, ((ST_Dump(ST_Difference(ST_ExteriorRing(a.geom), ST_ExteriorRing(b.geom)))).geom) geom FROM tbla a LEFT JOIN tbla b ON ST_Intersects(a.geom, b.geom) AND a.id > b.id ),

    tble as (SELECT id, ST_MakePolygon(ST_AddPoint(geom, ST_StartPoint(geom))) geom FROM tbld )

    SELECT FROM tblc UNION SELECT FROM tble;

  2. Compruebe su resultado, mi resultado se muestra en la figura siguiente

enter image description here

Traducido con www.DeepL.com/Translator (versión gratuita)

1voto

Joe Puntos 16

El trabajo se puede hacer con OpenJUMP pero el método es genérico y se puede utilizar cualquier software. Lo que importa es que el software debe ser capaz de crear un gráfico plano y construir polígonos a partir de áreas cerradas entre líneas.

Comience con datos topológicamente limpios en los que los polígonos adyacentes tienen bordes comunes que coinciden exactamente.

source polygons

Crear gráfico plano. Sólo necesitas las aristas.

planar graph in OpenJUMP

options for planar graph

En el gráfico plano, seleccione las líneas que desea simplificar.

Planar graph with one selected edge

options for D-P simplification

Cuando esté satisfecho con la simplificación construya polígonos a partir del gráfico.

build polygons with OpenJUMP

new polygons with one simplified border

Como paso final debe copiar los atributos de la capa de origen en nuevos polígonos con unión espacial.

Por desgracia, los conjuntos de datos de polígonos del mundo real suelen tener una topología pobre. Los bordes comunes no coinciden, sino que hay pequeños huecos y solapamientos. Puede ser más rápido digitalizar algunos bordes manualmente que arreglar los datos de origen para que puedan convertirse en líneas y volver a ser polígonos sin errores.

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