Wichtig

Übersetzen ist eine Gemeinschaftsleistung Sie können mitmachen. Diese Seite ist aktuell zu 100.00% übersetzt.

13.1. Ausdrücke

Basierend auf Layer-Daten und vorgegebenen oder benutzerdefinierten Funktionen bieten Ausdrücke eine leistungsstarke Möglichkeit zur Bearbeitung von Attributwerten, Geometrie und Variablen, um den Geometriestil, den Inhalt oder die Position der Beschriftung, den Wert für Diagramme, die Höhe eines Layout-Elements dynamisch zu ändern, einige Objekte auszuwählen, virtuelle Felder zu erstellen, …

Bemerkung

Eine Liste der Standardfunktionen und -variablen zum Erstellen von Ausdrücken, mit detaillierten Informationen und Beispielen, finden Sie unter Liste der Funktionen.

13.1.1. Der Ausdruckseditor

Der Hauptdialog zur Erstellung von Ausdrücken, der Ausdruckseditor ist an vielen Stellen in QGIS verfügbar. Er kann z.B. hier aufgerufen werden:

Der Ausdruckseditor erlaubt den Zugang zu:

  • Reiter Ausdruck, der dank einer Liste von vordefinierten Funktionen dabei hilft, den zu verwendenden Ausdruck zu schreiben und zu überprüfen;

  • Reiter Funktionseditor, der bei der Erstellung angepasster Funktionen und damit der Erweiterung der Liste der Funktionen unterstützt.

13.1.1.1. Die Benutzeroberfläche

Der Reiter Ausdruck bietet die hauptsächliche Schnittstelle zum Schreiben von Ausdrücken mit Funktionen, Layer-Feldern und Werten. Er enthält die folgenden Elemente (Widgets):

../../../_images/function_list.png

