Zugriff auf den QGIS-Kartenbereich als Variable für Ausdrücke

8

Ist es möglich, auf den QGIS Map Canvas als Variable oder Ausdruckswert zuzugreifen, der im Feldrechner oder in der Beschriftungs-Engine verwendet wird?

(dh damit Sie einen Ausdruck erstellen können, der Features auswählt / abfragt, die in einer bestimmten Ansicht der Leinwand sichtbar / vorhanden sind, auf ähnliche Weise, wie der Druckkomponist "die Legende nach Karteninhalt filtert")

(QGIS 2.18.1 [osgeo4w], win7)

BEARBEITEN:
Möglicher (fiktiver) Anwendungsfall 1 - In einer Ebene befinden sich 50 Polygone. Derzeit sind in der aktuellen Ansicht der Kartenfläche 20 Polygone sichtbar. Ich möchte das Blau des Polygons stylen, wenn <= 25 Polygone sichtbar sind oder Gestalte sie grün, wenn> = 25 Polygone sichtbar sind.

Möglicher (fiktiver) Anwendungsfall 2 - In einer Ebene befinden sich 50 Polygone. Derzeit sind 10 Polygone sichtbar, 5 mit dem Attributwert 'Haus' im Feld / der Spalte "Gebäudetyp" und 5 mit dem Wert von 'Garage' im Feld / Gebäudetyp "Gebäudetyp", sichtbar in der aktuellen Ansicht des Kartenbereichs. Rückgabe: Der Wert, der der Anzahl der Polygone entspricht, die Garagen sind ... Antwort = 5.

wieder zu Gast
quelle
3
Sie haben einige Variablen (map_extent_center / height / width, map_id, map_scale, map_rotation). Andernfalls gibt es im Master eine is_selected Funktion , mit der Sie feststellen können, ob ein Feature ausgewählt ist. Es könnte sich lohnen, mehr Details darüber zu erfahren, was Sie tun möchten.
Denis Rouzaud
Danke @Denis Rouzaud. Ich habe einige dieser Variablen in verschiedenen Kontexten verwendet. Diese Frage wurde als vereinfachter Versuch gestellt, das Problem (oder einen Teil davon) innerhalb einer anderen Frage zu lösen, die ich hier gestellt habe: gis.stackexchange.com/questions/218508/…
guestagain
@DenisRouzaud Möchten Sie das als Antwort posten? Andernfalls bin ich versucht, dies als Duplikat von gis.stackexchange.com/questions/218508/… zu schließen
underdark
Lass es uns schließen. Die Frage ist etwas vage.
Denis Rouzaud
1
Ich denke nicht, dass die Frage vage ist oder nur ein Duplikat der anderen verknüpften, aber detaillierteren Frage. Tatsächlich wird speziell nach einer Lösung gesucht, die mit den im ersten Kommentar aufgeführten Ausdrucksvariablen nicht lösbar ist, und eine Lösung für die Abfrage ist nicht auf den Anwendungsfall in der verknüpften Frage beschränkt. ... und es scheint einige andere zu geben, die an einer Antwort auf die Frage interessiert sind, die ihre eigenen Anwendungen für solche Funktionen oder eine derzeit mögliche Problemumgehung haben müssen.
Gast wieder

Antworten:

1

Ein Werkzeug, das über die derzeit verfügbaren Variablen hinausgeht, ist ein benutzerdefinierter Python-Ausdruck.

Meines Wissens ist dies das einzige derzeit verfügbare Tool, um auf die Kartenfläche so zuzugreifen, wie Sie diese Informationen beschreiben und in Ausdrücken verwenden.

Um Ihren fiktiven Anwendungsfall 1 zu lösen, können Sie Folgendes tun:

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

Anschließend können Sie regelbasierte Stile mithilfe von Filtern wie den folgenden einrichten:

visibleFeaturesCount('mylayer') > 20

Die vollständige Canvas-API finden Sie hier .

Jesse McMillan
quelle
Vielen Dank @Jesse McMillan. Es scheint eine sehr hilfreiche Antwort zu sein, die ich genauer testen werde, sobald ich von einem anderen Projekt eine Bremse bekomme. Ein schneller Test mit dem Einfügen des oben genannten in ein Dialogfeld "Nach Ausdruck auswählen" gemäß dem verknüpften Lernprogramm funktionierte nicht, da das Dialogfeld keine Optionen / Schaltflächen zum Speichern und / oder Ausführen des Skripts in der im Lernprogramm beschriebenen und in seinem Tutorial angezeigten Weise enthielt Screenshots. Neu in der Verwendung von Python-Skripten (oder wie auch immer sie richtig genannt werden), aber ich kann es kaum erwarten, mich darauf einzulassen. Wo erwarten Sie, dass ich die Variable mit dem obigen Code definieren / einrichten würde?
Gast wieder
Es ist etwas verwirrend, aber Sie wählen die Schaltfläche "Laden" auf der Registerkarte "Benutzerdefinierte Ausdrücke". Sobald es geladen ist, wird der zusätzliche Befehl in Ihren verfügbaren qgis-Ausdrücken angezeigt.
Jesse McMillan