Intersección de polígonos solapados en PyQGIS

En el post pasado se consideró la intersección de rasgos (features) adyacentes de polígonos en PyQGIS. Puede resultar muy útil si queremos extraer, por ejemplo, el límite entre dos países y estimar la longitud de su frontera. En el post de hoy vamos a considerar la intersección pero cuando los polígonos se solapan en alguna extensión; como los de la imagen siguiente:

intersection1

El código es muy sencillo y se encuentra a continuación:

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

feat1 = layers[0].getFeatures().next()
feat2 = layers[1].getFeatures().next()

geom1 = feat1.geometry()
geom2 = feat2.geometry()

pol1 = geom1.exportToWkt()
pol2 = geom2.exportToWkt()

if geom1.intersects(geom2) is True:
    
    print "there is intersection!"
    
    geom3 = geom1.intersection(geom2)

print geom3.exportToWkt()

Cuando se ejecuta en la Python Console se obtiene como resultado la geometría (un polígono) expresada en WKT (ver imagen siguiente).

intersection3

Cuando hacemos un copy/paste de esa salida en la ventana del plugin QuickWKT, después de click en OK se obtiene la memory layer de la imagen siguiente:

intersection2

A los polígonos que se solapan les he dado un 80 % de transparencia para realzar el polígono resultante de la intersección.

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

6 respuestas a Intersección de polígonos solapados en PyQGIS

  1. hola me parecen exelente los ejemplo pero no se si están o donde están, sino seria bueno incluir los dos archivos shape para poder hacerlo y ver los resultados y asi entender mejor

  2. Esto:

    print geom3.exportToWkt()   
    

    me da el siguiente error:

    print geom3.exportToWkt()
    Traceback (most recent call last):
      File "", line 1, in 
    AttributeError: 'NoneType' object has no attribute 'exportToWkt'
    

    Si alguien sabe el por qué agradezco una respuesta.

    • La intersección es vacía. Tienes que usar dos shapefiles que se solapen.

      • Actualmente tengo dos shapefiles en la misma proyección: 5367 crmt05. En la imagen se ve claramente que un polígono está metido en un 15% mas o menos sobre el otro. Estos los creé en QGIS. Lo único que cada uno en su dbf tiene 3 atributos: nombre, descripción, tipo y un solo registro para cada uno de los dbf de cada shp.

        Habrá algún detalle que me estoy perdiendo que daba existir entonces en cada shape ademas de que visiblemente se vean solapados.

        Comparto imagen:

  3. bueno referente a lo anterior lo solucione asi:

    mapcanvas = iface.mapCanvas()
    layers = mapcanvas.layers()
    feat1 = layers[0].getFeatures().next()
    feat2 = layers[1].getFeatures().next()
    geom1 = feat1.geometry()
    geom2 = feat2.geometry()
    if geom1.intersects(geom2) is True:
        print "si existe una interseccion"
        geom3 = geom1.intersection(geom2)
        area1 = geom1.area()
         area3 = geom3.area()
        resul =area3*100/area1
        b = ("%.2f"% round (resul,2))
        print b 
        38.77
    else:
        print "no existe una interseccion" 
    

    Este me da un porcentaje de área de un polígono que se intersecta. Lo de los polígonos cuando los diseñe en QGIS, por alguna razón que desconozco, me dan vacío cuando los intersecto pero si cojo un polígono creado desde arcGIS si me funciona. No se que podría ser la verdad pero se que es el diseño en QGIS lo que me daba error.

    Ahora tengo otra duda. Si mi capa p1 tiene mas de un polígono y mi capa p2 también tienen mas de uno y quiero que se comparen los registros por un for para sacar todas las posibles intersecciones entre sus registros o features como puedo acceder los registros siguiendo este ejemplo gracias a cualquier respuesta.

  4. Tienes que usar la librería itertools para determinar todas las intersecciones como combinaciones de rasgos (no se repite ninguna) y luego se crea una memory layer ‘Single Part’ con todos los features producto de la intersección.

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