Vai al contenuto
AI Agent
QGIS
Tutorial

Join spaziale in QGIS: per posizione, per vicinanza, con AI

Pubblicato il

Una mappa stradale dell'8° arrondissement di Lione con punti rossi per le scuole, ognuno collegato da una linea nera alla fermata del tram più vicina in blu, e la scritta 710 m, distanza mediana da una scuola di Lione a una fermata del tram.

Un join spaziale copia i campi di un layer su un altro in base a dove si trovano le feature, non a un ID in comune. In QGIS, apri Vector > Data Management Tools > Join Attributes by Location…, scegli il layer che deve ricevere i nuovi campi, il layer da cui prenderli e una regola come "intersect", poi eseguilo. Per le domande del tipo "qual è il più vicino", usa invece Join Attributes by Nearest, oppure scrivi l'intero compito in una frase ad AI Agent.

Cosa vuoiStrumentoTempo nel nostro test
Dare a ogni punto il nome dell'area in cui cadeJoin Attributes by Location0,21 s, 382 scuole
Lo stesso, scritto in una fraseAI Agent22 s, conteggio e più vicino insieme
Contare o sommare i punti per areaJoin Attributes by Location (Summary)0,02 s, 9 aree
Trovare la feature più vicina e la sua distanzaJoin Attributes by Nearest0,06 s, 382 scuole

I dati del test

Ogni numero di questa guida viene da una sola esecuzione su dati aperti reali di Lione, in Francia, il 15 ottobre 2026:

  • 9 arrondissement (i distretti della città) e 382 scuole da OpenStreetMap.
  • 106 fermate del tram da OpenStreetMap.
  • 103.910 edifici dall'IGN BD TOPO, la banca dati topografica nazionale francese.

Tutti i layer sono in Lambert-93 (EPSG:2154), un sistema proiettato in metri. I tempi vengono da QGIS 3.44 su un MacBook Air M4.

Metodo 1: Join attributes by location

È il classico join spaziale. Qui ogni scuola riceve il nome del proprio arrondissement.

Apri lo strumento

Vector > Data Management Tools > Join Attributes by Location…. Puoi anche cercare "join attributes" nel Processing Toolbox (Ctrl+Alt+T).

Scegli i due layer

Join to features in è il layer che riceve i nuovi campi, qui schools. By comparing to è il layer da cui li prendi, qui arrondissements.

Spunta un predicato

intersect è la scelta sicura per i punti nei poligoni. La sezione più sotto spiega cosa significa ogni casella.

Scegli i campi e il tipo di join

In Fields to add, tieni solo ciò che ti serve, qui name. Imposta Join type su one-to-one e aggiungi un prefisso come arr_, così il nuovo campo si riconosce subito.

Eseguilo

Lascia Joined layer come layer temporaneo per controllare prima il risultato, poi salvalo in un GeoPackage.

La finestra Join attributes by location di QGIS. Join to features in: schools. Predicate: intersect è spuntato. By comparing to: arrondissements. Fields to add: name. Join type: Take attributes of the first matching feature only (one-to-one). Joined field prefix: arr_.
Il join che abbiamo eseguito: le scuole ricevono il nome dell'arrondissement in cui cadono. Tutte le 382 hanno trovato una corrispondenza in 0,21 secondi.

Spunta Discard records which could not be joined solo se vuoi eliminare i casi senza corrispondenza. All'inizio lascialo spento: le righe vuote ti dicono cosa è andato storto.

Usalo quando: vuoi uno o pochi campi dalla feature in cui ogni oggetto si trova o che tocca.

Evitalo quando: le feature non si toccano mai, come una scuola e una fermata del tram. Per quello c'è il Metodo 4.

Metodo 2: chiedi ad AI Agent in una frase

AI Agent è il nostro plugin QGIS che esegue compiti a partire da una richiesta scritta. Legge i nomi e i campi dei tuoi layer, sceglie gli strumenti e li esegue nel tuo progetto.

Gli abbiamo dato questa richiesta, con gli stessi layer di Lione caricati:

Conta le scuole in ogni arrondissement, poi assegna a ogni scuola il nome della fermata del tram più vicina e la distanza in metri.

Ha eseguito due strumenti di elaborazione di QGIS, poi un breve passaggio in Python che ha scritto i due nuovi campi nel layer delle scuole. Il pannello mostrava "Worked for 22 s". Ha chiesto il permesso una volta, perché stava per modificare il GeoPackage su disco. I suoi conteggi coincidevano esattamente con la nostra esecuzione manuale: 382 scuole, da 27 nel 2° e nel 4° a 56 nel 5°.

QGIS con gli arrondissement di Lione in arancione e i punti delle scuole, e il pannello AI Agent a destra. La richiesta dice: Count the schools in each arrondissement, then give every school the name of its nearest tram stop and the distance to it in metres. La risposta elenca i conteggi per arrondissement, 382 scuole in totale, e dice che tutte le 382 scuole hanno ricevuto nearest_tram e tram_distance_m, con distanze da 49,6 a 4.949,2 m.
Gli stessi due join da una sola frase. La risposta rimanda al nuovo layer ed elenca cosa è cambiato.

