Eliminación de solapamientos y huecos entre polígonos de una capa (con QGis y Postgis)

Para quienes no estén familiarizados con las alegrías de trabajar con el catastro francés, deben saber que si tienen la oportunidad de trabajar con los datos catastrales correspondientes a las localidades («Lieux-dits») (subdivisiones de las comunas) comprobarán que la coherencia espacial (topología) no se respeta realmente:

De hecho, el límite de cada localidad es el borde de la carretera o camino colindante, lo que deja espacios vacíos donde están las carreteras o los caminos. Aunque en algunos casos esto no es un problema, se convierte en uno cuando se añade la capa «Comunas» (del mismo catastro) al mapa:

A esta escala no parece muy limpio, pero si se amplía es aún peor.

Y si nos fijamos en la propia capa de localidades, encontramos numerosas anomalías topológicas:

Así es, es el registro oficial de la propiedad…

Aquí veremos cómo resolver ambos problemas:

  • Cómo corregir la topología de la capa de localidad eliminando los polígonos superpuestos y los espacios vacíos entre ellos;
  • Cómo volver a crear una capa común coherente con la nueva capa de localidades y superpuesta exactamente a los límites de las localidades.

El ejemplo siguiente se ha creado a partir de los datos del catastro oficial del departamento 71, descargados del enlace https://cadastre.data.gouv.fr/data/etalab-cadastre/2023-01-01/shp/departements/71/

Cómo corregir la topología de la capa de localidad

La solución aquí propuesta requiere una base de datos PostgreSQL con Postgis. Es posible adaptarla a SQLite para utilizar un archivo geopackage y el QGis DB Manager. Pero hay que contar con tiempos de procesamiento muy largos y sortear algunas deficiencias y errores. Aquí veremos la mejor solución, pero presentaremos la solución con Geopackage en otro artículo.

1-Crear una capa con un buffer alrededor de las localidades

Para gestionar los espacios entre polígonos, aunque algunas herramientas de encaje pueden tratar ciertos problemas, la solución más sencilla y radical es construir un buffer alrededor de los polígonos para transformar los espacios vacíos en superposiciones. En el caso de las localidades, los espacios vacíos son del orden de 10m. Construimos un búfer de 6 m alrededor de las localidades, lo que dará una superposición de al menos 2-3 metros.

Elije un archivo de salida permanente en formato Geopackage, que te permitirá seguir el procedimiento del paso siguiente sin modificaciones.

El resultado de la capa búfer es el siguiente:

Ya no tenemos que gestionar los espacios entre los polígonos, sólo los solapamientos.

2- Cargar la capa localidades en PostgreSQL

Puedes seguir los detalles de cómo cargar la capa en el artículo Cómo cargar un geopackage en Postgis con QGis . Utiliza el mismo procedimiento para cargar shapefiles.

Y encuentras tu tabla en PostreSQL con pgAdmin

3- Ejecutar el script SQL

Vamos a utilizar un único script para hacer todo el trabajo:

  • Creamos una vista con dos colecciones de geometrías. Inicialmente, se trata de los polígonos de las localidades por duplicado.
  • La primera colección contiene las partes de los polígonos que no se solapan con otras.
  • Las partes superpuestas se guardan en la segunda colección.
  • Añadimos la parte superpuesta al menor de los dos polígonos afectados por la superposición.

Este es el script:

DROP TABLE IF EXISTS table_corrigee ; 

CREATE OR REPLACE VIEW auto_jointure AS SELECT

    tampon.id as id,
    tampon.nom as "nom",
    tampon.commune as "commune",
-- recuperamos todos los polígonos de la tabla buffer en dos colecciones: una donde tenemos las geometrías completas y otra donde tenemos las partes superpuestas. De momento, las dos colecciones contienen las geometrías completas.
    ST_Union(tampon.geom) AS full_geom,
    ST_Union(tampon_bis.geom) AS shared_geom
    FROM  tampon ,tampon AS tampon_bis
    WHERE
      --comprobar la validez de los polígonos de la siguiente manera
      ST_IsValid(tampon.geom) AND ST_IsValid(tampon_bis.geom)
      --filtro para retener los polígonos que se intersecan
      AND ST_intersects(tampon.geom,tampon_bis.geom)   
      --eliminar los polígonos de intersección
      AND tampon.id <> tampon_bis.id          
      --para una intersección de 2 polígonos, mantener sólo el más pequeño
      AND ST_Area(tampon_bis.geom) < ST_Area(tampon.geom)
      --ya que estamos haciendo 'uniones', necesitamos realizar una agrupación en los otros atributos
    GROUP BY tampon.id,tampon."nom" , tampon.commune ;
/*
Vamos a crear una tabla que contenga el resultado final: el primer paso consiste en eliminar todas las áreas superpuestas. El segundo paso consiste en añadir las áreas solapadas al menor de los dos polígonos. Los huecos creados por el primer paso se rellenan con este segundo paso. Los polígonos finales son contiguos, sin solapamientos ni huecos.
*/

    CREATE TABLE table_corrigee AS SELECT
    id,
    "nom",
    commune,
