Corregir la geometría de una tabla Postgis

Ya hemos discutido el tema de la validación de la geometría en una serie de artículos en francés:

En este artículo veremos más específicamente cómo detectar y corregir problemas geométricos en una tabla PostgreSQL / Postgis usando el lenguaje SQL.

Comprobación de errores con QGis.

Puedes detectar rápidamente errores geométricos usando QGis. Simplemente carga la capa y abre el menú Vector – > Herramientas de geometría – > Verificar la validez

Existen tres métodos posibles:

  • dos métodos de validación: GEOS o QGIS, y
  • un método que se puede imponer para la validación interactiva cuando se crea una nueva geometría (Preferencias → pestaña Explorar).

El método GEOS es más rápido, pero solo indica el primer error encontrado para cada objeto. Devuelve un archivo ‘ Salida no válida ‘ que es una capa de polígonos completada por una columna _errors </ em>:


El método Qgis puede devolver múltiples errores por objeto. Este método devuelve en el archivo ‘ Salida no válida ‘ una capa de polígonos completada por una columna _errors con un mensaje menos estandarizado que el método GEOS:


Personalmente, uso esta herramienta para verificar si hay errores o no. Ejecuto ambos métodos y, si no devuelven ningún error, considero que la capa es válida.

Por el contrario, si existen errores, voy directamente a pgAdmin 4 (o al administrador de base de datos de QGis) para trabajar en SQL.

Detección de errores geométricos con Postgis

El primer paso es la identificación de errores. Ten en cuenta que PostGIS cumple con las especificaciones OGC OpenGIS y, por lo tanto, la validez se compara con GEOS.

Para ésto, realizaremos una consulta que buscará los tres tipos principales de errores:

  • errores GEOS (ver geometrías simples y válido)
  • Geometrías nulas, que no tienen sentido
  • colecciones de geometrías, es decir, objetos compuestos por varias geometrías del mismo tipo o no. El caso más común son los multipolígonos que están catalogados como FeatureCollection por error. Los operadores espaciales usuales no funcionan con colecciones de entrada.

Un último tipo de error, generalmente sin consecuencia, es la presencia de vértices dobles (dos puntos de la entidad ubicados exactamente en el mismo lugar). No perturban a los operadores espaciales, pero  no es  razón suficiente para no solucionarlos.

Aquí hay una consulta que le permite detectar los primeros tres tipos de errores en una sola pasada:

SELECT ‘non valide’ AS nb, count(*) FROM table WHERE NOT ST_IsValid(the_geom)
UNION
SELECT ‘geom nulle’ AS nb, count(*) FROM table WHERE the_geom is null
UNION
SELECT ‘collection’ AS nb, count(*) FROM table WHERE not ST_IsValid(the_geom)
AND ST_GeometryType(ST_MakeValid(the_geom))=’ST_GeometryCollection’;


Puedes obtener los detalles de los errores de GEOS con la siguiente consulta:

SELECT id, ST_IsValidReason(the_geom) FROM table WHERE NOT ST_IsValid(the_geom);

Corrección de errores

(Aquí usaremos el caso de una capa de polígonos, que es el tipo de entidad que presenta la mayor cantidad de problemas).

Corregiremos los errores de GEOS con la función St_MakeValid.

UPDATE table SET the_geom = ST_MakeValid(the_geom) WHERE NOT ST_IsValid(the_geom);

Luego, corregimos las colecciones transformándolas en Multi_polygones. Ten cuidado de no invertir los pasos. La función St_MakeValid puede producir colecciones como resultado.

UPDATE table
SET the_geom =
ST_Multi(ST_Simplify(ST_Multi(ST_CollectionExtract(ST_ForceCollection(ST_MakeValid(the_geom)),3)),0))
WHERE ST_GeometryType(the_geom) = ‘ST_GeometryCollection’;

En tercer lugar, elimina las geometrías nulas (si la solicitud de detección de errores las encontró).

DELETE FROM table WHERE the_geom IS NULL;

Y finalmente eliminamos los vértices duplicados :

UPDATE table SET the_geom = ST_Multi(ST_Simplify(the_geom,0));

Esta última solicitud SQL es una forma algo desviada de hacer la operación. La función St_Simplify es una función de generalización, es decir, una función que reduce el número de puntos de una entidad, eliminando puntos que están a una distancia menor que el parámetro de la función. Al poner 0 a esta distancia, la función deja solo un punto entre todos los puntos en un radio de cero metros (puntos duplicados).

Una vez que se han ejecutado estas consultas, la solicitud de búsqueda de fallas se ejecuta nuevamente. Si los errores persisten, se deben usar otros medios para resolverlos.

Una técnica muy usada es la creación de un buffer nulo:

UPDATE table SET the_geom = ST_Multi(ST_Buffer(the_geom,0)) WHERE NOT ST_IsValid(the_geom));

En este punto, si los errores persisten, debemos abandonar la idea de corregirlos automáticamente, armarnos de paciencia y corregirlos manualmente.

Deja un comentario

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