Usalo quando: conosci la domanda ma non sai quale dei quattro strumenti di join risponde, oppure concateni più passaggi.

Evitalo quando: esegui lo stesso join ogni settimana. Salvalo una volta come modello o come script Python.

Prezzo: piano gratuito, senza carta. Pro costa 49 € al mese, IVA esclusa.

Metodo 3: contare e riassumere con un join spaziale

Il Metodo 1 dà a ogni scuola il suo distretto. La domanda inversa, quante scuole contiene ogni distretto, richiede la versione summary.

Cerca Join attributes by location (summary) nel Processing Toolbox. Metti i poligoni in Join to features in, i punti in By comparing to, e scegli le statistiche in Summaries to calculate: conteggio, somma, media, mediana, minimo, massimo e altro. QGIS aggiunge un campo per ogni statistica, con un nome come osm_id_count.

Mappa dei nove arrondissement di Lione colorati dal giallo chiaro all'arancione scuro in base al numero di scuole, ognuno con la propria etichetta: 9e 38, 4e 27, 1e 33, 6e 41, 5e 56, 2e 27, 3e 54, 7e 53, 8e 53. I punti rossi segnano le scuole.
Scuole per arrondissement da un solo join summary: 0,02 secondi.

Somma anche i numeri. Sugli edifici IGN, un'esecuzione ha dato a ogni arrondissement il numero di edifici e delle abitazioni registrate al loro interno: 9.474 edifici e 51.743 abitazioni nel 3°, il valore più alto in entrambi i casi.

Per un semplice conteggio, Vector > Analysis Tools > Count Points in Polygon… fa lo stesso con meno impostazioni.

Usalo quando: la risposta è un numero per area: conteggio, totale, media.

Evitalo quando: ti serve l'elenco delle corrispondenze. Usa il Metodo 1 con one-to-many.

Metodo 4: Join attributes by nearest

Quando le feature non si toccano mai, uniscile per distanza. Cerca Join attributes by nearest nel Processing Toolbox.

Imposta Input layer su schools, Input layer 2 su tram_stops e Maximum nearest neighbors su 1. QGIS aggiunge i campi della fermata più un campo distance e le coordinate dei due estremi.

Mappa stradale dell'8° arrondissement di Lione. I punti rossi delle scuole sono ognuno collegati da una linea nera alla fermata del tram blu più vicina. Diverse scuole condividono la stessa fermata.
Ogni scuola collegata alla fermata del tram più vicina. In tutta Lione la mediana è 710 m, e 86 scuole su 382 sono entro 300 m.

Due impostazioni cambiano il risultato:

  • Maximum distance. Con 300 m, solo 86 scuole hanno ottenuto una fermata. Le altre 296 sono rimaste nell'output con i campi vuoti, a meno che tu non spunti Discard records which could not be joined.
  • Maximum nearest neighbors. Con 3, le 382 scuole sono diventate 1.146 righe, una per scuola e fermata. Anche un pareggio esatto aggiunge una riga: sui 103.910 edifici IGN abbiamo ottenuto 103.911 righe.

La distanza è in linea retta, non è la distanza a piedi lungo le strade.

Usalo quando: ti chiedi "qual è il più vicino" e "quanto dista".

Evitalo quando: ti serve la distanza di percorrenza. Usa gli strumenti Network analysis nel Processing Toolbox.

Quale predicato spuntare

Il predicato è la regola spaziale che decide una corrispondenza. QGIS lo legge come "layer A [predicato] layer B", dove A è il layer che riceve i campi.

Schema di otto relazioni spaziali tra una forma rossa A e una forma blu B: intersect, condividono una parte qualsiasi; contain, A contiene tutto B; are within, A sta dentro B; equal, stessa geometria; touch, condividono solo un bordo; overlap, stesso tipo con una parte in comune; cross, una linea attraversa; e no match, disgiunti, nessun join.
Il rosso è il layer che riceve i campi, il blu è il layer con cui confronti.

Tre regole coprono la maggior parte del lavoro:

  • intersect per i punti nei poligoni, e per tutto ciò che deve solo toccarsi. Prende anche le feature sul bordo.
  • are within quando la feature deve stare interamente dentro. Sui nostri edifici, 112 di quelli che intersecano Lione non erano interamente dentro un solo arrondissement: 108 attraversano il confine della città e 4 un confine interno.
  • contain per la direzione opposta, i poligoni che contengono punti.

Puoi spuntare più caselle. Una feature corrisponde allora se almeno una condizione è vera.

One-to-one, one-to-many o largest overlap

Un edificio sul bordo tocca due distretti. Il Join type decide cosa succede. Sui 46.250 edifici IGN che intersecano Lione:

Join typeRighe in uscitaTempo
One-to-many (una feature per ogni corrispondenza)46.2541,13 s
Solo la prima feature corrispondente (one-to-one)46.2500,99 s
Solo la sovrapposizione maggiore (one-to-one)46.2509,62 s

