Ga naar inhoud
AI Agent
QGIS
Tutorial

Veldberekening in QGIS (Field Calculator): 24 geteste expressies en de valkuilen

Gepubliceerd op

Om een kolom te berekenen in QGIS, open je de attributentabel van de laag, klik je op het pictogram van de Field Calculator (Veldberekening, Ctrl+I), kies je een nieuw of bestaand veld, typ je een expressie en klik je op OK. Dat deel gaat snel. Het lastige deel is wanneer de expressie zonder foutmelding draait en NULL-waarden, vierkante graden of de verkeerde klasse wegschrijft.

Op 7 november 2026 heb ik 24 expressies in de Field Calculator uitgevoerd op echte OpenStreetMap-lagen voor Indiranagar en omliggende wijken in Bengaluru, India (8.709 gebouwen, 854 wegen, 35 scholen, 37 bushaltes, 10 wijken), en daarnaast telkens de veelgemaakte foute versie. Hieronder vind je het kookboek met de exacte uitvoerwaarden, de stille valkuilen gemeten tegen een ellipsoïdische referentie, en wat er gebeurde toen ik de drie lastigste aan een AI-agent binnen QGIS gaf.

Wat is de QGIS Field Calculator?

De QGIS Field Calculator is de ingebouwde tool die kolommen in de attributentabel aanmaakt of bijwerkt met QGIS-expressies. Hij kan geometriewaarden berekenen zoals oppervlakte, lengte en coördinaten, tekst herschrijven, rijen classificeren met CASE WHEN, en tellingen of afstanden ophalen uit andere lagen in je project.

QGIS biedt eigenlijk vier plekken om dezelfde expressies uit te voeren, en de verkeerde kiezen is de eerste manier om werk kwijt te raken:

  • Het Field Calculator-venster (Ctrl+I): bewerkt de laag zelf. Je kunt een nieuwe kolom maken of een bestaande overschrijven, op alle objecten of alleen op de geselecteerde. Je wijzigingen staan in de bewerkingsbuffer tot je ze opslaat.
  • Een virtueel veld (selectievakje in het venster): berekent de expressie live, elke keer dat je de tabel opent of de kaart tekent. Toen ik de footprint van gebouw fid 27 in mijn testlaag verdubbelde, bleef de gewone oppervlaktekolom op 197.355 staan terwijl het virtuele veld bijwerkte naar 789.418. Het addertje: een virtueel veld staat in je .qgs-projectbestand, niet in de GeoPackage of Shapefile. Open je het bestand in een nieuw project, dan is de kolom weg.
  • De Processing-tool "Field calculator" (native:fieldcalculator): schrijft een volledig nieuwe uitvoerlaag en laat je oorspronkelijke laag ongemoeid. Gebruik dit in modellen of als je niet ter plekke wilt bewerken. Let op @row_number, dat hier bij 0 begint en in het venster bij 1.
  • De snelle rekenbalk boven in de attributentabel: werkt een bestaande kolom bij zonder het volledige venster te openen, handig voor een snelle eenregelige expressie als je al in bewerkingsmodus zit.

Een veld berekenen, stap voor stap

Open de Field Calculator

Klik met de rechtermuisknop op je laag en kies Open Attribute Table, en klik dan op het telraampictogram in de werkbalk van de attributentabel. Met de laag geselecteerd in het paneel Lagen opent Ctrl+I de Field Calculator direct.

Controleer de selectie en de veldinstellingen

Als er objecten op je kaart geselecteerd zijn, staat Only update N selected feature(s) standaard aangevinkt. Vink het uit als je de hele laag wilt berekenen. Kies Create a new field (of Update existing field), vul de Output field name in en kies het Output field type (Decimal number (real) voor oppervlaktes en lengtes met decimalen, Integer voor hele tellingen, Text (string) voor labels en klassen).

Schrijf de expressie en controleer de Preview

Typ je expressie in de editor links, of zoek in de functielijst in het midden en dubbelklik om in te voegen. Controleer altijd de Preview-regel onder de editor voordat je op OK klikt. Staat daar een fout, NULL, of een getal dat eruitziet als 0.0000003, verbeter dan de expressie voordat je die naar 8.000 rijen schrijft.

Klik op OK en sla je bewerkingen op

Klik op OK. Stond de laag niet in bewerkingsmodus, dan waarschuwt QGIS dat de bewerkingsmodus automatisch wordt aangezet. Klik na de berekening op het diskettepictogram Save Edits in de werkbalk van de attributentabel, zodat de kolom naar schijf wordt geschreven.

Hier is het venster op de wegenlaag, klaar om een wegklasse te schrijven:

Het QGIS Field Calculator-venster op de wegenlaag van Bengaluru, met Only update 39 selected features aangevinkt, een nieuw tekstveld road_rank, een CASE WHEN-expressie die primaire en secundaire wegen als arterial classificeert, en de Preview die arterial toont.
Het Field Calculator-venster in QGIS 3.44. Let op het selectievakje linksboven: omdat er 39 wegen op het canvas geselecteerd waren, worden alleen die 39 rijen berekend.

Weet je de naam van een functie niet, gebruik dan het zoekvak boven de middelste kolom. Het filtert de functieboom en opent rechts de documentatie, inclusief de volgorde van de parameters en voorbeelden.

De expressiebouwer van de QGIS Field Calculator op de wijkenlaag, zoekend naar overlay_contains in de functielijst, met rechts de syntaxis en argumenten van overlay_contains en een preview die 18 teruggeeft.
Zoeken naar overlay_contains in de functielijst. De Preview onderaan toont 18 scholen in de geselecteerde wijk voordat je de berekening uitvoert.

Het geteste expressiekookboek

Elke expressie hieronder is uitgevoerd in QGIS 3.44.15 op 7 november 2026 op onze OpenStreetMap-lagen van Bengaluru (opgeslagen in EPSG:4326, projectellipsoïde WGS 84). Heb je testdata voor je eigen gebied nodig, dan legt onze gids over OpenStreetMap-data downloaden in QGIS uit hoe je gebouwen, wegen en punten netjes ophaalt.

De voorbeeldwaarden voor gebouwen hieronder komen van gebouwen fid 27, 28, 30, 60 en 62 (met adressen en aantal verdiepingen) en fid 1, 2 en 3 (zonder beide).

Oppervlakte, lengte, omtrek en coördinaten

Wat je wiltTe plakken expressieGetest resultaat op voorbeeldVeelgemaakte foute versie (en wat er gebeurt)
Gebouwoppervlakte in m² (ellipsoïdisch)$area197.35, 110.86, 141.11, 219.71, 318.83area($geometry) geeft 0.0 (ongeveer 3e-7 vierkante graden), zonder fout
Gebouwoppervlakte in m² (geprojecteerd in UTM 43N)area(transform($geometry, 'EPSG:4326', 'EPSG:32643'))197.60, 110.99, 141.29, 219.98, 319.22Transformeren naar 'EPSG:3857' (Web Mercator) blaast de oppervlakte hier met +5,95% op
Weglengte in meter (ellipsoïdisch)$length616.34, 7.99, 1104.32, 9.14, 72.24length($geometry) geeft 0.005681, 0.000074 (graden), zonder fout
Weglengte in meter (geprojecteerd in UTM 43N)length(transform($geometry, 'EPSG:4326', 'EPSG:32643'))616.72, 7.99, 1105.01, 9.14, 72.29Transformeren naar 'EPSG:3857' blaast de weglengte met een mediaan van +3,03% op
Gebouwomtrek in meter$perimeter56.72, 44.97, 48.60, 61.54, 72.69perimeter($geometry) geeft graden op een EPSG:4326-laag
Zwaartepunt X van polygoon (Easting in meter)x(centroid(transform($geometry, 'EPSG:4326', 'EPSG:32643')))786714.46, 786437.79, 786237.28$x op een polygoon geeft NULL zonder fout; x_at($geometry, 0) geeft het eerste hoekpunt (77.642744), niet het midden
Zwaartepunt Y van polygoon (Northing in meter)y(centroid(transform($geometry, 'EPSG:4326', 'EPSG:32643')))1435359.45, 1435116.32, 1436699.32y(centroid($geometry)) geeft graden (12.97...) als de laag in EPSG:4326 staat
Rijnummer of object-ID@row_number of $id1, 2, 3, 4 (venster) of 27 voor $id op fid 27@row_number begint bij 1 in het venster, maar bij 0 in Processing native:fieldcalculator

Schrijf je $area naar een uitvoerveld van het type Integer in plaats van Decimal number (real) (getest met de Processing Field calculator), dan rondt QGIS af naar het dichtstbijzijnde gehele getal (197.35 wordt 197, 110.86 wordt 111) in plaats van af te kappen.

Voorwaardelijke klassen (CASE WHEN en omgaan met NULL)

Wat je wiltTe plakken expressieGetest resultaat op voorbeeldVeelgemaakte foute versie (en wat er gebeurt)
Grootteklasse op basis van oppervlakteCASE WHEN $area < 100 THEN 'small' WHEN $area < 250 THEN 'medium' ELSE 'large' ENDmedium, medium, medium, medium, largeNiet getest
NULL-verdiepingen vervangen door een standaardgetalcoalesce(to_int("building:levels"), 1)4, 4, 2, 4, 3 (en 1 waar levels NULL is)"building:levels" + 'a' geeft '4a' omdat OSM-tags als tekst worden opgeslagen
Hoogteklasse met NULL apart gehoudenCASE 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 (en unknown voor fid 1)Zonder WHEN ... IS NULL valt elke lege rij in ELSE, waardoor 7.636 niet-gekarteerde gebouwen het label 'high' krijgen

Tekst opschonen, opmaken en datums

Wat je wiltTe plakken expressieGetest resultaat op voorbeeldVeelgemaakte foute versie (en wat er gebeurt)
Huisnummer en straat veilig samenvoegenconcat("addr:housenumber", ' ', "addr:street")'594 12th Main Road', '83/4 13th Main Road' (' ' als beide NULL zijn)"addr:housenumber" || ' ' || "addr:street" geeft NULL als een van beide kolommen NULL is
Achtervoegsel (Road, Main, Cross) uit wegnaam halenregexp_replace("name", '\\s+(Road|Main|Cross)$', '')'Chinmaya Mission Hospital', '13th Main', '12th Main'Een enkele backslash \s+ faalt met Invalid regular expression '?+(Road|Main|Cross)$'
Een ID aanvullen met nullen tot 12 cijferslpad(to_string("osm_id"), 12, '0')'000313829229', '000313835091'Niet getest
Een getal opmaken voor weergaveformat_number($area, 1)'197,4', '110,9' ('3 958,7' voor 3958.7 op een Mac met kommanotatie)De uitvoer is tekst die de landinstelling van je besturingssysteem volgt (decimale komma en smalle vaste spatie), dus je kunt er daarna niet mee rekenen
Dagen tussen twee datumsday(age(to_date('2026-11-07'), to_date('2019-03-15')))2794age(...) alleen geeft een QgsInterval-object; to_date('07/11/2026') faalt tenzij je 'dd/MM/yyyy' als tweede argument meegeeft

Let ook op de lengte van je uitvoerveld als je tekst naar een GeoPackage of Shapefile schrijft. Toen ik concat("addr:housenumber", ' ', "addr:street") in Processing naar een tekstveld met lengte 40 schreef, brak de hele berekening af zonder uitvoer, omdat één weg (" 80 Feet Road(Sir C.V. Raman Hospital Road)") 43 tekens lang was.

Ruimtelijke tellingen, sommen en dichtstbijzijnde afstand tussen lagen

Met deze expressies kan de ene laag een andere laag in je project bevragen zonder een aparte ruimtelijke join in QGIS.

Wat je wiltTe plakken expressieGetest resultaat op voorbeeldVeelgemaakte foute versie (en wat er gebeurt)
Gebouwen tellen die elke wijk rakenaggregate('buildings', 'count', "osm_id", filter:=intersects($geometry, geometry(@parent)))4, 1552, 336, 3141, 79, 402, 1179, 348, 1539, 139Zonder filter:=... krijgt elke wijk het totaal van de hele laag (8709), zonder fout
Totale gebouwoppervlakte in ha per wijkround(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.7Telt volledige footprints op die de wijkgrens raken, dus gebouwen op de grens tellen in beide wijken mee
Scholen tellen binnen elke wijkarray_length(overlay_contains('schools', "osm_id"))0, 2, 3, 18, 0, 0, 7, 3, 2, 0 (som: 35)overlay_contains('schools') zonder tweede argument geeft true of false, geen telling
Afstand in meter tot de dichtstbijzijnde bushaltedistance(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))) geeft 0.001142 (graden)
Bushaltes tellen binnen 300 m van een gebouwaggregate('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)) geeft 37 (elke halte) omdat 300 als 300 graden wordt gelezen

Vijf valkuilen in de Field Calculator die zonder foutmelding misgaan

Ik heb 70 hulpvragen gelezen in de reacties onder QGIS-tutorials op YouTube: 48 waren echte vragen over het schrijven van een expressie, en 8 daarvan gingen over een expressie die ongeldig is, NULL geeft of niets selecteert. Erger is het geval waar niemand naar vraagt, omdat de expressie draait en geloofwaardige getallen wegschrijft. Dit zijn de vijf valkuilen die we op onze data van Bengaluru hebben gemeten.

1. $area vs area($geometry), en wat de projectellipsoïde doet

$area en area($geometry) doen niet dezelfde berekening, en minstens één tutorial uit 2026 beweert dat $area vierkante graden geeft in een geografisch CRS. Dat deed hij niet, in geen van beide projectinstellingen die we testten. Op 7 november 2026 hebben we beide gemeten, plus transform(), over de eerste 200 gebouwen en 200 wegen in onze EPSG:4326-lagen van Bengaluru, tegen een ellipsoïdische WGS 84-referentie (QgsDistanceArea).

  • $area en $length gebruiken de projectellipsoïde (in te stellen onder Project > Properties > General > Measurements). Is de ellipsoïde WGS 84, dan geeft $area nauwkeurige vierkante meters, ook als je laag en project in graden staan (EPSG:4326).
  • Staat de projectellipsoïde op None / Planimetric, dan gaf $area op onze EPSG:4326-laag nog steeds geen vierkante graden. In QGIS 3.44.15 gaf hij vierkante meters die over de 200 gebouwen +3,24% te groot waren.
  • area($geometry) en length($geometry) zijn altijd planimetrisch in het eigen CRS van de laag. Op een EPSG:4326-laag geeft area($geometry) vierkante graden (rond 0.0000003 voor een huis), wat in een standaard decimale kolom afrondt naar 0.0.
  • Transformeren naar Web Mercator (EPSG:3857) vóór area() blaast elk gebouw met +5,95% op, zelfs op de breedtegraad van Bengaluru (13° N), en weglengtes met +3,03%. Transformeren naar de lokale UTM-zone (EPSG:32643) blijft binnen +0,12% van de ellipsoïdische oppervlakte.
Expressie op EPSG:4326-lagen (n = 200 gebouwen, 200 wegen)Mediane fout vs WGS 84-ellipsoïdeMaximale fout
$area (projectellipsoïde WGS 84)0.00%0.00%
$area (projectellipsoïde None)+3.24%+3.25%
$perimeter (projectellipsoïde None)+1.72%+2.25%
$length op wegen (projectellipsoïde None)+1.31%+2.61%
area($geometry)-100.00% (vierkante graden)-100.00%
length($geometry) op wegen-100.00% (graden)-100.00%
area(transform($geometry, 'EPSG:4326', 'EPSG:32643'))+0.12%+0.12%
length(transform($geometry, 'EPSG:4326', 'EPSG:32643')) op wegen+0.06%+0.06%
area(transform($geometry, 'EPSG:4326', 'EPSG:3857'))+5.95%+5.96%
length(transform($geometry, 'EPSG:4326', 'EPSG:3857')) op wegen+3.03%+3.26%

Weet je niet zeker waarom EPSG:4326, EPSG:3857 en UTM-zones zich zo verschillend gedragen, lees dan onze uitleg over wat een CRS is in QGIS.

2. overlay_nearest leest max_distance in laageenheden, niet in meters

De functie overlay_nearest is snel omdat ze een ruimtelijke index gebruikt, en ze heeft een handige parameter max_distance. Maar max_distance wordt altijd gemeten in de coördinaateenheden van de laag.

Staan onze gebouwen en bushaltes in EPSG:4326 (graden) en schrijf je array_length(overlay_nearest('bus_stops', $id, max_distance:=300, limit:=-1)), dan zoekt QGIS naar bushaltes binnen 300 graden. Dat beslaat de hele aarde, dus elk gebouw krijgt 37 (alle 37 bushaltes in de laag). max_distance:=0.003 gokken voor 300 meter werkt ook niet goed, omdat een lengtegraad en een breedtegraad niet even lang zijn in meters: op gebouw fid 62 gaf 0.003 8 haltes in plaats van de werkelijke 7. Projecteer beide lagen eerst naar UTM, of gebruik het patroon aggregate(..., filter:=distance(transform(...))) uit de laatste rij van de ruimtelijke tabel hierboven.

3. NULL-rijen vallen direct in de ELSE-tak van CASE WHEN

In onze dataset van Bengaluru hebben maar 1.073 van de 8.709 gebouwen (12,3%) een building:levels-tag. De andere 7.636 zijn NULL.

Schrijf je CASE WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' END, dan evalueren beide <=-vergelijkingen op een NULL-rij naar onbekend, en valt de rij in ELSE. Zo classificeer je 7.636 niet-gekarteerde gebouwen als hoogbouw, zonder één waarschuwing. Zet altijd WHEN "field" IS NULL THEN 'unknown' als eerste tak (of laat ELSE weg zodat rijen zonder match NULL blijven) als je data gaten heeft.

4. "Only update selected features" laat de rest van de kolom NULL

Zodra er ook maar één object op het kaartcanvas geselecteerd is, vinkt de Field Calculator automatisch Only update N selected feature(s) aan.

Toen ik de 39 primary-wegen in Bengaluru selecteerde en CASE WHEN "highway" IN ('primary', 'secondary') THEN 'arterial' ELSE 'local' END naar een nieuw veld road_rank schreef, schreef QGIS 'arterial' naar die 39 rijen en liet de andere 815 wegen (inclusief alle 28 secondary-wegen die mijn expressie expliciet noemde) op NULL.

De QGIS-attributentabel van de wegenlaag na een Field Calculator-berekening met 39 primaire wegen geselecteerd: primaire rijen tonen road_rank als arterial, secundaire en residentiële rijen tonen NULL, en row_n toont 1, 2, 3 uit @row_number.
Omdat er 39 primaire wegen geselecteerd waren toen het venster openging, kwamen de 28 secundaire wegen en 787 lokale wegen uit op NULL, hoewel de CASE-expressie ze wel afhandelde.

5. Dubbele vs enkele aanhalingstekens (waarom "building" = "yes" NULL geeft)

In QGIS-expressies betekenen dubbele aanhalingstekens " " een veldnaam en enkele aanhalingstekens ' ' een tekstwaarde.

Typ je "building" = "yes", dan zoekt QGIS een kolom building en vergelijkt die met een andere kolom yes. Omdat er geen kolom yes bestaat, evalueert de expressie naar NULL (en de onderliggende QgsExpression-parser meldt Field 'yes' not found). Zo ook: bevat een kolomnaam een dubbele punt, zoals building:levels uit OpenStreetMap, dan faalt het weglaten van de dubbele aanhalingstekens met syntax error, unexpected Unknown_CHARACTER. Dubbelklik je op veldnamen in de lijst Fields and Values, dan worden altijd de juiste aanhalingstekens ingevoegd.

De syntaxis overslaan: dezelfde berekeningen met een AI-agent

$area schrijf je snel met de hand. Een geneste aggregate() met twee transform()-aanroepen, een verwijzing naar de @parent-geometrie en een afstandsfilter is waar mensen op Stack Exchange belanden.

Wij maken AI Agent, een chatpaneel dat in QGIS dockt, dus deze sectie gaat over onze eigen tool. Omdat hij binnen je open QGIS-project draait, bekijkt hij je laagnamen, veldtypes, CRS en unieke waarden voordat hij de Field Calculator of Processing-tools voor je uitvoert.

Op 7 november 2026 gaf ik AI Agent (v1.9.4, Medium effort, Balanced permissions) de drie meerstapsberekeningen uit ons testplan, één zin per chat, op exact dezelfde vijf lagen van Bengaluru in EPSG:4326.

TaakExacte verstuurde promptTijd van de agentResultaat tegen onze onafhankelijke controle
A. Nabijheidstelling"Add a field called bus_stops_300m to the buildings layer with the number of bus stops within 300 metres of each building."39 sGeslaagd. Integer-veld aangemaakt, alle 8.709 gebouwen gevuld, 0 afwijkingen tegen onze telling van footprint tot halte in EPSG:32643 (bereik 0 tot 8).
B. Classificatie + stijl"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 sGeslaagd. 563 low, 442 mid, 68 high (alle 1.073 kloppen met onze regel). De 7.636 rijen zonder verdiepingen bleven NULL en kregen een vierde, grijze categorie "Unknown levels".
C. Scholen en gebouwoppervlakte per wijk"For each ward, add the number of schools and the total building area in hectares."37 sGeslaagd (met een andere methode). school_count klopte voor 10/10 wijken (totaal 35). building_ha klopte met de geknipte footprint-oppervlaktes voor 10/10 wijken (totaal 148,25 ha).

Bij taak A trapte de agent niet in de 300-graden-valkuil van overlay_nearest. Zijn toollog laat zien dat hij beide lagen bekeek, het CRS controleerde, de berekening in metrische eenheden uitvoerde vanaf de gebouwfootprints (niet de zwaartepunten, wat het antwoord voor 667 gebouwen zou hebben veranderd), en de minimum- en maximumwaarden controleerde voordat hij antwoordde.

Het AI Agent-paneel in QGIS na het toevoegen van het veld bus_stops_300m aan 8.709 gebouwen in Bengaluru, met tellingen van 0 tot 8 zonder ontbrekende waarden en de vermelding dat het rechte afstanden zijn van elke gebouwfootprint tot de 37 haltes.
Taak A in AI Agent: 39 seconden om het aantal bushaltes binnen 300 m te berekenen voor 8.709 gebouwen in een EPSG:4326-project, zonder de gradenvalkuil.

Bij taak B controleerde hij eerst de unieke waarden van building:levels, zag dat 7.636 van de 8.709 gebouwen geen aantal verdiepingen hadden, liet die rijen NULL in height_class in plaats van ze in high te laten vallen, en paste een gecategoriseerde stijl met 4 klassen toe op de kaart.

Het AI Agent-paneel en het QGIS-paneel Lagen met het veld height_class gecategoriseerd in low, mid, high en Unknown levels, met een antwoord dat 563 low, 442 mid, 68 high en 7.636 onbekende gebouwen noemt.
Taak B: de agent controleerde eerst de kolom, hield de 7.636 niet-gekarteerde gebouwen uit de ELSE-tak en gaf alle vier groepen een stijl.

De gerenderde kaart laat duidelijk zien waarom controleren op NULL belangrijk is bij OpenStreetMap-data: de grijze gebouwen zijn de 87,7% zonder vastgelegde building:levels-tag.

Gerenderde QGIS-kaart van centraal Indiranagar, Bengaluru, met gebouwen lichtgeel voor low, oranje voor mid, donkerrood voor high en grijs voor onbekende verdiepingen, met daarover wegen en zwarte stippen voor bushaltes.
Centraal Indiranagar gestyled op height_class: 563 low (geel), 442 mid (oranje), 68 high (rood) en 7.636 zonder verdiepingstag in OSM (grijs).

Bij taak C weken de building_ha-getallen van de agent licht af van de rij hectare per wijk in ons kookboek: New Thippasandra kwam uit op 20.151 ha in plaats van 20.292 ha (-0,69%), Jeevan Bhimanagar op -0.14% en Indiranagar op -0.06%. Toen ik naging waarom, bleek de agent een strengere geometrische methode te hebben gebruikt dan mijn intersects()-filter: hij knipte de gebouwpolygonen af op de wijkgrenzen voordat hij de oppervlaktes optelde, zodat gebouwen op een grens niet dubbel in twee wijken meetelden, en hij vermeldde dat in zijn antwoord. Wel liet hij de wijkenlaag in bewerkingsmodus staan met niet-opgeslagen wijzigingen, en zei hij in het antwoord dat de wijzigingen nog niet waren opgeslagen.

Het AI Agent-paneel in QGIS met school_count en building_ha voor elk van de 10 wijken van Bengaluru, met de vermelding dat footprints op de wijkgrenzen zijn geknipt en dat de wijzigingen nog niet zijn opgeslagen.
Taak C: de agent knipte gebouwen op de grens af op de wijkgrenzen voordat hij de hectares optelde, en meldde dat de wijzigingen in de laag nog niet waren opgeslagen.

Dit is de resulterende attributentabel van de wijkenlaag na het opslaan van die wijzigingen:

De QGIS-attributentabel van de 10 wijken van Bengaluru met de nieuwe integer-kolom school_count en de decimale kolom building_ha naast wijknamen zoals Domlur, Indiranagar, New Thippasandra en Ulsoor.
De 10 wijken met school_count (totaal 35) en building_ha (totaal 148,25 ha) toegevoegd.

Drie taken is een kleine steekproef (n = 3), en ik gaf duidelijke prompts die de velden en klassegrenzen noemden, dus zie dit als een demonstratie, niet als een benchmark. Voor eenvoudige formules zoals $area of concat() is het Field Calculator-venster sneller dan een chatbericht typen. Een agent verdient zijn plek bij aggregaties over lagen heen, CRS-transformaties of Processing-ketens met meerdere stappen, of als je anders een PyQGIS-script zou schrijven. Je kunt ook andere assistenten vergelijken op onze QGIS AI-hub.

Hoe we dit hebben gemeten. Alle tests liepen op 7 november 2026 in QGIS 3.44.15-Solothurn op macOS met OpenStreetMap-data voor Indiranagar, Bengaluru (bounding box 12.968, 77.634, 12.986, 77.656, ODbL) in project-CRS EPSG:4326. Elke expressie uit het kookboek is gecontroleerd tegen een onafhankelijke Python- of QgsDistanceArea-berekening op dezelfde object-ID's. Fouten in oppervlakte en lengte zijn gemeten over de eerste 200 gebouwen en 200 wegen op fid tegen QgsDistanceArea met de WGS 84-ellipsoïde (EPSG:7030). AI Agent 1.9.4 draaide op Medium effort en Balanced permissions, in een nieuwe chat per taak. Onze tellingen van YouTube-vragen komen uit 70 hulpvragen onder 59 video's, gefilterd uit een corpus van 25.276 reacties.

Veelgestelde vragen

Waarom is mijn $area-berekening fout of geeft die 0 in QGIS?

Controleer eerst of je area($geometry) hebt getypt in plaats van $area. Op een laag die in graden is opgeslagen (EPSG:4326) geeft area($geometry) vierkante graden (rond 0.0000003 voor een huis), wat in een decimaal veld afrondt naar 0.0. Gebruik $area met je projectellipsoïde op WGS 84 onder Project > Properties > General > Measurements, of herprojecteer de geometrie in de expressie met area(transform($geometry, 'EPSG:4326', 'EPSG:32643')) en je lokale UTM-zone. Vermijd EPSG:3857 (Web Mercator), dat in onze test gebouwoppervlaktes met +5,95% opblies, zelfs op 13° N.

Hoe schrijf ik een IF- of CASE-statement in de QGIS Field Calculator?

Voor twee uitkomsten gebruik je if(condition, value_if_true, value_if_false), bijvoorbeeld if($area < 100, 'small', 'large'). Voor drie of meer klassen gebruik je 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

Zet de IS NULL-controle vooraan. Anders valt elke rij met een lege waarde in ELSE.

Waarom gaf de Field Calculator NULL voor alle of de meeste rijen?

Vier veelvoorkomende oorzaken:

  1. Er was een object op de kaart geselecteerd, dus Only update N selected feature(s) stond aangevinkt en liet elke niet-geselecteerde rij NULL.
  2. Je hebt tekst samengevoegd met || (zoals "addr:housenumber" || ' ' || "addr:street"), waarbij één NULL-invoer het hele resultaat NULL maakt. Gebruik in plaats daarvan concat().
  3. Je zette dubbele aanhalingstekens om een tekstwaarde ("building" = "yes"), waardoor QGIS een kolom yes zoekt. Gebruik enkele aanhalingstekens voor waarden ("building" = 'yes').
  4. Je gebruikte $x of $y op een polygoon- of lijnlaag. $x werkt alleen op punten; gebruik x(centroid($geometry)) voor polygonen.

Hoe bereken ik oppervlakte in hectare in de QGIS Field Calculator?

Zet het Output field type op Decimal number (real), zet Precision op 2 of 3, en voer $area / 10000 in (ervan uitgaande dat de oppervlakte-eenheid van je project vierkante meter is en je projectellipsoïde is ingesteld onder Project > Properties > General). Wil je de opgeslagen waarde zelf afronden op 3 decimalen, gebruik dan round($area / 10000, 3).

Hoe werk ik alleen geselecteerde objecten bij in de Field Calculator?

Selecteer eerst de objecten op het kaartcanvas of in de attributentabel, en open dan de Field Calculator (Ctrl+I). Het selectievakje Only update N selected feature(s) linksboven wordt automatisch aangevinkt. Kies Update existing field, kies de kolom in de keuzelijst, voer je expressie in en klik op OK.

Probeer AI Agent gratis

Doe het in QGIS door erom te vragen

AI Agent voert de taak uit die je beschrijft, in je eigen QGIS-project. Gratis, geen kaart nodig.

Probeer AI Agent gratis
Geschreven doorYvann Barbot
·22 min read