/* Las intersecciones se restan de la capa que contiene todos los polígonos; así se eliminan las partes conflictivas*/
    ST_Multi(ST_Difference(full_geom,shared_geom)) as geom,
    ST_Area(full_geom) as area
    FROM auto_jointure
    WHERE ST_IsValid(full_geom) AND ST_IsValid(shared_geom)
/*Las intersecciones que se acaban de restar deben añadirse a continuación para rellenar los espacios creados.*/
    UNION 
      SELECT
      id,
      "nom",
      commune,
      geom,
      ST_Area(geom)
      FROM tampon
      WHERE id NOT IN (SELECT id FROM auto_jointure);
/*A continuación se redefine una clave primaria para que QGIS pueda cargar la capa.*/

ALTER TABLE table_corrigee ADD CONSTRAINT pk_table_corrigee PRIMARY KEY (id);

Para adaptar el script a su caso, deberá utilizar un procesador de textos para sustituir los siguientes elementos

  • todas las apariciones de tampon por el nombre de la tabla que contiene las ubicaciones buffereddits,
  • todas las apariciones de table_corrigee por el nombre de la tabla de resultados que desee,
  • y comprueba que el identificador de tu tabla buffered es id. Por defecto puede llamarse fid. En este caso, sustituye todas las apariciones de id por fid.

Carga esta nueva capa en QGis:

A la izquierda la capa corregida, a la derecha la capa de localidad original

Hemos resuelto el problema de la coherencia topológica de las localidades.

Cómo recrear una capa de municipios coherente con la nueva capa de lieux-dits

Si superponemos nuestra nueva capa con los límites de los municipios del catastro, veremos que no son coherentes con nuestras nuevas localidades, al igual que no lo son con las localidades originales.

Para obtener unos límites comunales coherentes, bastaría con agrupar las localidades por comunas. El problema es que no todos los municipios están divididos en localidades. Por tanto, tenemos «lagunas» en la capa de localidades, que son perfectamente normales.

Para construir municipios completos, primero hay que crear los polígonos que faltan para las localidades, asignarles el código de municipio correspondiente y, a continuación, agrupar las localidades utilizando el atributo municipio.

1-Creación de los polígonos que faltan

En primer lugar, vamos a crear una nueva capa de polígonos, emprise, con un único polígono que rodee completamente nuestra capa de localidades.

A continuación, utilizamos el tratamiento «Diferencia» para conservar en nuestra tabla_corregida únicamente las zonas de emprise que no corresponden a las localidades existentes:

Puede dejar la salida de los tratamientos como capas temporales porque no tendrá más uso para ellas después del resultado final.

El resultado de la diferencia es:

El resultado es un único multipolígono. Antes de continuar, necesitamos convertir esta capa multipoligonal en polígonos simples, para poder eliminar el contorno del área.

Para ello utilizamos el procesamiento de polígonos individuales

Una vez finalizado el procesamiento, cambie el resultado al modo de edición y seleccione el polígono exterior.

Y se le suprime:

Así que ahora tenemos una capa de Geometrías Simples que contiene todos los lugares donde no hay localidades, y una capa de localidades corregidas. Fusionamos las dos capas en una única capa sin huecos:

Queda por resolver el problema de los atributos de los polígonos que no son localidades. Necesitan tener un atributo que contenga el código del municipio, para que puedan agruparse por municipios.

Vamos a utilizar la capa de municipios del catastro y a realizar una unión por localidad con la nueva capa fusionada.

Ahora tenemos la tabla adjunta:

En esta imagen, tiene los cinco primeros registros correspondientes a zonas que no son localidades. El atributo municipio, que nos interesa para el siguiente paso, no está rellenado. Sin embargo, el atributo id2, que proviene de la unión por localidad con la capa municipios, sí está rellenado correctamente.

Abra la tabla en modo edición. Utilice una expresión para seleccionar los registros que no tienen rellenado el atributo commune y, a continuación, abra la calculadora de campos y actualice el campo commune con el contenido de id2.

Ahora podemos agrupar las localidades por municipio para obtener nuestra capa municipios que es coherente con las localidades.

Utilizamos el tratamiento Grupo, con la capa resultante de la unión que acabamos de modificar.

Así que tenemos nuestras nuevas comunas. Aún nos queda una última operación. Como en cualquier operación de fusión, el resultado contendrá una serie de pequeñas escorias que habrá que eliminar:

Para ello, utilizaremos el tratamiento Eliminar agujeros.

No olvides guardar el resultado en un archivo permanente: ¡sería duro tener que rehacerlo todo!

Ahora podemos comparar el resultado de nuestra nueva capa común con la capa original

A la izquierda, la capa catastral original; a la derecha, la capa que hemos construido.

Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *