4 votos

Creación de capas virtuales con la caja de herramientas de procesamiento

Hace unos días Cy T publicó una interesante pregunta sobre la creación de capas virtuales utilizando la consola de Python:

¿Crear una nueva capa virtual de forma programada en QGIS?

¿Es posible también crear capas virtuales a través de la caja de herramientas de procesamiento?

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# ----- define interface -----
##Virtual Layers=group
##Point on surface (ST_PointOnSurface)=name
##Input_polygons=vector

from qgis.core import QgsVectorLayer, QgsMapLayerRegistry

inptlyr = processing.getObject(Input_polygons)

vlayer = QgsVectorLayer( "?query=SELECT rowid AS gid,ST_PointOnSurface(geometry)AS geom FROM inptlyr.name()", "vlayer", "virtual" )
QgsMapLayerRegistry.instance().addMapLayer(vlayer)

El registro dice Algorithm Point on surface (ST_PointOnSurface) finished pero no pasa nada.

Editar: ?query= añadido

1 votos

Tal vez un ?query= ¿falta? Quiero decir, ¿cambia algo usando ?query=SELECT ?

0 votos

Culpa mía, ahora QGIS se bloquea al ejecutar el script.

5voto

Mue Puntos 2469

Creo que la cuestión radica en inptlyr.name() . Como lo has insertado en la cadena, es exactamente así como se leerá (y dudo que tengas una capa llamada "inptlyr.name()").

Personalmente, me parece más fácil separar las consultas/fórmulas, ya que facilita la búsqueda de errores. Así que el siguiente ejemplo me sirve:

##Virtual Layers=group
##Point on surface (ST_PointOnSurface)=name
##Input_polygons=vector

from qgis.core import QgsVectorLayer, QgsMapLayerRegistry

inptlyr = processing.getObject(Input_polygons)
query = """ SELECT * FROM '""" + inptlyr.name() + """' """

vlayer = QgsVectorLayer( "?query={}".format(query), "vlayer", "virtual" )
QgsMapLayerRegistry.instance().addMapLayer(vlayer)

Hay que tener en cuenta dos cosas:

  1. Las comillas simples se utilizan para los nombres de las capas (especialmente útiles cuando los nombres de las capas contienen espacios).

  2. inptlyr.name() es en el exterior la cadena para que el nombre pueda ser extraído correctamente.

Así que cuando la consulta anterior es leída por el script, se verá como:

SELECT * FROM 'polygon example'

Esto debería ser suficiente para crear y cargar su capa virtual. Puede probarlo utilizando su consulta.


EDITAR:

Su código podría ser como el siguiente:

##Virtual Layers=group
##Point on surface (ST_PointOnSurface)=name
##Input_polygons=vector

from qgis.core import QgsVectorLayer, QgsMapLayerRegistry

inptlyr = processing.getObject(Input_polygons)
query = """ SELECT rowid AS gid,ST_PointOnSurface(geometry)AS geom FROM '""" + inptlyr.name() + """' """

vlayer = QgsVectorLayer( "?query={}".format(query), "vlayer", "virtual" )
QgsMapLayerRegistry.instance().addMapLayer(vlayer)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X