Plugin de QGIS para producir vectoriales por selección de rasgos con base en consultas tipo SQL

En posts pasados (1, 2) he venido desarrollando un plugin de QGIS cuyo objetivo final es producir vectoriales (memory layer) cuyos rasgos serían producto de una consulta tipo SQL. Para ello, aproveché la conexión automática a una QgsFieldComboBox para obtener información acerca del intervalo de variablidad del atributo sobre el cual basar la consulta; aunque esta podría estar basada simplemente en su id.

El código principal está en la programación del botón que he dado en llamar “Query” y cuyo extracto en el código del plugín es el siguiente:

.
.
.
    def query_function(self):
        
        vlayer = self.wcbL.currentLayer()
        geometry_type = vlayer.geometryType()
        
        if geometry_type == QGis.Point:
            geo_type = 'Point'
        
        elif geometry_type == QGis.Line:
            geo_type = 'LineString'
        
        elif geometry_type == QGis.Polygon:
            geo_type = 'Polygon'
        
        text = self.dlg.lineEdit.text()
        
        expression = QgsExpression(text)
        
        feats = [ feat for feat in vlayer.getFeatures() 
                  if expression.evaluate( feat )]
        
        crs = vlayer.crs()
 
        epsg = crs.postgisSrid()
         
        uri = geo_type + "?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"
         
        new_layer = QgsVectorLayer(uri, 
                                   'memory', 
                                   'memory')
         
        QgsMapLayerRegistry.instance().addMapLayer(new_layer)
         
        prov = new_layer.dataProvider()
         
        n = len(feats)
         
        for i in range(n):
         
            feats[i].setAttributes([i])
         
        prov.addFeatures(feats)
.
.
.

Para probar la ejecución del plugín cargué en QGIS tres vectoriales de diferente geometría; tal como se evidencia en la imagen siguiente:

plugin1

A continuación, después de ejecutado el plugín, se hace la consulta por el campo ‘values’ de polygon8 y se obtiene el vectorial correspondiente para los rasgos que oscilan en el intervalo [50, 70) para el valor de ese campo (color verde).

plugin2

La imagen siguiente refleja la consulta en random_points por el campo rast_value y la memory layer de puntos obtenida (en verde) satisface dichos criterios (rast_value > 1550).

plugin3

Por último, se hizo la consulta más sencilla de todas para obtener una memory layer tipo LineString para el valor de FID = 2 en el vectorial line; tal como se visualiza en la imagen siguiente en color rojo.

plugin4

Para ahorrar tiempo de digitación y minimizar errores, se podría programar un teclado para incorporar el valor del campo y los operadores que pueden intervenir en las posibles consultas (<, <=, AND, etc).

Para apreciar la velocidad de ejecución nada mejor que un vídeo:

Esta entrada fue publicada en Plugin, PyQGIS, QGIS, 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