Zum Inhalt springen
AI Agent
QGIS
Tutorial

QGIS Feldrechner (Field Calculator): 24 getestete Ausdrücke und die Fallen

Veröffentlicht am

Um in QGIS eine Spalte zu berechnen, öffnest du die Attributtabelle des Layers, klickst auf das Symbol des Field Calculator (Feldrechner, Ctrl+I), wählst ein neues oder bestehendes Feld, tippst einen Ausdruck ein und klickst auf OK. Dieser Teil geht schnell. Schwierig wird es, wenn der Ausdruck ohne Fehler durchläuft und dabei NULL, Quadratgrad oder die falsche Klasse schreibt.

Am 7. November 2026 habe ich 24 Ausdrücke im Feldrechner auf echten OpenStreetMap Layern für Indiranagar und benachbarte Stadtbezirke in Bengaluru, Indien, ausgeführt (8.709 Gebäude, 854 Straßen, 35 Schulen, 37 Bushaltestellen, 10 Bezirke) und jeweils die übliche falsche Variante daneben laufen lassen. Unten findest du die Sammlung mit den exakten Ausgabewerten, die stillen Fallen, gemessen gegen eine ellipsoidische Referenz, und was passierte, als ich die drei schwierigsten Aufgaben einem KI-Agenten in QGIS übergab.

Was ist der QGIS Feldrechner?

Der QGIS Feldrechner (Field Calculator) ist das eingebaute Werkzeug, das Spalten der Attributtabelle mit QGIS Ausdrücken erstellt oder aktualisiert. Er kann Geometriewerte wie Fläche, Länge und Koordinaten berechnen, Text umschreiben, Zeilen mit CASE WHEN klassifizieren und Zählungen oder Distanzen aus anderen Layern deines Projekts holen.

QGIS bietet dir tatsächlich vier Stellen, an denen dieselben Ausdrücke laufen, und die falsche Wahl ist der erste Weg, Arbeit zu verlieren:

  • Der Dialog Field Calculator (Ctrl+I): bearbeitet den Layer direkt. Du kannst eine neue Spalte anlegen oder eine bestehende überschreiben, für alle Objekte oder nur für die ausgewählten. Deine Änderungen liegen im Bearbeitungspuffer, bis du sie speicherst.
  • Ein virtuelles Feld (Kontrollkästchen im Dialog): berechnet den Ausdruck jedes Mal neu, wenn du die Tabelle öffnest oder die Karte zeichnest. Als ich die Grundfläche von Gebäude fid 27 in meinem Test-Layer verdoppelte, blieb seine normale Flächenspalte bei 197.355, während das virtuelle Feld auf 789.418 sprang. Der Haken: Ein virtuelles Feld lebt in deiner .qgs Projektdatei, nicht im GeoPackage oder Shapefile. Öffnest du die Datei in einem neuen Projekt, ist die Spalte weg.
  • Das Processing Werkzeug "Field calculator" (native:fieldcalculator): schreibt einen ganz neuen Ausgabe-Layer und lässt deinen Original-Layer unberührt. Nutze es in Modellen oder wenn du nicht direkt bearbeiten willst. Achte auf @row_number, das hier bei 0 beginnt und im Dialog bei 1.
  • Die Schnellberechnungsleiste oben in der Attributtabelle: aktualisiert eine bestehende Spalte, ohne den ganzen Dialog zu öffnen, praktisch für einen kurzen Einzeiler, wenn du ohnehin im Bearbeitungsmodus bist.

Ein Feld Schritt für Schritt berechnen

Den Field Calculator öffnen

Klicke mit der rechten Maustaste auf deinen Layer und wähle Open Attribute Table, dann klicke auf das Abakus-Symbol in der Werkzeugleiste der Attributtabelle. Ist der Layer im Layers-Panel ausgewählt, öffnet Ctrl+I den Field Calculator direkt.

Auswahl und Feldeinstellungen prüfen

Sind auf deiner Karte Objekte ausgewählt, ist Only update N selected feature(s) standardmäßig angehakt. Entferne den Haken, wenn der ganze Layer berechnet werden soll. Wähle Create a new field (oder Update existing field), setze den Output field name und wähle den Output field type (Decimal number (real) für Flächen und Längen mit Nachkommastellen, Integer für ganze Zählungen, Text (string) für Beschriftungen und Klassen).

Den Ausdruck schreiben und die Preview prüfen

Tippe deinen Ausdruck in den Editor links oder durchsuche die Funktionsliste in der Mitte und füge per Doppelklick ein. Prüfe vor dem Klick auf OK immer die Zeile Preview unter dem Editor. Zeigt sie einen Fehler, NULL oder eine Zahl wie 0.0000003, korrigiere den Ausdruck, bevor du ihn in 8.000 Zeilen schreibst.

Auf OK klicken und die Änderungen speichern

Klicke auf OK. War der Layer nicht im Bearbeitungsmodus, warnt QGIS dich, dass der Bearbeitungsmodus automatisch eingeschaltet wird. Wenn die Berechnung fertig ist, klicke auf das Disketten-Symbol Save Edits in der Werkzeugleiste der Attributtabelle, damit die Spalte auf die Festplatte geschrieben wird.

Hier ist der Dialog auf dem Straßen-Layer, bereit, eine Straßenklasse zu schreiben:

Der QGIS Dialog Field Calculator auf dem Straßen-Layer von Bengaluru, mit angehaktem Only update 39 selected features, einem neuen Textfeld road_rank, einem CASE WHEN Ausdruck, der primary und secondary Straßen als arterial einstuft, und der Preview mit arterial.
Der Dialog Field Calculator in QGIS 3.44. Beachte das Kontrollkästchen oben links: Weil auf der Karte 39 Straßen ausgewählt waren, werden nur diese 39 Zeilen berechnet.

Wenn du den Namen einer Funktion nicht kennst, nutze das Suchfeld über der mittleren Spalte. Es filtert den Funktionsbaum und öffnet rechts die Dokumentation, mit Reihenfolge der Parameter und Beispielen.

Der Ausdruckseditor des QGIS Field Calculator auf dem Bezirks-Layer, mit einer Suche nach overlay_contains in der Funktionsliste, dem rechten Panel mit Syntax und Argumenten von overlay_contains und einer Preview, die 18 liefert.
Suche nach overlay_contains in der Funktionsliste. Die Preview unten zeigt 18 Schulen im ausgewählten Bezirk, noch bevor du die Berechnung startest.

Die getestete Ausdrucks-Sammlung

Jeder Ausdruck unten lief am 7. November 2026 in QGIS 3.44.15 auf unseren OpenStreetMap Layern von Bengaluru (gespeichert in EPSG:4326, Projektellipsoid WGS 84). Wenn du Testdaten für dein eigenes Gebiet brauchst, zeigt unsere Anleitung, wie du OpenStreetMap Daten in QGIS herunterlädst, wie du Gebäude, Straßen und Punkte sauber holst.

Die Beispielwerte für Gebäude unten stammen von den Gebäuden fid 27, 28, 30, 60 und 62 (mit Adresse und Geschosszahl) und fid 1, 2 und 3 (mit keinem von beiden).

Fläche, Länge, Umfang und Koordinaten

Was du willstAusdruck zum EinfügenGetestetes Ergebnis am BeispielÜbliche falsche Variante (und was passiert)
Gebäudefläche in m² (ellipsoidisch)$area197.35, 110.86, 141.11, 219.71, 318.83area($geometry) liefert 0.0 (etwa 3e-7 Quadratgrad), ohne Fehler
Gebäudefläche in m² (projiziert in UTM 43N)area(transform($geometry, 'EPSG:4326', 'EPSG:32643'))197.60, 110.99, 141.29, 219.98, 319.22Eine Transformation nach 'EPSG:3857' (Web Mercator) bläht die Fläche hier um +5,95 % auf
Straßenlänge in Metern (ellipsoidisch)$length616.34, 7.99, 1104.32, 9.14, 72.24length($geometry) liefert 0.005681, 0.000074 (Grad), ohne Fehler
Straßenlänge in Metern (projiziert in UTM 43N)length(transform($geometry, 'EPSG:4326', 'EPSG:32643'))616.72, 7.99, 1105.01, 9.14, 72.29Eine Transformation nach 'EPSG:3857' bläht die Straßenlänge im Median um +3,03 % auf
Gebäudeumfang in Metern$perimeter56.72, 44.97, 48.60, 61.54, 72.69perimeter($geometry) liefert auf einem EPSG:4326 Layer Grad
X des Polygon-Schwerpunkts (Rechtswert in Metern)x(centroid(transform($geometry, 'EPSG:4326', 'EPSG:32643')))786714.46, 786437.79, 786237.28$x auf einem Polygon liefert NULL ohne Fehler; x_at($geometry, 0) liefert den ersten Stützpunkt (77.642744), nicht die Mitte
Y des Polygon-Schwerpunkts (Hochwert in Metern)y(centroid(transform($geometry, 'EPSG:4326', 'EPSG:32643')))1435359.45, 1435116.32, 1436699.32y(centroid($geometry)) liefert Grad (12.97...), wenn der Layer in EPSG:4326 ist
Zeilennummer oder Objekt-ID@row_number oder $id1, 2, 3, 4 (Dialog) oder 27 für $id bei fid 27@row_number beginnt im GUI-Dialog bei 1, im Processing Werkzeug native:fieldcalculator aber bei 0

Schreibst du $area in ein Ausgabefeld vom Typ Integer statt Decimal number (real) (getestet mit dem Processing Field calculator), rundet QGIS auf die nächste ganze Zahl (197.35 wird 197, 110.86 wird 111), statt abzuschneiden.

Bedingte Klassen (CASE WHEN und Umgang mit NULL)

Was du willstAusdruck zum EinfügenGetestetes Ergebnis am BeispielÜbliche falsche Variante (und was passiert)
Größenklasse aus der FlächeCASE WHEN $area < 100 THEN 'small' WHEN $area < 250 THEN 'medium' ELSE 'large' ENDmedium, medium, medium, medium, largeNicht getestet
NULL-Geschosse durch eine Standard-Ganzzahl ersetzencoalesce(to_int("building:levels"), 1)4, 4, 2, 4, 3 (und 1, wo levels NULL ist)"building:levels" + 'a' liefert '4a', weil OSM-Tags als Textstrings gespeichert sind
Höhenklasse mit separat gehaltenen NULLsCASE WHEN to_int("building:levels") IS NULL THEN 'unknown' WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' ENDmid, mid, low, mid, mid (und unknown für fid 1)Ohne WHEN ... IS NULL landet jede leere Zeile in ELSE, und 7.636 nicht erfasste Gebäude werden als 'high' eingestuft

Text bereinigen, formatieren und Datumswerte

Was du willstAusdruck zum EinfügenGetestetes Ergebnis am BeispielÜbliche falsche Variante (und was passiert)
Hausnummer und Straße sicher verbindenconcat("addr:housenumber", ' ', "addr:street")'594 12th Main Road', '83/4 13th Main Road' (' ', wenn beide NULL sind)"addr:housenumber" || ' ' || "addr:street" liefert NULL, sobald eine der Spalten NULL ist
Suffix (Road, Main, Cross) vom Straßennamen entfernenregexp_replace("name", '\\s+(Road|Main|Cross)$', '')'Chinmaya Mission Hospital', '13th Main', '12th Main'Ein einfacher Backslash \s+ scheitert mit Invalid regular expression '?+(Road|Main|Cross)$'
Eine ID auf 12 Stellen mit Nullen auffüllenlpad(to_string("osm_id"), 12, '0')'000313829229', '000313835091'Nicht getestet
Eine Zahl für die Anzeige formatierenformat_number($area, 1)'197,4', '110,9' ('3 958,7' für 3958.7 auf einem Mac mit Komma-Gebietsschema)Die Ausgabe ist Text, der dem Gebietsschema deines Betriebssystems folgt (Dezimalkomma und schmales geschütztes Leerzeichen), du kannst danach also nicht mehr damit rechnen
Tage zwischen zwei Datumswertenday(age(to_date('2026-11-07'), to_date('2019-03-15')))2794age(...) allein liefert ein QgsInterval Objekt; to_date('07/11/2026') scheitert, wenn du nicht 'dd/MM/yyyy' als zweites Argument übergibst

Achte auch auf die Länge des Ausgabefelds, wenn du Text in ein GeoPackage oder Shapefile schreibst. Als ich concat("addr:housenumber", ' ', "addr:street") in Processing in ein Textfeld der Länge 40 schrieb, brach der ganze Lauf ohne Ausgabe ab, weil eine Straße (" 80 Feet Road(Sir C.V. Raman Hospital Road)") 43 Zeichen lang war.

Räumliche Zählungen, Summen und nächste Distanz über Layer hinweg

Mit diesen Ausdrücken fragt ein Layer einen anderen Layer deines Projekts ab, ohne einen separaten Spatial Join in QGIS.

Was du willstAusdruck zum EinfügenGetestetes Ergebnis am BeispielÜbliche falsche Variante (und was passiert)
Gebäude zählen, die jeden Bezirk berührenaggregate('buildings', 'count', "osm_id", filter:=intersects($geometry, geometry(@parent)))4, 1552, 336, 3141, 79, 402, 1179, 348, 1539, 139Ohne filter:=... bekommt jeder Bezirk die Gesamtzahl des ganzen Layers (8709), ohne Fehler
Gesamte Gebäudefläche in ha pro Bezirkround(aggregate('buildings', 'sum', $area, filter:=intersects($geometry, geometry(@parent))) / 10000, 3)0.565, 20.292, 5.605, 59.116, 1.037, 14.094, 16.646, 7.991, 21.39, 1.7Summiert ganze Grundflächen, die die Bezirksgrenze berühren, sodass Grenzgebäude in beiden Bezirken zählen
Schulen in jedem Bezirk zählenarray_length(overlay_contains('schools', "osm_id"))0, 2, 3, 18, 0, 0, 7, 3, 2, 0 (Summe: 35)overlay_contains('schools') ohne zweites Argument liefert true oder false, keine Zahl
Distanz in Metern zur nächsten Bushaltestelledistance(transform($geometry, 'EPSG:4326', 'EPSG:32643'), transform(array_first(overlay_nearest('bus_stops', $geometry)), 'EPSG:4326', 'EPSG:32643'))125.17, 49.39, 199.59, 158.39, 187.97, 74.67, 123.00, 226.61distance($geometry, array_first(overlay_nearest('bus_stops', $geometry))) liefert 0.001142 (Grad)
Bushaltestellen im Umkreis von 300 m eines Gebäudes zählenaggregate('bus_stops', 'count', "osm_id", filter:=distance(transform($geometry, 'EPSG:4326', 'EPSG:32643'), transform(geometry(@parent), 'EPSG:4326', 'EPSG:32643')) <= 300)1, 1, 4, 2, 2, 6, 7, 7array_length(overlay_nearest('bus_stops', $id, max_distance:=300, limit:=-1)) liefert 37 (jede Haltestelle), weil 300 als 300 Grad gelesen wird

Fünf Fallen im Feldrechner, die ohne Fehlermeldung scheitern

Ich habe 70 Hilfekommentare unter QGIS Tutorials auf YouTube gelesen: 48 waren echte Fragen zum Schreiben eines Ausdrucks, und 8 davon betrafen einen Ausdruck, der ungültig ist, NULL liefert oder nichts auswählt. Schlimmer ist der Fall, nach dem niemand fragt, weil der Ausdruck läuft und plausible Zahlen schreibt. Hier sind die fünf Fallen, die wir an unseren Daten aus Bengaluru gemessen haben.

1. $area gegen area($geometry), und was das Projektellipsoid bewirkt

$area und area($geometry) rechnen nicht dasselbe, und mindestens ein Tutorial von 2026 behauptet, $area liefere in einem geografischen KBS Quadratgrad. Das tat es in keiner der beiden getesteten Projekteinstellungen. Am 7. November 2026 haben wir beides, dazu transform(), an den ersten 200 Gebäuden und 200 Straßen unserer EPSG:4326 Layer von Bengaluru gegen eine ellipsoidische WGS 84 Referenz (QgsDistanceArea) gemessen.

  • $area und $length nutzen das Projektellipsoid (eingestellt unter Project > Properties > General > Measurements). Ist das Ellipsoid WGS 84, liefert $area genaue Quadratmeter, selbst wenn Layer und Projekt in Grad sind (EPSG:4326).
  • Ist das Projektellipsoid auf None / Planimetric gesetzt, lieferte $area auf unserem EPSG:4326 Layer trotzdem keine Quadratgrad. In QGIS 3.44.15 gab es Quadratmeter zurück, die über die 200 Gebäude hinweg um +3,24 % zu groß waren.
  • area($geometry) und length($geometry) sind immer planimetrisch im eigenen KBS des Layers. Auf einem EPSG:4326 Layer liefert area($geometry) Quadratgrad (etwa 0.0000003 für ein Haus), was in einer normalen Dezimalspalte auf 0.0 gerundet wird.
  • Eine Transformation nach Web Mercator (EPSG:3857) vor area() bläht jedes Gebäude um +5,95 % auf, selbst auf der Breite von Bengaluru (13° N), und Straßenlängen um +3,03 %. Eine Transformation in die lokale UTM-Zone (EPSG:32643) bleibt innerhalb von +0,12 % der ellipsoidischen Fläche.
Ausdruck auf EPSG:4326 Layern (n = 200 Gebäude, 200 Straßen)Median-Fehler gegen WGS 84 EllipsoidMax. Fehler
$area (Projektellipsoid WGS 84)0.00%0.00%
$area (Projektellipsoid None)+3.24%+3.25%
$perimeter (Projektellipsoid None)+1.72%+2.25%
$length auf Straßen (Projektellipsoid None)+1.31%+2.61%
area($geometry)-100.00% (Quadratgrad)-100.00%
length($geometry) auf Straßen-100.00% (Grad)-100.00%
area(transform($geometry, 'EPSG:4326', 'EPSG:32643'))+0.12%+0.12%
length(transform($geometry, 'EPSG:4326', 'EPSG:32643')) auf Straßen+0.06%+0.06%
area(transform($geometry, 'EPSG:4326', 'EPSG:3857'))+5.95%+5.96%
length(transform($geometry, 'EPSG:4326', 'EPSG:3857')) auf Straßen+3.03%+3.26%

Wenn dir unklar ist, warum sich EPSG:4326, EPSG:3857 und UTM-Zonen so unterschiedlich verhalten, lies unsere Erklärung, was ein KBS in QGIS ist.

2. overlay_nearest liest max_distance in Layer-Einheiten, nicht in Metern

Die Funktion overlay_nearest ist schnell, weil sie einen räumlichen Index nutzt, und sie hat einen praktischen Parameter max_distance. Aber max_distance wird immer in den Koordinateneinheiten des Layers gemessen.

Liegen unsere Gebäude und Bushaltestellen in EPSG:4326 (Grad) und du schreibst array_length(overlay_nearest('bus_stops', $id, max_distance:=300, limit:=-1)), sucht QGIS nach Bushaltestellen im Umkreis von 300 Grad. Das deckt die ganze Erde ab, also bekommt jedes einzelne Gebäude 37 (alle 37 Bushaltestellen des Layers). Auch max_distance:=0.003 für 300 Meter zu raten funktioniert nicht sauber, weil ein Längengrad und ein Breitengrad nicht gleich viele Meter lang sind: Bei Gebäude fid 62 lieferte 0.003 8 Haltestellen statt der echten 7. Projiziere entweder beide Layer vorher nach UTM oder nutze das Muster aggregate(..., filter:=distance(transform(...))) aus der letzten Zeile der räumlichen Tabelle oben.

3. NULL-Zeilen fallen direkt in den ELSE-Zweig von CASE WHEN

In unserem Datensatz aus Bengaluru haben nur 1.073 der 8.709 Gebäude (12,3 %) einen Tag building:levels. Die übrigen 7.636 sind NULL.

Schreibst du CASE WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' END, ergeben beide <= Vergleiche auf einer NULL-Zeile "unbekannt", und die Zeile fällt in ELSE. Am Ende stufst du 7.636 nicht erfasste Gebäude als Hochhäuser ein, ohne eine einzige Warnung. Setze immer WHEN "field" IS NULL THEN 'unknown' als ersten Zweig (oder lass ELSE weg, damit nicht passende Zeilen NULL bleiben), wenn deine Daten Lücken haben.

4. "Only update selected features" lässt den Rest der Spalte NULL

Sobald auch nur ein Objekt auf der Karte ausgewählt ist, hakt der Field Calculator Only update N selected feature(s) automatisch an.

Als ich die 39 primary Straßen in Bengaluru auswählte und CASE WHEN "highway" IN ('primary', 'secondary') THEN 'arterial' ELSE 'local' END in ein neues Feld road_rank schrieb, setzte QGIS 'arterial' in diese 39 Zeilen und ließ die übrigen 815 Straßen (darunter alle 28 secondary Straßen, die mein Ausdruck ausdrücklich nannte) auf NULL.

Die QGIS Attributtabelle des Straßen-Layers nach einem Field Calculator Lauf mit 39 ausgewählten primary Straßen: primary Zeilen zeigen road_rank als arterial, secondary und residential Zeilen zeigen NULL, und row_n zeigt 1, 2, 3 aus @row_number.
Weil beim Öffnen des Dialogs 39 primary Straßen ausgewählt waren, kamen die 28 secondary Straßen und 787 lokalen Straßen als NULL heraus, obwohl der CASE Ausdruck sie abdeckte.

5. Doppelte gegen einfache Anführungszeichen (warum "building" = "yes" NULL liefert)

In QGIS Ausdrücken bedeuten doppelte Anführungszeichen " " einen Feldnamen und einfache Anführungszeichen ' ' einen Textwert.

Tippst du "building" = "yes", sucht QGIS nach einer Spalte namens building und vergleicht sie mit einer anderen Spalte namens yes. Weil es keine Spalte yes gibt, ergibt der Ausdruck NULL (und der zugrunde liegende QgsExpression Parser meldet Field 'yes' not found). Ebenso scheitert ein Spaltenname mit Doppelpunkt, etwa building:levels aus OpenStreetMap, ohne doppelte Anführungszeichen mit syntax error, unexpected Unknown_CHARACTER. Ein Doppelklick auf Feldnamen in der Liste Fields and Values setzt jedes Mal die richtigen Anführungszeichen.

Die Syntax überspringen: dieselben Berechnungen mit einem KI-Agenten

$area von Hand zu schreiben geht schnell. Ein verschachteltes aggregate() mit zwei transform() Aufrufen, einem Geometriebezug auf @parent und einem Distanzfilter zu schreiben, ist der Punkt, an dem Leute auf Stack Exchange landen.

Wir bauen AI Agent, ein Chat-Panel, das in QGIS andockt, in diesem Abschnitt geht es also um unser eigenes Werkzeug. Weil es in deinem offenen QGIS Projekt läuft, prüft es deine Layernamen, Feldtypen, das KBS und eindeutige Werte, bevor es den Field Calculator oder Processing Werkzeuge für dich ausführt.

Am 7. November 2026 habe ich AI Agent (v1.9.4, Effort Medium, Berechtigungen Balanced) die drei mehrstufigen Berechnungen aus unserem Testplan gegeben, ein Satz pro Chat, auf genau denselben fünf Layern von Bengaluru in EPSG:4326.

AufgabeExakt gesendeter PromptZeit des AgentenErgebnis gegen unsere unabhängige Prüfung
A. Zählung in der Nähe"Add a field called bus_stops_300m to the buildings layer with the number of bus stops within 300 metres of each building."39 sBestanden. Integer-Feld angelegt, alle 8.709 Gebäude gefüllt, 0 Abweichungen gegen unsere Zählung von Grundfläche zu Haltestelle in EPSG:32643 (Bereich 0 bis 8).
B. Klassifizierung + Stil"Class the buildings into low (1 or 2 levels), mid (3 or 4) and high (5 or more) from the building:levels field, store the class in a new field called height_class, and style the buildings by that class."18 sBestanden. 563 low, 442 mid, 68 high (alle 1.073 entsprechen unserer Regel). Die 7.636 Zeilen ohne Geschosse blieben NULL und wurden als vierte, graue Kategorie "Unknown levels" dargestellt.
C. Schulzahl und Gebäudefläche pro Bezirk"For each ward, add the number of schools and the total building area in hectares."37 sBestanden (mit Methodenunterschied). school_count stimmte in 10/10 Bezirken (Summe 35). building_ha stimmte mit den zugeschnittenen Grundflächen in 10/10 Bezirken überein (Summe 148,25 ha).

Bei Aufgabe A tappte der Agent nicht in die 300-Grad-Falle von overlay_nearest. Sein Werkzeugprotokoll zeigt, dass er beide Layer prüfte, das KBS kontrollierte, die Berechnung in metrischen Einheiten von den Gebäudegrundflächen aus durchführte (nicht von Schwerpunkten, was die Antwort bei 667 Gebäuden geändert hätte) und vor der Antwort Minimum und Maximum prüfte.

Das AI Agent Panel in QGIS nach dem Anlegen des Felds bus_stops_300m für 8.709 Gebäude in Bengaluru, mit Zählwerten von 0 bis 8 ohne fehlende Werte und dem Hinweis auf Luftliniendistanzen von jeder Gebäudegrundfläche zu den 37 Haltestellen.
Aufgabe A in AI Agent: 39 Sekunden, um die Zahl der Bushaltestellen im Umkreis von 300 m für 8.709 Gebäude in einem EPSG:4326 Projekt zu berechnen, ohne die Grad-Falle.

Bei Aufgabe B prüfte er zuerst die eindeutigen Werte von building:levels, sah, dass 7.636 der 8.709 Gebäude keine Geschosszahl hatten, ließ diese Zeilen in height_class auf NULL, statt sie in high fallen zu lassen, und legte einen kategorisierten Stil mit 4 Klassen auf die Karte.

Das AI Agent Panel und das QGIS Layers-Panel mit dem Feld height_class, kategorisiert in low, mid, high und Unknown levels, und einer Antwort mit 563 low, 442 mid, 68 high und 7.636 unbekannten Gebäuden.
Aufgabe B: Der Agent prüfte zuerst die Spalte, hielt die 7.636 nicht erfassten Gebäude aus dem ELSE-Zweig heraus und stellte alle vier Gruppen dar.

Die gerenderte Karte macht deutlich, warum die Prüfung auf NULL bei OpenStreetMap Daten zählt: Die grauen Gebäude sind die 87,7 %, für die kein Tag building:levels erfasst ist.

Gerenderte QGIS Karte des zentralen Indiranagar, Bengaluru, mit Gebäuden in Hellgelb für low, Orange für mid, Dunkelrot für high und Grau für unbekannte Geschosse, überlagert von Straßen und schwarzen Punkten für Bushaltestellen.
Zentrales Indiranagar nach height_class: 563 low (gelb), 442 mid (orange), 68 high (rot) und 7.636 ohne Geschoss-Tag in OSM (grau).

Bei Aufgabe C wichen die building_ha Werte des Agenten leicht von der Zeile Hektar pro Bezirk unserer Sammlung ab: New Thippasandra kam auf 20.151 ha statt 20.292 ha (-0,69 %), Jeevan Bhimanagar auf -0.14% und Indiranagar auf -0.06%. Als ich nachsah, warum, hatte der Agent tatsächlich eine strengere geometrische Methode genutzt als mein intersects() Filter: Er schnitt die Gebäudepolygone an den Bezirksgrenzen zu, bevor er ihre Flächen summierte, sodass grenzüberschreitende Gebäude nicht doppelt in zwei Bezirken zählten, und er erwähnte das in seiner Antwort. Den Bezirks-Layer ließ er allerdings im Bearbeitungsmodus mit nicht gespeicherten Änderungen und sagte mir in der Antwort, dass die Änderungen noch nicht gespeichert waren.

Das AI Agent Panel in QGIS mit school_count und building_ha für jeden der 10 Bezirke von Bengaluru und dem Hinweis, dass Grundflächen an den Bezirksgrenzen zugeschnitten wurden und die Änderungen noch nicht gespeichert sind.
Aufgabe C: Der Agent schnitt grenzüberschreitende Gebäude an den Bezirksgrenzen zu, bevor er die Hektar summierte, und wies darauf hin, dass die Änderungen am Layer noch nicht gespeichert waren.

Hier ist die Attributtabelle des Bezirks-Layers, nachdem diese Änderungen gespeichert wurden:

Die QGIS Attributtabelle der 10 Bezirke von Bengaluru mit der neuen Integer-Spalte school_count und der Dezimalspalte building_ha neben Bezirksnamen wie Domlur, Indiranagar, New Thippasandra und Ulsoor.
Die 10 Bezirke mit hinzugefügtem school_count (Summe 35) und building_ha (Summe 148,25 ha).

Drei Aufgaben sind eine kleine Stichprobe (n = 3), und ich habe klare Prompts gegeben, die Felder und Klassengrenzen nannten, sieh das also als Demonstration und nicht als Benchmark. Für einfache Formeln wie $area oder concat() ist der Dialog Field Calculator schneller, als eine Chatnachricht zu tippen. Seinen Platz verdient ein Agent bei layerübergreifenden Aggregaten, KBS-Transformationen oder mehrstufigen Processing Ketten, oder wenn du sonst ein PyQGIS Skript schreiben würdest. Andere Assistenten kannst du auf unserem QGIS AI Hub vergleichen.

So haben wir gemessen. Alle Tests liefen am 7. November 2026 in QGIS 3.44.15-Solothurn auf macOS mit OpenStreetMap Daten für Indiranagar, Bengaluru (Begrenzungsrahmen 12.968, 77.634, 12.986, 77.656, ODbL) im Projekt-KBS EPSG:4326. Jeder Ausdruck der Sammlung wurde gegen eine unabhängige Berechnung in Python oder mit QgsDistanceArea an denselben Objekt-IDs geprüft. Flächen- und Längenfehler wurden an den ersten 200 Gebäuden und 200 Straßen nach fid gegen QgsDistanceArea mit dem Ellipsoid WGS 84 (EPSG:7030) gemessen. AI Agent 1.9.4 lief mit Effort Medium und Berechtigungen Balanced, in einem neuen Chat pro Aufgabe. Unsere Zahlen zu YouTube-Fragen stammen aus 70 Hilfekommentaren unter 59 Videos, gefiltert aus einem Korpus von 25.276 Kommentaren.

Häufige Fragen

Warum ist meine $area Berechnung in QGIS falsch oder liefert 0?

Prüfe zuerst, ob du area($geometry) statt $area getippt hast. Auf einem Layer in Grad (EPSG:4326) liefert area($geometry) Quadratgrad (etwa 0.0000003 für ein Haus), was in einem Dezimalfeld auf 0.0 gerundet wird. Nutze $area mit dem Projektellipsoid WGS 84 unter Project > Properties > General > Measurements, oder projiziere die Geometrie im Ausdruck mit area(transform($geometry, 'EPSG:4326', 'EPSG:32643')) in deine lokale UTM-Zone. Meide EPSG:3857 (Web Mercator), das in unserem Test Gebäudeflächen selbst bei 13° N um +5,95 % aufblähte.

Wie schreibe ich eine IF- oder CASE-Anweisung im QGIS Feldrechner?

Für zwei Ergebnisse nutzt du if(condition, value_if_true, value_if_false), zum Beispiel if($area < 100, 'small', 'large'). Für drei oder mehr Klassen nutzt du CASE WHEN ... THEN ... ELSE ... END:

CASE WHEN to_int("building:levels") IS NULL THEN 'unknown' WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' END

Setze die Prüfung IS NULL an den Anfang. Sonst fällt jede Zeile mit leerem Wert in ELSE.

Warum hat der Feldrechner für alle oder die meisten Zeilen NULL geliefert?

Vier häufige Ursachen:

  1. Ein Objekt war auf der Karte ausgewählt, also war Only update N selected feature(s) angehakt und jede nicht ausgewählte Zeile blieb NULL.
  2. Du hast Text mit || verbunden (etwa "addr:housenumber" || ' ' || "addr:street"), wobei ein einziger NULL-Wert das ganze Ergebnis zu NULL macht. Nutze stattdessen concat().
  3. Du hast doppelte Anführungszeichen um einen Textwert gesetzt ("building" = "yes"), womit QGIS eine Spalte namens yes sucht. Nutze einfache Anführungszeichen für Werte ("building" = 'yes').
  4. Du hast $x oder $y auf einem Polygon- oder Linien-Layer genutzt. $x funktioniert nur bei Punkten; nutze x(centroid($geometry)) für Polygone.

Wie berechne ich die Fläche in Hektar im QGIS Feldrechner?

Setze den Output field type auf Decimal number (real), setze Precision auf 2 oder 3 und gib $area / 10000 ein (vorausgesetzt, die Flächeneinheit deines Projekts ist Quadratmeter und dein Projektellipsoid ist unter Project > Properties > General eingestellt). Um den gespeicherten Wert selbst auf 3 Nachkommastellen zu runden, nutze round($area / 10000, 3).

Wie aktualisiere ich im Feldrechner nur ausgewählte Objekte?

Wähle zuerst die Objekte auf der Karte oder in der Attributtabelle aus und öffne dann den Field Calculator (Ctrl+I). Das Kontrollkästchen Only update N selected feature(s) oben links ist dann automatisch angehakt. Wähle Update existing field, wähle die Spalte aus der Dropdown-Liste, gib deinen Ausdruck ein und klicke auf OK.

AI Agent kostenlos testen

Erledigen Sie es in QGIS, indem Sie darum bitten

AI Agent führt die beschriebene Aufgabe in Ihrem eigenen QGIS-Projekt aus. Kostenlos, ohne Karte.

AI Agent kostenlos testen
Geschrieben vonYvann Barbot
·21 min read