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

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 vuoi | Strumento | Tempo nel nostro test |
|---|---|---|
| Dare a ogni punto il nome dell'area in cui cade | Join Attributes by Location | 0,21 s, 382 scuole |
| Lo stesso, scritto in una frase | AI Agent | 22 s, conteggio e più vicino insieme |
| Contare o sommare i punti per area | Join Attributes by Location (Summary) | 0,02 s, 9 aree |
| Trovare la feature più vicina e la sua distanza | Join Attributes by Nearest | 0,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.

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°.

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.

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.

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.

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 type | Righe in uscita | Tempo |
|---|---|---|
| One-to-many (una feature per ogni corrispondenza) | 46.254 | 1,13 s |
| Solo la prima feature corrispondente (one-to-one) | 46.250 | 0,99 s |
| Solo la sovrapposizione maggiore (one-to-one) | 46.250 | 9,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.
, apri 

