Acceder al lienzo del mapa QGIS como una variable para expresiones

8

¿Es posible acceder al QGIS Map Canvas como una variable o valor de expresión para usar en la calculadora de campo o el motor de etiquetado?

(es decir, para que pueda crear una expresión que seleccione / interrogue características que son visibles / presentes en una vista particular del lienzo de una manera similar en la que el compositor de impresión 'filtra la leyenda por el contenido del mapa')

(QGIS 2.18.1 [osgeo4w], win7)

EDITAR:
Caso de uso potencial (ficticio) 1 : hay 50 polígonos en una capa, actualmente hay 20 polígonos visibles en la vista actual del lienzo del mapa, me gustaría diseñar el azul del polígono si hay <= 25 polígonos visibles o estilízalos en verde si hay> = 25 polígonos visibles.

Caso de uso potencial (ficticio) 2 : hay 50 polígonos en una capa, actualmente hay 10 polígonos visibles, 5 que tienen un valor de atributo de 'Casa' en el campo / columna "Tipo de edificio" y 5 que tienen el valor de 'Garaje' en el campo / columna "Tipo de edificio", visible en la vista actual del lienzo del mapa. Retorno: el valor que equivale al número de polígonos que son garajes ... respuesta = 5.

Guestagain
fuente
3
Tiene algunas variables (map_extent_center / height / width, map_id, map_scale, map_rotation) De lo contrario, en master, hay una is_selected función para saber si una función está seleccionada. Puede valer la pena tener más detalles sobre lo que le gustaría hacer.
Denis Rouzaud
Gracias @Denis Rouzaud. He utilizado algunas de esas variables en varios contextos. Esta pregunta se hizo como un intento simplificado de resolver el problema (o una parte del mismo) dentro de otra pregunta que hice aquí: gis.stackexchange.com/questions/218508/…
guestagain
@DenisRouzaud ¿Desea publicar eso como respuesta? De lo contrario, estoy tentado a cerrar esto como un duplicado de gis.stackexchange.com/questions/218508/…
underdark
Cerrémoslo. La pregunta es un poco vaga.
Denis Rouzaud
1
No creo que la pregunta sea vaga ni simplemente un duplicado de la otra pregunta vinculada pero más detallada. De hecho, busca específicamente una solución que no se pueda resolver con las variables de expresión enumeradas en el primer comentario, y la resolución de la consulta no se limita al caso de uso en la pregunta vinculada. ... Y parece que hay algunos otros interesados ​​en una respuesta a la pregunta que deben tener sus propias aplicaciones para tal funcionalidad o una posible solución actual.
Guestagain

Respuestas:

1

Una herramienta para ir más allá de las variables actualmente disponibles sería una expresión personalizada de Python.

Que yo sepa, esta es la única herramienta actualmente disponible para acceder al lienzo del mapa en la forma en que describe y usa esa información en las expresiones.

Para resolver su caso de uso ficticio 1, podría hacer algo como esto:

from qgis.core import *
from qgis.gui import *

@qgsfunction(args='auto', group='Custom')
def visibleFeaturesCount(layerName, feature, parent):
    lyr = QgsMapLayerRegistry.instance().mapLayersByName(layerName)[0]
    extentRect = iface.mapCanvas().extent()
    request = QgsFeatureRequest().setFilterRect(extentRect)
    feats = lyr.getFeatures(request)
    count = 0
    for feat in feats:
        count += 1
    return count

Luego, puede configurar estilos basados ​​en reglas usando filtros como:

visibleFeaturesCount('mylayer') > 20

La API de lienzo completa se puede encontrar aquí .

Jesse McMillan
fuente
Muchas gracias @Jesse McMillan. Parece una respuesta muy útil que probaré con más detalle tan pronto como obtenga otro freno de otro proyecto. Una prueba rápida con pegar lo anterior en un cuadro de diálogo "Seleccionar por expresión" según el tutorial vinculado no funcionó, ya que el cuadro de diálogo no tenía opciones / botones para guardar o ejecutar el script de la manera que describió el tutorial y como se muestra en su capturas de pantalla Nuevo en el uso de scripts de python (o como se llamen correctamente) pero no puedo esperar para comenzar a entenderlo. ¿Dónde espera que yo defina / configure la variable usando el código anterior?
Guestagain 01 de
Es un poco confuso, pero lo que debe hacer es seleccionar el botón 'cargar' en la pestaña de expresiones personalizadas. Una vez que está cargado, el comando adicional se mostrará en sus expresiones qgis disponibles.
Jesse McMillan