Polígonos con “agujeros” en PyQGIS

Para considerar los polígonos con agujeros en PyQGIS sólo basta con tener una lista de listas. Sin embargo, a pesar de que puedan ser visualizados en el Map Canvas de QGIS, eso no significa que la geometría sea válida. Por ello, es conveniente incluir el método ‘isGeosValid’ de QgsGeometry para tal fin.

El código siguiente permite imprimir el polígono de ejemplo (pol) en formato WKT y todos los anillos que lo constituyen después de validar su geometría.

pol = [[QgsPoint(0,0),QgsPoint(0,50),QgsPoint(50,50),QgsPoint(50,0),QgsPoint(0,0)],
       [QgsPoint(10,2),QgsPoint(10,5),QgsPoint(40,5),QgsPoint(40,2),QgsPoint(10,2)],
       [QgsPoint(10,10),QgsPoint(10,30),QgsPoint(30,30),QgsPoint(30,20),QgsPoint(10,10)]]

if QgsGeometry.fromPolygon(pol).isGeosValid():
    
    print QgsGeometry.fromPolygon(pol).exportToWkt()

    n = len(pol)
    
    if n == 1:
        print "polygon has not holes"
    else:
        for i, item in enumerate(pol):
            if i == 0:
                print "outer ring: ", pol[0]
            else:
                print "inner ring: ", pol[i]

else:

    print "geometry is not valid"

El resultado, en la Python Console de QGIS, es:

pol_hol1

y su visualización en el Map Canvas de QGIS, mediante el QuickWKT plugin, corresponde a:

pol_hol2

Si sólo cambiamos el orden de una de las sub listas, por ejemplo, a:

pol = [[QgsPoint(10,2),QgsPoint(10,5),QgsPoint(40,5),QgsPoint(40,2),QgsPoint(10,2)],
       [QgsPoint(0,0),QgsPoint(0,50),QgsPoint(50,50),QgsPoint(50,0),QgsPoint(0,0)],
       [QgsPoint(10,10),QgsPoint(10,30),QgsPoint(30,30),QgsPoint(30,20),QgsPoint(10,10)]]

se obtiene como resultado que: “geometry is not valid”. No obstante, eso no impide que no lo puedan imprimir en formato WKT; si es su deseo. Sin embargo, cuando hagan un zoom completo a la capa, este sólo se manifestará en el anillo que corresponda al externo en esta geometría inválida.

Anuncios
Esta entrada fue publicada en PyQGIS, SIG, Software Libre. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s