Abb. 13.1 Der Ausdruck-Reiter

  • Ein Editorbereich für Ausdrücke zum Eingeben oder Einfügen von Ausdrücken. Autovervollständigung ist verfügbar, um das Schreiben von Ausdrücken zu beschleunigen:

    • Die zum Eingabetext passenden Variablen, Funktionsnamen und Feldnamen werden unterhalb der Eingabe angezeigt. Nutzen Sie die Up und Down Tasten, um die Einträge durchzublättern und die Taste Tab, um einen Eintrag in den Ausdruck zu übernehmen oder klicken Sie einfach doppelt auf den gewünschten Eintrag.

    • Die Parameter von Funktionen werden beim Ausfüllen angezeigt.

    QGIS prüft die Richtigkeit des Ausdrucks und hinterlegt alle Fehler farbig:

    • Unterstreichung: unbekannte Funktionen, falsche oder ungültige Funktionsargumente;

    • Markierung: alle weiteren Fehler (z.B. fehlende Klammern, unerwartete Zeichen) an der jeweiligen Stelle.

    Tipp

    Dokumentieren Sie Ihre Ausdrücke mit Kommentaren

    Bei Nutzung komplexer Ausdrücke, ist es eine gute Praxis mehrzeilige Kommentare bzw. im Ausdruck eingeschlossene Kommentare als Erinnerungshilfen zu verwenden.

    /*
    Labels each region with its highest (in altitude) airport(s)
    and altitude, eg 'AMBLER : 264m' for the 'Northwest Artic' region
    */
    with_variable(
      'airport_alti', -- stores the highest altitude of the region
      aggregate(
        'airports',
        'max',
        "ELEV", -- the field containing the altitude
        -- and limit the airports to the region they are within
        filter := within( @geometry, geometry( @parent ) )
      ),
        aggregate( -- finds airports at the same altitude in the region
          'airports',
          'concatenate',
          "NAME",
          filter := within( @geometry, geometry( @parent ) )
            and "ELEV" = @airport_alti
        )
        || ' : ' || @airport_alti || 'm'
        -- using || allows regions without airports to be skipped
    )
    
  • Oberhalb des Ausdruckseditors finden Sie eine Reihe von Werkzeugen, die Ihnen helfen:

  • Unter dem Ausdruckseditor finden Sie:

    • Eine Reihe von grundlegenden Operatoren, die Ihnen bei der Erstellung des Ausdrucks helfen

    • Ein Hinweis auf das erwartete Ausgabeformat bei der Datendefinierten Übersteuerung von Objekteigenschaften

    • Eine Live Vorschau der Ausgabe des Ausdrucks (bis zu 60 Zeichen), die standardmäßig für das erste Objekt des Layers berechnet wird. Um eine Ausgabevorschau mit mehr als 60 Zeichen anzuzeigen, können Sie mit dem Mauszeiger über den Text fahren, um ein Tooltip-Popup mit der gesamten Ausgabevorschau anzuzeigen. Um den Text der Ausgabevorschau in die Zwischenablage zu kopieren, klicken Sie mit der rechten Maustaste auf den Text der Ausgabevorschau und wählen editCopy Ausdruckswert kopieren.

      Mit der Combobox Objekt können Sie weitere Objekte des Layers durchsuchen und berechnen (die Werte werden aus der Eigenschaft Anzeigename des Layers übernommen).

      Im Falle eines Fehlers wird dieser angezeigt und Sie können die Details über den angegebenen Hyperlink aufrufen.

  • In einem Auswahlfeld sind die Funktionen, Variablen, Felder, … in Gruppen organisiert aufgelistet. Ein Suchfeld dient zur Filterung der Gesamtliste, um schnell eine bestimmte Funktion oder Feld zu finden. Mit Hilfe eines Doppelklicks wird das Element in den Ausdruckseditor eingefügt.

  • Ein Bedienfeld, das Hilfe für jedes ausgewählte Element aus der Funktionsauwahl anzeigt.

    Tipp

    Drücke Ctrl+Click beim Überfahren eines Funktionsnamens, um automatisch die Hilfe zu dieser Funktion im Hilfe-Dialog anzuzeigen.

    Wenn ein Feld im Funktionsselektor ausgewählt wird, können Sie sich im unteren, rechten Bereiche die Werte des Feldes auf verschiedene Weise anzeigen lassen:

    • im Werte Suchfeld nach einem bestimmten Feldwert suchen

    • Zeigt die Liste der Werte von Alle eindeutigen oder 10 Stichproben an; auch über die rechte Maustaste verfügbar.

      Wenn das Feld mit einem anderen Layer oder einer Gruppe von Werten verknüpft ist, d.h. wenn die Feldeigenschaften entsprechend gesetzt sind, ist es möglich, alle Werte des verknüpften Feldes aufzulisten (aus dem referenzierten Layer, der Tabelle oder der Liste). Darüber hinaus können Sie diese Liste nach checkbox Nur verwendete Werte anzeigen im aktuellen Feld filtern.

    Ein Doppelklick auf einen Feldwert im Widget fügt ihn dem Ausdruckseditor hinzu.

    Tipp

    Das rechte Bedienfeld mit der Hilfe zu Funktionen und den Feldwerten kann ausgeblendet werden (durch nach rechts ziehen der Bedienfeldbegrenzung). Durch Drücken des Knopfes Werte anzeigen oder Hilfe anzeigen wird er wieder angezeigt.

13.1.1.2. Einen Ausdruck schreiben

