Software-Tipps

Q(GIS)&A – QGIS-Formulare bauen, die mitdenken: Vorgabewerte, bedingte Felder und automatische Zuordnungen

Elisa Schneider aus unserem QGIS-Team hat an einem Proof-of-Concept für ein Projekt gearbeitet, dessen Ziel es war, die Papierdokumentation abzuschaffen und ein QGIS-Plugin für die Verwaltung georeferenzierter Daten aufzubauen. Die Infrastruktur und auch die Entwicklung des Plugins waren wie gewohnt unproblematisch. Das größte Hindernis für diese Migration waren die Daten, die nicht georeferenziert und nicht schematisch dargestellt waren. Um diese beim Umstieg auf eine GDI zu verwenden, müssten sie durch das Zeichnen von Vektorebenen in QGIS digitalisiert werden. Das ist sehr zeitintensiv.

Elisa beschreibt in diesem Blog-Beitrag, welche Funktionen Formulare in QGIS grundsätzlich haben und welche Möglichkeiten es gibt, um den Prozess der Georeferenzierung von Daten zu automatisieren, zu beschleunigen und Fehler zu vermeiden.

1. Grundlagen - Formulare in QGIS

In QGIS dienen Formulare dazu, die Attributdaten eines Layers strukturiert anzuzeigen, zu erfassen und zu bearbeiten. Kurz gesagt: Sie bestimmen, wie Eingabemasken für Features aussehen und funktionieren.

Typische Funktionen von Formularen in QGIS:

  • Anzeige von Attributen: Felder eines Objekts werden übersichtlich in einer Maske dargestellt.
  • Bearbeitung von Daten: Nutzende können Werte einfacher eingeben oder ändern als direkt in der Attributtabelle.
  • Definition benutzerfreundlicher Eingabehilfen, wie z.B. Dropdown-Listen, Kalender für Datumsfelder.
  • Strukturierung komplexer Eingaben: Felder können in Tabs, Gruppen oder Abschnitten organisiert werden.
  • Validierung und Kontrolle: Formulare helfen, Fehleingaben zu vermeiden.
  • Verknüpfung mit Beziehungen: Bei relationalen Daten können verknüpfte Datensätze direkt im Formular angezeigt oder bearbeitet werden.
  • Individuelle Anpassung an Arbeitsprozesse: Formulare können so gestaltet werden, dass sie zu bestimmten Fachanwendungen oder Erfassungsprozessen passen.

In diesem Blogbeitrag wird eine weitere Anwendungsmöglichkeit der QGIS-Formulare ausführlich vorgestellt: Die Automatisierung der Dateneingabe.

2. Georeferenzierung beschleunigen - Formulare mit dynamischen Feldern

In QGIS muss ein Feld oft nur ausgefüllt werden, wenn in einem anderen Feld eine bestimmte Bedingung erfüllt ist. Zum Beispiel muss bei einer Vogelkartierung das Feld „Art“ nur ausgefüllt werden, wenn bei der Kategorie „Beobachtung“ tatsächlich eine Beobachtung vorliegt.

Das lässt sich in QGIS unkompliziert umsetzen:

Abb. 1: Wir öffnen die Einstellungen der Ebene unter Attributformular und ziehen mit der Drag-and-Drop-Funktion (1) die gewünschten Attribute ins Formularlayout – oder entfernen sie mit dem Minuszeichen (2).

Das Feld „Beobachtung" steuert, ob das Feld „Art" sichtb­ar ist oder nicht. Dafür wählen wir für „Beobachtung" den Bedienelement-Typ Kontrollkästchen. Dabei gilt:

Aktivierter Status → Wert = 1

Deaktivierter Status → Wert = 0 ­

Das Feld „Art" wird in einen Gruppenrahmen platziert. Für diesen Gruppenrahmen aktivier­en wir die Option „Sichtbarkeit mit Ausdruck steuern" und tragen folgende Bedingung ein:

"Beobachtung" = 1

Sobald das Kontrollkästchen aktiviert wird, springt der Wert auf 1 – und die Gruppe mit „Art" wird automatisch eingeblendet. Wird es deaktiviert, verschwindet das Feld wieder. Die folgende Abbildung zeigt, wie wir das machen können:

Abb. 2: 1) Neue Gruppe hinzufügen, 2) Gruppenrahmen erstellen 3) „Art" per Drag & Drop in die Gruppe ziehen 4) Feld Sichtbarkeit mit Ausdruck steuern ausfüllen.

Der Ausdruck kann einfach gehalten sein, aber auch komplexere Bedingungen sind möglich. Wenn z. B. die Waldfläche, in der sich der Punkt befindet, größer als 1 ha sein soll, damit wir die Art eingeben können, lautet der Ausdruck:

"Beobachtung" = 1
AND
overlay_nearest('Waldflaeche', $area)[0] > 10000

So funktioniert es:

  • „Beobachtung“ = 1 — prüft, ob das Feld Beobachtung am aktuellen Punkt den Wert 1 hat.
  • overlay_nearest(‚Waldflaeche‘, $area)[0] — ermittelt das nächstgelegene Objekt in der Ebene Waldflaeche und gibt dessen Fläche (in m²) zurück. [0] wählt das erste (nächstgelegene) Ergebnis aus.
  • > 10000 — 1 Hektar = 10.000 m². Damit wird geprüft, ob das nächstgelegene Waldfläche-Polygon größer als 1 ha ist.

Mein Tipp: `$area` gibt Werte in den Quadrat-Einheiten des CRS der Ebene zurück. Stellt sicher, dass das CRS eures Projekts Meter als Maßeinheit verwendet (z. B. EPSG:25832), damit 10.000 m korrekt 1 Hektar entsprechen. Wenn Ihr das CRS Grad benutzt (z. B. EPSG:4326), sollte `area(transform($geometry, layer_property('Waldflaeche','crs'), 'EPSG:25832'))` anstelle von `$area` verwendet werden.

3. Felder automatisch ausfüllen

Am hilfreichsten ist es, wenn die Felder automatisch ausgefüllt werden können. Ich zeige im Folgenden verschiedene (einfache und komplexe) Anwendungsfälle.

A. Fester Standardwert

Die einfachste Möglichkeit ist, einen festen Wert festzulegen, der beim Erstellen eines neuen Features als Standardwert angezeigt wird. Benutzer können diesen Wert ändern: Allerdings beschleunigt sich der Prozess, wenn in den meisten Fällen der Standardwert beibehalten wird.

Abb. 3: Unter „Vorgabewert“ soll der Standardwert eingegeben werden. Mein Tipp: Wenn es sich um einen Text handelt, muss dieser in einfache Anführungszeichen gesetzt werden (z.B. 'Mein Wert').

Wenn das Feld automatisch ausgefüllt wird und vom Nutzer nicht geändert werden soll, kann es auch ganz vom Formular entfernt werden.

Das mag in manchen Fällen nützlich sein, ist aber recht eingeschränkt. Die Kombination aus QGIS-Formularen und Ausdrücken ermöglicht wesentlich dynamischere Optionen. Ich stelle sie im Folgenden dar.

B. Nach Position definierter Wert

Beim Digitalisieren von Geodaten kommt es häufig vor, dass ein Attribut nicht manuell eingetippt, sondern direkt aus der Geometrie des neuen Features abgeleitet werden kann. Zum Beispiel: Welche Koordinaten hat der gerade gesetzte Punkt? Wie lang ist die gezeichnete Linie? Wie groß ist das neue Polygon? Solche Informationen stecken bereits in der Geometrie selbst – wir müssen sie nur abfragen.

Genau dafür bietet QGIS die Möglichkeit, im Attributformular einen Ausdruck als Vorgabewert zu hinterlegen. Statt ein Feld nach dem Anlegen eines Features von Hand auszufüllen, wird der Wert automatisch berechnet – basierend auf den geometrischen Eigenschaften des neuen Features.

Wo wird der Ausdruck eingetragen?

Den Ausdruck konfigurieren wir in den Layer-Eigenschaften unter Attributformulare. Dort wählen wir das gewünschte Feld aus und tragen im Bereich Vorgabewert den entsprechenden Ausdruck ein.

Abb. 4: 1. Attribut auswählen, 2. Im Feld „Vorgabewert" den Ausdruck eintragen – bei komplexeren Ausdrücken empfiehlt es sich, den Ausdruckseditor über die Schaltfläche (3) zu öffnen.

C. Den Wert mithilfe von Attributen anderer Ebenen festlegen

Wenn wir Beobachtungspunkte haben, die wir in verschiedenen Waldgebieten digitalisieren, können wir im Formular festlegen, dass der Name der Fläche automatisch in die Attributtabelle des Punktes eingetragen wird. Der Ausdruck für den Vorgabewert lautet:

overlay_nearest('Waldflaeche', "Name")[0]

So funktioniert es:

  • overlay_nearest('Waldflaeche', "Name") — sucht das nächstgelegene Feature in der Ebene Waldflaeche und gibt den Wert des Feldes "Name" als Array zurück.
  • [0] — wählt das erste (nächstgelegene) Ergebnis aus dem Array.

Dieses Formularfeld kann auch ausgeblendet werden. Dann wird der Wert automatisch ausgefüllt und kann von den Nutzenden nicht geändert werden.

D. Den Wert anhand anderer Objekte derselben Ebene automatisch bestimmen

Für dieses Beispiel nehme ich den Anwendungsfall, an dem ich für den POC gearbeitet habe: ein Netzwerk aus Kabeln zur Messung von Leckagen in Rohrleitungen.

In unserem Kabelnetz gibt es eine Regel: Pro Kabelkreis (Projekt) darf es nur eine Messdose geben – aber beliebig viele Anschlussdosen. Damit beim Erfassen einer neuen Dose nicht jedes Mal manuell nachgeschaut werden muss, übernimmt folgender Ausdruck die Entscheidung automatisch:

array_first(overlay_intersects('Projekte', "project_id"))
dosen_type
with_variable(
    'proj_id',
    array_first(overlay_intersects('Projekte', "project_id"))
    if(
        aggregate(
            layer:='Dosen',
            aggregate:='count',
            expression:="dose_type",
            filter:= "project_id" = @proj_id
                     AND "dose_type" = 'MESSDOSE'
        ) = 0,
        'MESSDOSE',
        'ANSCHLUSSDOSE'
    )
)

Ist im Projekt noch keine Messdose vorhanden, wird automatisch der Typ „Messdose" zugewiesen. Existiert bereits eine, wird der Typ automatisch auf „Anschlussdose" gesetzt.

So funktioniert es:

  • array_first(overlay_intersects('Projekte', "project_id")) — ermittelt die Projekt-ID des Projekts, in dem die neue Dose liegt, und speichert sie in der Variable @proj_id.
  • aggregate(... count ... filter:= "project_id" = @proj_id AND "dose_type" = 'MESSDOSE') — zählt, wie viele Messdosen in diesem Projekt bereits vorhanden sind.
  • if(... = 0, 'MESSDOSE', 'ANSCHLUSSDOSE') — ist das Ergebnis 0, gibt es noch keine Messdose → der Standardwert wird MESSDOSE. Existiert bereits eine, wird automatisch ANSCHLUSSDOSE eingetragen.

E. Den Wert anhand einer Eigenschaft des neuen Objekts festlegen

Anschließend richten wir unser Netzwerk ein und möchten die ID der Messdose als Feld im Netzwerk Ebene dokumentieren. Der Schlüssel liegt in der Funktion `current_value`, mit der wir den Wert eines anderen Feldes übernehmen können. `current_value` übernimmt nur Werte, die Nutzende manuell eingegeben haben – automatisch gesetzte Vorgabewerte werden als `NULL` gelesen. Die Lösung besteht darin, den Standardwert des anderen Feldes bei Bedarf neu zu berechnen. Dafür verwenden wir:

aggregate(
  layer:='Dosen',
  aggregate:='max',
  expression:="dose_id",
  filter:="project_id" =
    CASE
      WHEN current_value('project_id') IS NOT NULL THEN current_value('project_id')
      ELSE
        aggregate(
          layer:='Projekte',
          aggregate:='max',
          expression:="project_id",
          filter:=intersects($geometry, currentExtent())
              AND area(intersection($geometry, currentExtent())) = aggregate(...)
        )
    END
    AND "dose_type" = 'MESSDOSE'
)
  • CASE WHEN current_value('project_id') IS NOT NULL THEN current_value('project_id') — prüft zuerst, ob das Feld project_id im Formular bereits ausgefüllt ist. Wenn ja, wird dieser Wert direkt verwendet.
  • ELSE aggregate(layer:='Projekte', ...) — ist project_id noch leer, wird das aktuelle Projekt automatisch anhand des sichtbaren Kartenausschnitts ermittelt: Es wird das Projekt-Polygon gesucht, das den größten Flächenanteil im aktuellen Kartenfenster hat.
  • aggregate(layer:='Dosen', aggregate:='max', expression:="dose_id", filter:= ... AND "dose_type" = 'MESSDOSE') — sucht im ermittelten Projekt die Dose, deren Typ MESSDOSE ist, und gibt deren dose_id zurück.

Fazit

QGIS-Formulare bieten weit mehr als nur einfache Eingabemasken. Mit Ausdrücken als Vorgabewert, bedingter Sichtbarkeit und Verknüpfungen zwischen den Ebenen lässt sich der Digitalisierungsprozess erheblich beschleunigen – und gleichzeitig die Fehlerquote deutlich senken. Die hier vorgestellten Strategien sind nur ein Ausgangspunkt: Je nach Projektanforderung lassen sich die Ausdrücke beliebig kombinieren und erweitern. Das Ergebnis ist ein Formular, das mitdenkt – und Nutzenden die Arbeit so einfach wie möglich macht.

Über den Autor

Steckbrief

Elisa Schneider studierte Umweltwissenschaften mit den Schwerpunkten GIS und Umweltmodellierung in Freiburg. Seit Dezember 2025 arbeitet sie bei WhereGroup als GIS-Spezialistin. Ihr besonderes Interesse liegt im Umstieg von proprietärer Software auf Open-Source-Lösungen.

Elisa Schneider