One-to-many ha duplicato i 4 edifici a cavallo di un confine interno. Va bene per un elenco di corrispondenze e sbagliato per qualsiasi somma: quegli edifici verrebbero contati due volte.

"First matching" tiene la prima corrispondenza che QGIS incontra, quindi un edificio sul bordo può finire in uno dei due distretti. "Largest overlap" sceglie il distretto che ne contiene la parte maggiore, che è la risposta più corretta, ma qui ha richiesto dieci volte più tempo.

Trappole del CRS

Un sistema di riferimento sbagliato raramente blocca un join. Cambia il risultato in silenzio.

  • CRS diversi funzionano per i join per posizione. Abbiamo lasciato le scuole in WGS 84 (EPSG:4326) e i distretti in Lambert-93. QGIS ha riproiettato al volo e tutte le 382 hanno trovato una corrispondenza.
  • Le distanze seguono le unità del layer di input. Esegui Join by nearest sui file in WGS 84 e la "distance" mediana risulta 0,0071. Sono gradi, non metri. Riproietta prima entrambi i layer in un CRS proiettato in metri, con Vector > Data Management Tools > Reproject Layer….
  • Maximum distance usa le stesse unità. Un valore di 300 in gradi copre l'intero pianeta.

La nostra guida su cos'è un CRS spiega la differenza tra gradi e metri e come sistemare un layer finito nel posto sbagliato.

Velocità sui layer grandi

QGIS gestisce join su scala cittadina in pochi secondi. Sui 103.910 edifici IGN:

  • Join one-to-one con i 9 distretti: 0,97 s da un GeoPackage.
  • Lo stesso layer come Shapefile: 1,69 s. Dopo Vector > Data Management Tools > Create Spatial Index…, 1,04 s.
  • Fermata del tram più vicina per ogni edificio: 3,5 s.
  • Largest overlap: 9,62 s, l'opzione più lenta.

Quattro accorgimenti mantengono veloci i join grandi:

  • Lavora da GeoPackage. Include un indice spaziale. Uno Shapefile ha bisogno del suo file .qix, che Create Spatial Index scrive.
  • Chiedi meno campi. Compila Fields to add invece di copiare tutto.
  • Evita largest overlap a meno che le feature sul bordo contino davvero.
  • Correggi prima le geometrie. Un poligono non valido interrompe l'esecuzione con "has invalid geometry". Lo strumento Fix geometries nel Processing Toolbox lo ripara. Puoi anche cambiare Invalid feature filtering sotto l'icona della chiave inglese accanto al layer di input.

Controlla anche dove cadono i tuoi punti. Solo 211 dei 382 punti delle scuole cadevano dentro un edificio IGN. Gli altri segnano cortili e aree di gioco, quindi "scuola dentro l'edificio" avrebbe perso 171 scuole.

Cosa ricordare

Usa Join Attributes by Location con intersect per dare ai punti il nome della loro area.

Usa la versione Summary per contare o sommare per area, e Join Attributes by Nearest per la feature più vicina e la sua distanza.

Scegli one-to-one per i totali, e one-to-many quando ti servono tutte le corrispondenze.

Riproietta in un CRS in metri prima di qualsiasi distanza.

Se non sei sicuro di quale strumento sia adatto, descrivi il risultato che vuoi ad AI Agent e controlla cosa ha costruito.

Domande frequenti

Cos'è un join spaziale in QGIS?

Un join spaziale aggiunge i campi di un layer a un altro in base alla posizione: dentro, a contatto o più vicino. In QGIS gli strumenti principali sono Join Attributes by Location, la sua versione Summary per conteggi e statistiche, e Join Attributes by Nearest per le distanze.

Come si fa un join attributes by location in QGIS?

Apri Vector > Data Management Tools > Join Attributes by Location…. Imposta il layer che riceve i campi in Join to features in e il layer sorgente in By comparing to, spunta intersect, scegli i campi e un tipo di join one-to-one, poi eseguilo.

Qual è la differenza tra join per posizione e join per vicinanza?

Il join per posizione richiede che le feature si tocchino o si sovrappongano, secondo il predicato che spunti. Il join per vicinanza non richiede alcun contatto: trova la feature più vicina e aggiunge un campo con la distanza, nelle unità del CRS del layer di input.

Perché il mio join spaziale restituisce campi vuoti?

Di solito le feature non rispettano il predicato: punti appena fuori dai poligoni, un predicato troppo rigido come "are within", o geometrie non valide. Controlla entrambi i layer sulla mappa, prova "intersect" ed esegui Fix Geometries. Anche un CRS mancante su un layer lo sposta nel posto sbagliato.

L'IA può fare un join spaziale in QGIS?

Sì. AI Agent esegue gli strumenti di QGIS a partire da una richiesta scritta. Nel nostro test su Lione ha fatto un conteggio per distretto e un join per vicinanza da una sola frase in 22 secondi, con gli stessi risultati dell'esecuzione manuale.

Prova AI Agent gratis in QGIS, senza carta

Scritto daTerraLab
·13 min read
Contatta