QGIS-Ausdrücke werden verwendet, um Objekte auszuwählen oder Werte zu setzen. Das Schreiben eines Ausdrucks in QGIS folgt einigen Regeln:

  1. Der Dialog definiert den Kontext: wenn Sie mit SQL vertraut sind, kennen Sie wahrscheinlich Abfragen des Typs select features from layer where condition oder update layer set field = new_value where condition. Ein QGIS-Ausdruck benötigt ebenfalls alle diese Informationen, aber das Werkzeug, mit dem Sie den Ausdrucksdialog öffnen, liefert einen Teil davon. Zum Beispiel, wenn man einen Layer (buildings) mit einem Feld (height) hat:

    • Wenn Sie das Werkzeug expressionSelectObjekte nach Ausdruck wählen drücken, bedeutet das, dass Sie „bestimmte Objekte aus buildings``auswählen" wollen. Die **Bedingung** ist die einzige Information, die Sie in das Ausdruckstextwidget eingeben müssen, z. B. geben Sie ``"height" > 20 ein, um Gebäude auszuwählen, die höher als 20 sind.

    • Wenn Sie diese Auswahl getroffen haben, die Schaltfläche calculateField Feldrechner drücken und „height“ als Vorhandenes Feld erneuern wählen, haben Sie bereits den Befehl „update buildings set height = ??? where height > 20“. Das einzige, was Sie in diesem Fall noch eingeben müssen, ist der neue Wert, z.B. geben Sie einfach 50 in das Textfeld des Ausdruckseditors ein, um die Höhe der zuvor ausgewählten Gebäude zu setzen.

  2. Achten Sie auf Anführungszeichen: Einfache Anführungszeichen geben ein Literal zurück, d.h. ein Text zwischen einfachen Anführungszeichen ('145') wird als String interpretiert. Doppelte Anführungszeichen geben den Wert des Textes zurück, also verwenden Sie sie für Felder ("myfield"). Felder können auch ohne Anführungszeichen verwendet werden (myfield). Keine Anführungszeichen für Zahlen (3.16).

    Bemerkung

    Die Funktionen nehmen normalerweise als Argument eine Zeichenkette für den Feldnamen. Schreiben Sie also:

    attribute( @atlas_feature, 'height' ) -- returns the value stored in the "height" attribute of the current atlas feature
    

    Und nicht:

    attribute( @atlas_feature, "height" ) -- fetches the value of the attribute named "height" (e.g. 100), and use that value as a field
                                          -- from which to return the atlas feature value. Probably wrong as a field named "100" may not exist.
    

Tipp

Verwenden Sie benannte Parameter, um das Lesen von Ausdrücken zu erleichtern.

Bei einigen Funktionen müssen viele Parameter angegeben werden. Die Ausdrucksmaschine unterstützt die Verwendung von benannten Parametern. Das bedeutet, dass man statt des kryptischen Ausdrucks clamp( 1, 2, 9) auch clamp( min:=1, value:=2, max:=9) verwenden kann. Auf diese Weise können die Argumente auch vertauscht werden, z.B. Klammer( value:=2, max:=9, min:=1). Die Verwendung von benannten Parametern hilft zu klären, worauf sich die Argumente einer Ausdrucksfunktion beziehen, was hilfreich ist, wenn Sie später versuchen, einen Ausdruck zu interpretieren!

13.1.1.3. Anwendungsbeispiele für Ausdrücke

  • Berechnen Sie mit dem Feldrechner ein „pop_density“-Feld unter Verwendung der bestehenden „total_pop“- und „area_km2“-Felder:

    "total_pop" / "area_km2"
    
  • Beschriften oder kategorisieren Sie Objekte auf der Grundlage ihrer Größe:

    CASE WHEN $area > 10 000 THEN 'Larger' ELSE 'Smaller' END
    
  • Aktualisieren Sie das Feld „density_level“ mit zugehörigen Kategorien zu den „pop_density“ Werten:

    CASE WHEN "pop_density" < 50 THEN 'Low population density'
         WHEN "pop_density" >= 50 and "pop_density" < 150 THEN 'Medium population density'
         WHEN "pop_density" >= 150 THEN 'High population density'
    END
    
  • Wenden Sie einen kategorisierten Stil auf alle Objekte an, je nachdem, ob der durchschnittliche Hauspreis kleiner oder größer als 10.000 € pro Quadratmeter ist:

    "price_m2" > 10000
    
  • Mit dem „Objekte über Ausdruck wählen…“ Werkzeug, wählen Sie alle Objekte, die eine Fläche mit „Hoher Bevölkerungsdichte“ und einem durchschnittlichen Hauspreis größer als 10000€ pro Quadratmeter darstellen:

    "density_level" = 'High population density' and "price_m2" > 10000
    

    Der vorherige Ausdruck kann auch verwendet werden, um zu definieren, welche Objekte auf der Karte beschriftet oder angezeigt werden sollen.

  • Wählen Sie Objekte aus dem Layer „lands“ aus, die sich mit dem Zonentyp ( „zone_typ“) natürlich („Natural“) überschneiden:

    overlay_intersects( layer:='lands', filter:="zone_type"='Natural' )
    
  • Zählen Sie für jedes Objekt die Anzahl der Gebäude, die es enthält:

    array_length( overlay_contains( layer:='buildings', expression:=@id ) )
    
  • Erstellen Sie ein anderes Symbol (Typ) für den Layer, indem Sie den Geometriegenerator verwenden:

    point_on_surface( @geometry )
    
  • Erzeugen Sie mit make_line eine geschlossene Linie um ein vorhandenes Punkt-Objekt:

    make_line(
      -- using an array of points placed around the original
      array_foreach(
        -- list of angles for placing the projected points (every 90°)
        array:=generate_series( 0, 360, 90 ),
        -- translate the point 20 units in the given direction (angle)
        expression:=project( @geometry, distance:=20, azimuth:=radians( @element ) )
      )
    )
    
  • Erzeugen Sie in einem Drucklayout Beschriftungen der Objekte „airports“, die sich innerhalb des Layout-Elements „Map 1“ befinden:

    with_variable( 'extent',
                   map_get( item_variables( 'Map 1' ), 'map_extent' ),
                   aggregate( 'airports', 'concatenate', "NAME",
                              intersects( @geometry, @extent ), ' ,'
                            )
                 )
    

13.1.1.4. Ausdrücke speichern

Mit der Schaltfläche fileSave Aktuellen Ausdruck zu Benutzerausdrücken hinzufügen oberhalb des Ausdruckseditor-Rahmens können Sie wichtige Ausdrücke speichern, auf die Sie schnell zugreifen möchten. Diese sind über die Gruppe Benutzerausdrücke im mittleren Bedienfeld verfügbar. Sie werden im Benutzerprofil unter der Datei (<userprofile>/QGIS/QGIS3.ini) gespeichert und sind in allen Ausdrucksdialogen in allen Projekten des aktuellen Benutzerprofils verfügbar.

Eine Reihe von Werkzeugen, die oberhalb des Ausdruckseditors verfügbar sind, hilft Ihnen bei der Verwaltung der Benutzerausdrücke:

  • fileSaveAktuellen Ausdruck zu Benutzerausdrücken hinzufügen: den Ausdruck im Benutzerprofil speichern; zur einfachen Identifizierung können eine Beschreibung und ein Hilfetext hinzugefügt werden.

  • symbologyEdit Gewählten Ausdruck aus Benutzerausdrücken bearbeiten, sowie deren Hilfe und Beschreibung

  • deleteSelected Gewählten Ausdruck aus Benutzerausdrücken löschen

  • sharingImport Benutzerausdrücke importieren aus einer .json-Datei in den Ordner des aktiven Benutzerprofils

  • sharingExport Benutzerausdrücke exportieren als .json-Datei; alle Benutzerausdrücke in der QGIS3.ini-Datei im Benutzerprofil werden gemeinsam genutzt

13.1.2. Funktions Editor

Mit dem Reiter Funktionseditor ist man in der Lage, eigene Funktionen mit Python zu schreiben. Dies bietet einen einfachen und komfortablen Weg, um besondere Anforderungen zu erfüllen, die nicht durch die enthaltenen Funktionen abgedeckt werden.

../../../_images/function_editor.png

Abb. 13.2 Der Funktionseditor Reiter

Um eine neue Funtkion zu erstellen:

  1. Drücken Sie auf die symbologyAdd New File Schaltfläche.

  2. Geben Sie einen Namen in das sich öffnende Formular ein und drücken dann auf OK.

    Ein neues Element mit dem vergebenen Namen wird nun im linken Bedienfeld des Funktionseditor bereitgestellt; dabei handelt es sich um eine Python .py Datei, basierend auf einer QGIS Template-Datei, gespeichert im Ordner /python/expressions im Verzeichnis des aktiven :ref:`user profile `.

  3. Das rechte Bedienfeld stellt den Inhalt der Datei dar: ein Python Skript Template. Aktualisieren den Kode und die Hilfeienträge entsprechend ihrer Erfordernisse.

  4. Drücken Sie auf die Schaltfläche start Lade- und Speicherfunktionen. Die von ihnen geschriebene Funktion wird in der Liste der Funktionen im Reiter Ausdruck in der Voreinstellung in der Gruppe Custom hinzugefügt.

  5. Haben Sie Spaß mit ihrer neuen Funktion.

  6. Wenn die Funktion verbessert werden soll, geht man zum Reiter Funktionseditor, nimmt die Änderungen vor und drückt erneut auf die Schaltfläche start Lade- und Speicherfunktionen. Damit werden die Änderungen in der Datei und somit auch im Reiter Ausdruck verfügbar.

Benutzerdefinierte Pythonfunktionen werden im Profilverzeichnis des Nutzer gespeichert. Das heißt das QGIS beim Start automatische alle Funktionen des aktuellen Nutzerprofils lädt. Beachten Sie, dass neue Funktionen nur im Ordner /python/expressions gespeichert werden und nicht in der Projektdatei. Wenn Sie ein Projekt mit benutzerdefinierten Funktionen verteilen möchten, müssen Sie auch die Datei .py im Ordner /python/expressions mitliefern.

Um eine benutzerdefinierte Funktion zu löschen, gehen Sie wie folgt vor:

  1. Aktivieren Sie den Reiter Funktionseditor

  2. Wählen Sie die Funktion in der Liste aus

  3. Drücken Sie die Taste symbologyRemove Ausgewählte Funktion entfernen. Die Funktion wird aus der Liste entfernt und die zugehörige .py-Datei aus dem Benutzerprofilordner gelöscht.

Beispiel

Hier ist ein kurzes Beispiel, wie Sie Ihre eigene Funktion my_sum erstellen, die mit zwei Werten arbeitet.

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

@qgsfunction(args='auto', group='Custom')
def my_sum(value1, value2, feature, parent):
    """
    Calculates the sum of the two parameters value1 and value2.
    <h2>Example usage:</h2>
    <ul>
      <li>my_sum(5, 8) -> 13</li>
      <li>my_sum("field1", "field2") -> 42</li>
    </ul>
    """
    return value1 + value2

Der Dekorator @qgsfunction akzeptiert die folgenden Argumente:

  • args: die Anzahl der Argumente. Bei Verwendung des Arguments args='auto wird die Anzahl der benötigten Funktionsargumente durch die Anzahl der Argumente berechnet, mit denen die Funktion in Python definiert wurde (minus 2 - Feature und parent). Mit args = -1 wird eine beliebige Anzahl von Argumenten akzeptiert.

  • Das Argument Gruppe gibt die Gruppe an, in der die Funktion im Ausdrucks-Dialog aufgelistet werden soll.

  • usesgeometry=True, wenn der Ausdruck Zugriff auf die Geometrie des Objekts erfordert. Standardmäßig False.

  • handlesnull=True, wenn der Ausdruck eine eigene Behandlung für NULL-Werte hat. Wenn False (Standard), wird das Ergebnis immer NULL sein, sobald ein Parameter NULL ist.

  • referenced_columns=[list]: Ein Array von Attributnamen, die für die Funktion erforderlich sind. Der Standardwert ist [QgsFeatureRequest.ALL_ATTRIBUTES].

Die Funktion selbst erlaubt folgende Argumente:

  • beliebige Anzahl und Art von Parametern, die Sie an Ihre Funktion übergeben wollen, vor die folgenden Argumenten setzen.

  • feature: das aktuelle Objekt

  • parent: das Objekt QgsExpression

  • context: Wenn ein Argument namens context an der letzten Position gefunden wird, wird diese Variable ein QgsExpressionContext Objekt enthalten, das Zugang zu verschiedenen zusätzlichen Informationen wie Ausdrucksvariablen gibt. Z.B. context.variable( 'layer_id' )

Die vorherige Beispielfunktion kann dann in Ausdrücken verwendet werden:

../../../_images/customFunction.png

Abb. 13.3 Benutzerdefinierte Funktion im Reiter Ausdruck

Weitere Informationen über das Erstellen von Python-Kodes können in PyQGIS-Entwicklerkochbuch gefunden werden.