Ya hemos discutido el tema de la validación de la geometría en una serie de artículos en francés:
- herramientas SIG para la validación de geometrías (1)
- herramientas SIG de validación de geometrías (2): Espacialidad y PostGis
- Las herramientas de validación de geometría (3): FME
- Las herramientas de validación de geometría (4): Geomedia Intergraph
- Las herramientas de validación geometría (5) con QGis
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:
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:
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.
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.
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ó).
Y finalmente eliminamos los vértices duplicados :
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:
En este punto, si los errores persisten, debemos abandonar la idea de corregirlos automáticamente, armarnos de paciencia y corregirlos manualmente.
Excelente artículo! Muy útil. Muchas gracias por compartir