viernes, 17 de marzo de 2017

Validando y corrigiendo geometrías con PyQGIS y plugin Processing LWGEOM Provider en GNU/Linux Debian

La validación de las geometrías es fácilmente realizable en PyQGIS con el método 'isGeosValid' de QgsGeometry. Sin embargo, la corrección una vez detectados los problemas no es tan directa porque los procedimientos disponibles en Processing a veces no funcionan. Un método que es prácticamente infalible es ST_MakeValid de PostGis; pero cuenta con la necesidad de que hay que tener instalado PostgreSQL+PostGis en el sistema.


A pesar de que la curva de aprendizaje de PostgreSQL+PostGis puede ser un poco complicada, no hace falta sino tenerlos instalados para aprovechar las bondades del plugin Processing LWGEOM Provider; el cual se instala de la manera usual en QGIS. Una vez instalado el plugin hay que averiguar donde se encuentra alojada la librería liblwgeom; la que utiliza Postgis/spatialite para efectuar ST_MakeValid. Ejecutando en consola de bash el comando dpkg siguiente:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
zeito@debian:~$ dpkg -L liblwgeom-2.1.4
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/liblwgeom-2.1.4
/usr/share/doc/liblwgeom-2.1.4/changelog.Debian.gz
/usr/share/doc/liblwgeom-2.1.4/changelog.gz
/usr/share/doc/liblwgeom-2.1.4/copyright
/usr/lib
/usr/lib/liblwgeom-2.1.4.so
zeito@debian:~$ 

se obtiene el path de la línea 11 el cual se copia en las Processing options, para el provider de LWGEOM Algorithm, en el path que corresponde a liblwgeom; tal como se observa en la imagen a continuación:


Con el código siguiente ejecutado en la Python Console de QGIS para el shapefile world_borders:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
layer = iface.activeLayer()

feats = [ feat for feat in layer.getFeatures() ]

print "Processing..."

for feat in feats:
    
    if feat.geometry().isGeosValid():
        pass
    else:
        print "geometry is not valid for ID: ", feat.attribute("ID")
    
print "Done!"

se encuentran 6 geometrías inválidas para los IDs que se indican en la imagen siguiente:


Abriendo la Tool Box de Processing, se ubica la opción 'Make valid' en LWGEOM Algorithm y se ejecuta con la opción Run.


Esto produce la capa Output layer cuya validación de geometría ahora no produce ningún error; tal como se presenta en la imagen siguiente:


No hay comentarios: