Vai al contenuto
AI Agent
QGIS
Tutorial

Calcolatore di campi QGIS: 24 espressioni testate e le trappole

Pubblicato il

Per calcolare una colonna in QGIS, apri la tabella degli attributi del layer, clicca l'icona del Field Calculator (Calcolatore di campi, Ctrl+I), scegli un campo nuovo o esistente, scrivi un'espressione e clicca OK. Questa parte è veloce. La parte difficile arriva quando l'espressione gira senza errori e scrive NULL, gradi quadrati o la classe sbagliata.

Il 7 novembre 2026 ho eseguito 24 espressioni del calcolatore di campi su layer OpenStreetMap reali di Indiranagar e dei quartieri vicini a Bengaluru, in India (8.709 edifici, 854 strade, 35 scuole, 37 fermate dell'autobus, 10 circoscrizioni), e accanto a ciascuna ho eseguito la versione sbagliata più comune. Qui sotto trovi il ricettario con i valori esatti in uscita, le trappole silenziose misurate rispetto a un riferimento ellissoidico e cosa è successo quando ho affidato le tre più difficili a un agente IA dentro QGIS.

Che cos'è il Field Calculator di QGIS?

Il Field Calculator di QGIS è lo strumento integrato che crea o aggiorna le colonne della tabella degli attributi usando le espressioni di QGIS. Può calcolare valori geometrici come area, lunghezza e coordinate, riscrivere testo, classificare righe con CASE WHEN e ricavare conteggi o distanze da altri layer del progetto.

In realtà QGIS offre quattro posti dove eseguire le stesse espressioni, e scegliere quello sbagliato è il primo modo per perdere lavoro:

  • La finestra del Field Calculator (Ctrl+I): modifica il layer sul posto. Puoi creare una nuova colonna o sovrascriverne una esistente, su tutte le geometrie o solo su quelle selezionate. Le modifiche restano nel buffer di modifica finché non le salvi.
  • Un campo virtuale (casella dentro la finestra): calcola l'espressione al volo ogni volta che apri la tabella o disegni la mappa. Quando ho raddoppiato l'impronta dell'edificio fid 27 nel mio layer di test, la sua colonna di area normale è rimasta a 197.355 mentre il campo virtuale è passato a 789.418. Il problema è che un campo virtuale vive nel file di progetto .qgs, non nel GeoPackage o nello Shapefile. Apri il file in un progetto nuovo e la colonna sparisce.
  • Lo strumento Processing "Field calculator" (native:fieldcalculator): scrive un layer di output nuovo e lascia intatto il layer originale. Usalo nei modelli o quando non vuoi modificare sul posto. Attenzione a @row_number, che qui parte da 0 e nella finestra da 1.
  • La barra di calcolo rapido in cima alla tabella degli attributi: aggiorna una colonna esistente senza aprire la finestra completa, utile per una riga veloce quando sei già in modalità modifica.

Come calcolare un campo passo per passo

Apri il Field Calculator

Clicca con il tasto destro sul layer e scegli Open Attribute Table, poi clicca l'icona dell'abaco nella barra degli strumenti della tabella degli attributi. Con il layer selezionato nel pannello Layers, Ctrl+I apre direttamente il Field Calculator.

Controlla la selezione e le impostazioni del campo

Se sulla mappa ci sono geometrie selezionate, Only update N selected feature(s) è spuntata di default. Togli la spunta se vuoi calcolare tutto il layer. Scegli Create a new field (o Update existing field), imposta Output field name e scegli Output field type (Decimal number (real) per aree e lunghezze con decimali, Integer per conteggi interi, Text (string) per etichette e classi).

Scrivi l'espressione e controlla la Preview

Scrivi l'espressione nell'editor a sinistra, oppure cerca nell'elenco delle funzioni al centro e fai doppio clic per inserirla. Controlla sempre la riga Preview sotto l'editor prima di cliccare OK. Se mostra un errore, NULL o un numero tipo 0.0000003, correggi l'espressione prima di scriverla su 8.000 righe.

Clicca OK e salva le modifiche

Clicca OK. Se il layer non era in modalità modifica, QGIS ti avvisa che la attiverà automaticamente. Finito il calcolo, clicca l'icona del floppy Save Edits nella barra degli strumenti della tabella degli attributi, così la colonna viene scritta su disco.

Ecco la finestra sul layer delle strade, pronta a scrivere una classe stradale:

La finestra del Field Calculator di QGIS sul layer delle strade di Bengaluru, con Only update 39 selected features spuntato, un nuovo campo Text chiamato road_rank, un'espressione CASE WHEN che classifica le strade primary e secondary come arterial e la Preview che mostra arterial.
La finestra del Field Calculator in QGIS 3.44. Nota la casella in alto a sinistra: poiché sulla mappa erano selezionate 39 strade, verranno calcolate solo quelle 39 righe.

Quando non conosci il nome di una funzione, usa la casella di ricerca sopra la colonna centrale. Filtra l'albero delle funzioni e apre la documentazione a destra, con l'ordine dei parametri e gli esempi.

Il costruttore di espressioni del Field Calculator di QGIS sul layer delle circoscrizioni, con la ricerca di overlay_contains nell'elenco delle funzioni, il pannello a destra che mostra sintassi e argomenti di overlay_contains e la preview che restituisce 18.
Ricerca di overlay_contains nell'elenco delle funzioni. La Preview in basso mostra 18 scuole dentro la circoscrizione selezionata prima di eseguire il calcolo.

Il ricettario di espressioni testate

Ogni espressione qui sotto è stata eseguita in QGIS 3.44.15 il 7 novembre 2026 sui nostri layer OpenStreetMap di Bengaluru (salvati in EPSG:4326, ellissoide di progetto WGS 84). Se ti servono dati di test per la tua zona, la nostra guida su come scaricare dati OpenStreetMap in QGIS spiega come ottenere edifici, strade e punti in modo pulito.

I valori di esempio degli edifici vengono dagli edifici fid 27, 28, 30, 60 e 62 (che hanno indirizzo e numero di piani) e fid 1, 2 e 3 (che non hanno né l'uno né l'altro).

Area, lunghezza, perimetro e coordinate

Cosa vuoiEspressione da incollareRisultato testato sul campioneVersione sbagliata comune (e cosa succede)
Area dell'edificio in m² (ellissoidica)$area197.35, 110.86, 141.11, 219.71, 318.83area($geometry) restituisce 0.0 (circa 3e-7 gradi quadrati), senza errore
Area dell'edificio in m² (proiettata in UTM 43N)area(transform($geometry, 'EPSG:4326', 'EPSG:32643'))197.60, 110.99, 141.29, 219.98, 319.22Trasformare in 'EPSG:3857' (Web Mercator) gonfia l'area del +5,95% qui
Lunghezza della strada in metri (ellissoidica)$length616.34, 7.99, 1104.32, 9.14, 72.24length($geometry) restituisce 0.005681, 0.000074 (gradi), senza errore
Lunghezza della strada in metri (proiettata in UTM 43N)length(transform($geometry, 'EPSG:4326', 'EPSG:32643'))616.72, 7.99, 1105.01, 9.14, 72.29Trasformare in 'EPSG:3857' gonfia la lunghezza delle strade del +3,03% (mediana)
Perimetro dell'edificio in metri$perimeter56.72, 44.97, 48.60, 61.54, 72.69perimeter($geometry) restituisce gradi su un layer EPSG:4326
X del centroide del poligono (Est in metri)x(centroid(transform($geometry, 'EPSG:4326', 'EPSG:32643')))786714.46, 786437.79, 786237.28$x su un poligono restituisce NULL senza errore; x_at($geometry, 0) restituisce il primo vertice (77.642744), non il centro
Y del centroide del poligono (Nord in metri)y(centroid(transform($geometry, 'EPSG:4326', 'EPSG:32643')))1435359.45, 1435116.32, 1436699.32y(centroid($geometry)) restituisce gradi (12.97...) quando il layer è in EPSG:4326
Numero di riga o ID della geometria@row_number o $id1, 2, 3, 4 (finestra) o 27 per $id su fid 27@row_number parte da 1 nella finestra, ma da 0 nel Processing native:fieldcalculator

Se scrivi $area in un campo di output Integer invece che Decimal number (real) (testato con il Field calculator di Processing), QGIS arrotonda all'intero più vicino (197.35 diventa 197, 110.86 diventa 111) invece di troncare.

Classi condizionali (CASE WHEN e gestione dei NULL)

Cosa vuoiEspressione da incollareRisultato testato sul campioneVersione sbagliata comune (e cosa succede)
Classe dimensionale dall'areaCASE WHEN $area < 100 THEN 'small' WHEN $area < 250 THEN 'medium' ELSE 'large' ENDmedium, medium, medium, medium, largeNon testato
Sostituire i piani NULL con un intero predefinitocoalesce(to_int("building:levels"), 1)4, 4, 2, 4, 3 (e 1 dove i piani sono NULL)"building:levels" + 'a' restituisce '4a' perché i tag OSM sono salvati come stringhe di testo
Classe di altezza con i NULL tenuti a parteCASE 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 (e unknown per fid 1)Saltare WHEN ... IS NULL manda ogni riga vuota in ELSE, etichettando 7.636 edifici non mappati come 'high'

Pulizia del testo, formattazione e date

Cosa vuoiEspressione da incollareRisultato testato sul campioneVersione sbagliata comune (e cosa succede)
Unire numero civico e via in modo sicuroconcat("addr:housenumber", ' ', "addr:street")'594 12th Main Road', '83/4 13th Main Road' (' ' se entrambi NULL)"addr:housenumber" || ' ' || "addr:street" restituisce NULL se una delle due colonne è NULL
Togliere il suffisso (Road, Main, Cross) dal nome della stradaregexp_replace("name", '\\s+(Road|Main|Cross)$', '')'Chinmaya Mission Hospital', '13th Main', '12th Main'Una sola barra rovesciata \s+ fallisce con Invalid regular expression '?+(Road|Main|Cross)$'
Riempire un ID con zeri fino a 12 cifrelpad(to_string("osm_id"), 12, '0')'000313829229', '000313835091'Non testato
Formattare un numero per la visualizzazioneformat_number($area, 1)'197,4', '110,9' ('3 958,7' per 3958.7 su un Mac con locale a virgola)L'output è testo che segue il locale del sistema operativo (virgola decimale e spazio stretto non separabile), quindi dopo non puoi farci calcoli
Giorni tra due dateday(age(to_date('2026-11-07'), to_date('2019-03-15')))2794age(...) da solo restituisce un oggetto QgsInterval; to_date('07/11/2026') fallisce se non passi 'dd/MM/yyyy' come secondo argomento

Fai attenzione anche alla lunghezza del campo di output quando scrivi testo in un GeoPackage o in uno Shapefile. Quando ho eseguito concat("addr:housenumber", ' ', "addr:street") in un campo di testo di lunghezza 40 in Processing, l'intera esecuzione si è interrotta senza output perché una strada (" 80 Feet Road(Sir C.V. Raman Hospital Road)") era lunga 43 caratteri.

Conteggi, somme e distanza minima tra layer

Queste espressioni permettono a un layer di interrogare un altro layer del progetto senza eseguire un join spaziale in QGIS separato.

Cosa vuoiEspressione da incollareRisultato testato sul campioneVersione sbagliata comune (e cosa succede)
Contare gli edifici che toccano ogni circoscrizioneaggregate('buildings', 'count', "osm_id", filter:=intersects($geometry, geometry(@parent)))4, 1552, 336, 3141, 79, 402, 1179, 348, 1539, 139Dimenticare filter:=... dà a ogni circoscrizione il conteggio totale dell'intero layer (8709), senza errore
Area totale degli edifici in ha per circoscrizioneround(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.7Somma le impronte intere che toccano il confine, quindi gli edifici di confine vengono contati in entrambe le circoscrizioni
Contare le scuole dentro ogni circoscrizionearray_length(overlay_contains('schools', "osm_id"))0, 2, 3, 18, 0, 0, 7, 3, 2, 0 (somma: 35)overlay_contains('schools') senza secondo argomento restituisce true o false, non un conteggio
Distanza in metri dalla fermata dell'autobus più vicinadistance(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))) restituisce 0.001142 (gradi)
Contare le fermate dell'autobus entro 300 m da un edificioaggregate('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)) restituisce 37 (tutte le fermate) perché 300 viene letto come 300 gradi

Cinque trappole del calcolatore di campi che falliscono senza errore

Ho letto 70 commenti di richiesta d'aiuto sotto tutorial QGIS su YouTube: 48 erano vere domande su come scrivere un'espressione, e 8 di queste riguardavano un'espressione non valida, che restituisce NULL o non seleziona nulla. Il caso peggiore è quello di cui nessuno chiede, perché l'espressione gira e scrive numeri plausibili. Ecco le cinque trappole che abbiamo misurato sui nostri dati di Bengaluru.

1. $area contro area($geometry), e cosa fa l'ellissoide di progetto

$area e area($geometry) non fanno lo stesso calcolo, e almeno un tutorial del 2026 dice che $area restituisce gradi quadrati in un CRS geografico. Non è successo in nessuna delle due impostazioni di progetto che abbiamo testato. Il 7 novembre 2026 le abbiamo misurate entrambe, più transform(), sui primi 200 edifici e 200 strade dei nostri layer EPSG:4326 di Bengaluru, rispetto a un riferimento ellissoidico WGS 84 (QgsDistanceArea).

  • $area e $length usano l'ellissoide di progetto (impostato in Project > Properties > General > Measurements). Quando l'ellissoide è WGS 84, $area restituisce metri quadrati precisi anche se layer e progetto sono in gradi (EPSG:4326).
  • Quando l'ellissoide di progetto è impostato su None / Planimetric, $area sul nostro layer EPSG:4326 non ha comunque restituito gradi quadrati. In QGIS 3.44.15 ha restituito metri quadrati troppo grandi del +3,24% sui 200 edifici.
  • area($geometry) e length($geometry) sono sempre planimetrici nel CRS del layer. Su un layer EPSG:4326, area($geometry) restituisce gradi quadrati (circa 0.0000003 per una casa), che in una colonna decimale standard si arrotonda a 0.0.
  • Trasformare in Web Mercator (EPSG:3857) prima di area() gonfia ogni edificio del +5,95% anche alla latitudine di Bengaluru (13° N), e gonfia la lunghezza delle strade del +3,03%. Trasformare nella zona UTM locale (EPSG:32643) resta entro il +0,12% dell'area ellissoidica.
Espressione su layer EPSG:4326 (n = 200 edifici, 200 strade)Errore mediano rispetto all'ellissoide WGS 84Errore massimo
$area (ellissoide di progetto WGS 84)0.00%0.00%
$area (ellissoide di progetto None)+3.24%+3.25%
$perimeter (ellissoide di progetto None)+1.72%+2.25%
$length sulle strade (ellissoide di progetto None)+1.31%+2.61%
area($geometry)-100.00% (gradi quadrati)-100.00%
length($geometry) sulle strade-100.00% (gradi)-100.00%
area(transform($geometry, 'EPSG:4326', 'EPSG:32643'))+0.12%+0.12%
length(transform($geometry, 'EPSG:4326', 'EPSG:32643')) sulle strade+0.06%+0.06%
area(transform($geometry, 'EPSG:4326', 'EPSG:3857'))+5.95%+5.96%
length(transform($geometry, 'EPSG:4326', 'EPSG:3857')) sulle strade+3.03%+3.26%

Se non ti è chiaro perché EPSG:4326, EPSG:3857 e le zone UTM si comportano in modo così diverso, leggi la nostra spiegazione su che cos'è un CRS in QGIS.

2. overlay_nearest legge max_distance nelle unità del layer, non in metri

La funzione overlay_nearest è veloce perché usa un indice spaziale, e ha un comodo parametro max_distance. Ma max_distance è sempre misurato nelle unità di coordinate del layer.

Quando edifici e fermate dell'autobus sono in EPSG:4326 (gradi) e scrivi array_length(overlay_nearest('bus_stops', $id, max_distance:=300, limit:=-1)), QGIS cerca fermate entro 300 gradi. Questo copre tutta la Terra, quindi ogni edificio riceve 37 (tutte le 37 fermate del layer). Nemmeno tirare a indovinare max_distance:=0.003 per 300 metri funziona bene, perché un grado di longitudine e un grado di latitudine non hanno la stessa lunghezza in metri: sull'edificio fid 62, 0.003 ha restituito 8 fermate invece delle 7 reali. O riproietti prima entrambi i layer in UTM, oppure usi lo schema aggregate(..., filter:=distance(transform(...))) dell'ultima riga della tabella spaziale qui sopra.

3. Le righe NULL finiscono dritte nel ramo ELSE di CASE WHEN

Nel nostro dataset di Bengaluru, solo 1.073 degli 8.709 edifici (12,3%) hanno un tag building:levels. Gli altri 7.636 sono NULL.

Se scrivi CASE WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' END, entrambi i confronti <= risultano sconosciuti su una riga NULL, e la riga finisce in ELSE. Ti ritrovi a classificare 7.636 edifici non mappati come grattacieli senza un solo avviso. Metti sempre WHEN "field" IS NULL THEN 'unknown' come primo ramo (oppure togli ELSE così le righe senza corrispondenza restano NULL) quando i tuoi dati hanno lacune.

4. "Only update selected features" lascia NULL il resto della colonna

Appena anche una sola geometria è selezionata sulla mappa, il Field Calculator spunta automaticamente Only update N selected feature(s).

Quando ho selezionato le 39 strade primary di Bengaluru ed eseguito CASE WHEN "highway" IN ('primary', 'secondary') THEN 'arterial' ELSE 'local' END in un nuovo campo road_rank, QGIS ha scritto 'arterial' in quelle 39 righe e ha lasciato NULL le altre 815 strade (comprese tutte le 28 strade secondary che la mia espressione nominava esplicitamente).

La tabella degli attributi di QGIS del layer delle strade dopo il Field Calculator con 39 strade primary selezionate: le righe primary mostrano road_rank come arterial, mentre le righe secondary e residential mostrano NULL, e row_n mostra 1, 2, 3 da @row_number.
Poiché all'apertura della finestra erano selezionate 39 strade primary, le 28 strade secondary e le 787 strade locali sono uscite NULL anche se l'espressione CASE le gestiva.

5. Virgolette doppie contro apici singoli (perché "building" = "yes" restituisce NULL)

Nelle espressioni di QGIS, le virgolette doppie " " indicano un nome di campo e gli apici singoli ' ' indicano un valore di testo.

Se scrivi "building" = "yes", QGIS cerca una colonna chiamata building e la confronta con un'altra colonna chiamata yes. Poiché non esiste nessuna colonna yes, l'espressione restituisce NULL (e il parser QgsExpression sottostante segnala Field 'yes' not found). Allo stesso modo, se il nome di una colonna contiene i due punti, come building:levels di OpenStreetMap, togliere le virgolette doppie fallisce con syntax error, unexpected Unknown_CHARACTER. Fare doppio clic sui nomi dei campi nell'elenco Fields and Values inserisce sempre le virgolette giuste.

Saltare la sintassi: gli stessi calcoli con un agente IA

Scrivere $area a mano è veloce. Scrivere un aggregate() annidato con due chiamate transform(), un riferimento alla geometria @parent e un filtro di distanza è il punto in cui si finisce su Stack Exchange.

Noi sviluppiamo AI Agent, un pannello di chat che si aggancia dentro QGIS, quindi questa sezione parla del nostro strumento. Poiché lavora dentro il progetto QGIS aperto, esamina nomi dei layer, tipi di campo, CRS e valori unici prima di eseguire per te il Field Calculator o gli strumenti di Processing.

Il 7 novembre 2026 ho dato ad AI Agent (v1.9.4, sforzo Medium, permessi Balanced) i tre calcoli in più passaggi del nostro piano di test, una frase per chat, sugli stessi cinque layer di Bengaluru in EPSG:4326.

CompitoPrompt esatto inviatoTempo dell'agenteRisultato rispetto al nostro controllo indipendente
A. Conteggio di prossimità"Add a field called bus_stops_300m to the buildings layer with the number of bus stops within 300 metres of each building."39 sSuperato. Campo intero creato, tutti gli 8.709 edifici compilati, 0 discrepanze rispetto al nostro conteggio impronta-fermata in EPSG:32643 (intervallo da 0 a 8).
B. Classificazione + stile"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 sSuperato. 563 low, 442 mid, 68 high (tutti i 1.073 corrispondono alla nostra regola). Le 7.636 righe senza piani sono rimaste NULL e hanno ricevuto lo stile di una quarta categoria grigia "Unknown levels".
C. Conteggio scuole e area edificata per circoscrizione"For each ward, add the number of schools and the total building area in hectares."37 sSuperato (con una differenza di metodo). school_count corrisponde in 10/10 circoscrizioni (totale 35). building_ha corrisponde alle aree delle impronte ritagliate in 10/10 circoscrizioni (totale 148,25 ha).

Nel compito A, l'agente non è caduto nella trappola dei 300 gradi di overlay_nearest. Il suo log degli strumenti mostra che ha esaminato entrambi i layer, controllato il CRS, eseguito il calcolo in unità metriche partendo dalle impronte degli edifici (non dai centroidi, che avrebbero cambiato la risposta su 667 edifici) e verificato i valori minimo e massimo prima di rispondere.

Il pannello AI Agent in QGIS dopo aver aggiunto il campo bus_stops_300m a 8.709 edifici di Bengaluru, con conteggi da 0 a 8 senza valori mancanti e la nota che le distanze sono in linea retta da ogni impronta di edificio alle 37 fermate.
Compito A in AI Agent: 39 secondi per calcolare il numero di fermate entro 300 m su 8.709 edifici in un progetto EPSG:4326, senza la trappola dei gradi.

Nel compito B, ha prima controllato i valori unici di building:levels, ha visto che 7.636 degli 8.709 edifici non avevano il numero di piani, ha lasciato quelle righe NULL in height_class invece di farle finire in high e ha applicato sulla mappa uno stile categorizzato a 4 classi.

Il pannello AI Agent e il pannello Layers di QGIS con il campo height_class categorizzato in low, mid, high e Unknown levels, e la risposta che elenca 563 edifici low, 442 mid, 68 high e 7.636 sconosciuti.
Compito B: l'agente ha prima controllato la colonna, ha tenuto i 7.636 edifici non mappati fuori dal ramo ELSE e ha dato uno stile a tutti e quattro i gruppi.

Guardando la mappa renderizzata si capisce subito perché controllare i NULL conta sui dati OpenStreetMap: gli edifici grigi sono l'87,7% che non ha alcun tag building:levels registrato.

Mappa QGIS renderizzata del centro di Indiranagar, Bengaluru, con gli edifici colorati in giallo chiaro per low, arancione per mid, rosso scuro per high e grigio per piani sconosciuti, con strade sovrapposte e punti neri per le fermate dell'autobus.
Il centro di Indiranagar con lo stile per height_class: 563 low (giallo), 442 mid (arancione), 68 high (rosso) e 7.636 senza tag dei piani in OSM (grigio).

Nel compito C, i valori building_ha dell'agente differivano leggermente dalla riga ettari per circoscrizione del nostro ricettario: New Thippasandra è risultata 20.151 ha invece di 20.292 ha (-0,69%), Jeevan Bhimanagar -0.14% e Indiranagar -0.06%. Quando ho controllato il motivo, l'agente aveva in realtà usato un metodo geometrico più rigoroso del mio filtro intersects(): ha ritagliato i poligoni degli edifici sui confini delle circoscrizioni prima di sommarne le aree, così gli edifici a cavallo di un confine non venivano contati due volte, e lo ha scritto nella risposta. Ha però lasciato il layer delle circoscrizioni in modalità modifica con modifiche non salvate, avvisandomi nella risposta che le modifiche non erano ancora state salvate.

Il pannello AI Agent in QGIS che riporta school_count e building_ha per ciascuna delle 10 circoscrizioni di Bengaluru, indicando che le impronte sono state ritagliate sui confini delle circoscrizioni e che le modifiche non sono ancora salvate.
Compito C: l'agente ha ritagliato sui confini delle circoscrizioni gli edifici a cavallo del confine prima di sommare gli ettari, e ha segnalato che le modifiche al layer non erano ancora salvate.

Ecco la tabella degli attributi del layer delle circoscrizioni dopo aver salvato quelle modifiche:

La tabella degli attributi di QGIS per le 10 circoscrizioni di Bengaluru con la nuova colonna intera school_count e la colonna decimale building_ha accanto ai nomi delle circoscrizioni, come Domlur, Indiranagar, New Thippasandra e Ulsoor.
Le 10 circoscrizioni con school_count (totale 35) e building_ha (totale 148,25 ha) aggiunti.

Tre compiti sono un campione piccolo (n = 3), e ho dato prompt chiari che nominavano i campi e i limiti delle classi, quindi consideralo una dimostrazione e non un benchmark. Per formule semplici come $area o concat(), la finestra del Field Calculator è più veloce che scrivere un messaggio in chat. Un agente si guadagna il posto quando servono aggregazioni tra layer, trasformazioni di CRS o catene di Processing in più passaggi, o quando altrimenti scriveresti uno script PyQGIS. Puoi anche confrontare altri assistenti nel nostro hub QGIS AI.

Come l'abbiamo misurato. Tutti i test sono stati eseguiti il 7 novembre 2026 in QGIS 3.44.15-Solothurn su macOS con dati OpenStreetMap di Indiranagar, Bengaluru (bounding box 12.968, 77.634, 12.986, 77.656, ODbL) nel CRS di progetto EPSG:4326. Ogni espressione del ricettario è stata verificata rispetto a un calcolo indipendente in Python o con QgsDistanceArea sugli stessi ID delle geometrie. Gli errori di area e lunghezza sono stati misurati sui primi 200 edifici e 200 strade per fid rispetto a QgsDistanceArea con l'ellissoide WGS 84 (EPSG:7030). AI Agent 1.9.4 ha lavorato con sforzo Medium e permessi Balanced, in una chat nuova per ogni test. I nostri conteggi delle domande su YouTube vengono da 70 commenti di richiesta d'aiuto su 59 video, filtrati da un corpus di 25.276 commenti.

Domande frequenti

Perché il mio calcolo con $area è sbagliato o restituisce 0 in QGIS?

Prima controlla di non aver scritto area($geometry) invece di $area. Su un layer salvato in gradi (EPSG:4326), area($geometry) restituisce gradi quadrati (circa 0.0000003 per una casa), che in un campo decimale si arrotonda a 0.0. Usa $area con l'ellissoide di progetto impostato su WGS 84 in Project > Properties > General > Measurements, oppure riproietta la geometria nell'espressione con area(transform($geometry, 'EPSG:4326', 'EPSG:32643')) usando la tua zona UTM locale. Evita EPSG:3857 (Web Mercator), che nel nostro test ha gonfiato l'area degli edifici del +5,95% anche a 13° N.

Come scrivo un'istruzione IF o CASE nel Field Calculator di QGIS?

Per due risultati, usa if(condition, value_if_true, value_if_false), per esempio if($area < 100, 'small', 'large'). Per tre o più classi, usa 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

Metti per primo il controllo IS NULL. Altrimenti ogni riga con un valore vuoto finisce in ELSE.

Perché il Field Calculator ha restituito NULL per tutte o quasi tutte le mie righe?

Quattro cause comuni:

  1. Sulla mappa era selezionata una geometria, quindi Only update N selected feature(s) era spuntata e ha lasciato NULL ogni riga non selezionata.
  2. Hai concatenato testo con || (come "addr:housenumber" || ' ' || "addr:street"), dove un solo input NULL rende NULL l'intero risultato. Usa invece concat().
  3. Hai messo le virgolette doppie attorno a un valore di testo ("building" = "yes"), il che dice a QGIS di cercare una colonna chiamata yes. Usa gli apici singoli per i valori ("building" = 'yes').
  4. Hai usato $x o $y su un layer di poligoni o linee. $x funziona solo sui punti; per i poligoni usa x(centroid($geometry)).

Come calcolo l'area in ettari nel Field Calculator di QGIS?

Imposta Output field type su Decimal number (real), imposta Precision a 2 o 3 e inserisci $area / 10000 (supponendo che le unità di area del progetto siano metri quadrati e che l'ellissoide di progetto sia impostato in Project > Properties > General). Per arrotondare il valore salvato a 3 decimali, usa round($area / 10000, 3).

Come aggiorno solo le geometrie selezionate nel Field Calculator?

Seleziona prima le geometrie sulla mappa o nella tabella degli attributi, poi apri il Field Calculator (Ctrl+I). La casella Only update N selected feature(s) in alto a sinistra sarà spuntata automaticamente. Scegli Update existing field, seleziona la colonna dal menu a tendina, inserisci l'espressione e clicca OK.

Prova AI Agent gratis

Fallo in QGIS semplicemente chiedendolo

AI Agent esegue l'attività che descrivi, direttamente nel tuo progetto QGIS. Gratis, senza carta.

Prova AI Agent gratis