Realizzare unioni spaziali (Spatial Joins) (QGIS3)

L’unione spaziale è un classico problema in ambito GIS - si tratta di trasferire attributi da un layer ad un altro basandosi sulle loro reciproche relazioni spaziali. In QGIS questa funzionalità può essere avviata attraverso lo strumento Unisci attributi per posizione .

Descrizione del compito

Useremo due layer - Uno shapefile dei confini amministrativi dei quartieri di New York e un altro shapefile che contiene gli indirizzi delle case di cura a New York. Useremo la tecnica di unione spaziale (join) per accertare la capacità totale delle case di cura in ciascuno dei quartieri di New York.

Altri aspetti che avremo modo di apprendere nel corso dell’esercizio

  • Creare filtri per escludere temporaneamente alcuni elementi dal calcolo

Ottenere i dati necessari.

NYC Open Data Portal è una fonte straordinaria di open data che riguardano la città di New York.

Scaricate il file .zip dei confini amministrativi dei quartieri di New York Borough Boundaries usando l’opzione Export sul portale.

../../_images/data19.png

Scaricare il file .zip Street Pavement Rating usando l’opzione export del portale.

../../_images/data23.png

Per comodità, potete scaricare direttamente una copia del dataset dal seguente link:

nybb_19a.zip

V_SSS_SEGMENTRATING_1.zip

Fonte Dati [CITYOFNY]

Procedimento

  1. Individuate il file appena scaricato nybb_19a.zip usando il browser di QGIS e trascinatelo nel progetto. Questo è un livello con poligoni che rappresentano confini in New York

../../_images/1106.png
  1. Trovate il file V_SSS_SEGMENTRATING_1.zip ed estrate il contenuto dello ZIP. Selezionate e aggiungete il livello dot_V_SSS_SEGMENTRATING_1_20190129.shp . Sono le strade di NY.

../../_images/2101.png
  1. Per esaminare gli attributi del livello dot_V_SSS_SEGMENTRATING_1_20190129 fate click con il tasto destro sul layer e selezionate Apri Tabella degli Attributi.

../../_images/347.png
  1. Noterete la colonna Rating_B con valori tra 0-10 ovvero un indice di qualità della pavimentazione. La colonna RatingWord ha un indice categorico. Possiamo utilizzare la colonna Rating_B per calcolare una media di qualità della pavimentazione.

../../_images/420.png
  1. Alcuni elementi hanno un indice valorizzato come NR. Questi segmenti non sono stati valutati. Includerli nell’analisi non sarebbe corretto, dunque prima di eseguire l’unione spaziale usiamo un filtro Filter per escluderli. Tasto destro sul livello dot_V_SSS_SEGMENTRATING_1_20190129 e selezionare Filter.

../../_images/520.png
  1. Nella sezione Query Builder, inserire la seguente espressione per selezionare tutti gli elementi senza il valore NR. E” possibile creare la funzione in modo interattivo selezionando Field, Operator e selezionando i valori appropriati in Value. Clicca OK.

"RatingWord" != 'NR'
../../_images/620.png
  1. Vedrete il livello dot_V_SSS_SEGMENTRATING_1_20190129 ha ora un’icona a forma di imbuto che indica che c’è un filtro attivo su questo livello. Ora possiamo eseguire un’unione (join) spaziale su questo livello. Vai sul pannello Processing ‣ Toolbox.

../../_images/719.png
  1. Cerca e trova la voce Vector general ‣ Join attribute by location (summary) . Doppio click per lanciare il modulo.

../../_images/819.png
  1. Nella finestra Join attribute by location (summary) , seleziona nybb come Input layer. Il livello dot_V_SSS_SEGMENTRATING_1_20190129 sarò il Join layer. Potete lasciare il criterio di unione spaziale Geometry predicate impostato a quello predefinito (interseca) Intersects. Clicca il pulsante vicino a Fields to sumarize.

../../_images/919.png

Nota

Una nota per definire bene i livelli di input e di unione (join): Il livello «input» è quello al quale vengono aggiunte le colonne del livello «unione» . Noi vogliamo aggiungere ai poligoni con i confini amministrativi, la media degli indici di qualità della pavimentazione stradale. Dunque il livello di input sarà quello dei confini amministrativi.

  1. Seleziona Rating_B e OK.

../../_images/1026.png
  1. Clicca il pulsante vicino a Summaries to calculate.

../../_images/1129.png
  1. Seleziona mean (media) come operatore di aggregazione e clicca OK. Ora possiamo lanciare il processo. Clicca Run.

../../_images/1227.png
  1. Verifica che il processo sia terminato senza problemi e clicca Close.

../../_images/1325.png
  1. Nella finestra di QGIS vedrete un livello Joined layer aggiunto. Aprite la tabella attributi del livello. Vedrete una nuova colonna chiamata Rating_B_mean che contiene il valore medio degli indici di qualità della pavimentazione delle strate dentro ogni area.

../../_images/1423.png
  1. Ora facciamo un’operazione inversa. A volte si vuole aggiungere un attributo ad un livello prendendolo da un’altro livello. Usiamo il modulo Join attribute by location per questa analisi. L’obiettivo è quello di aggiungere, ad ogni segmento di strada, il nome dell’area amministrativa dove ricade. Prima di lanciare il procedimento, togliamo il filtro dal livello dot_V_SSS_SEGMENTRATING_1_20190129. Cliccare l’icona con il filtro e selezionare Clear nella ifnestra del Query Builder. Cliccare OK.

../../_images/1520.png
  1. Nascondi il livello Joined layer nel pannello Layers. Trova il modulo Vector general ‣ Join attribute by location nel pannello Strumenti di processing e fai doppio click.

../../_images/1619.png
  1. Seleziona dot_V_SSS_SEGMENTRATING_1_20190129 come Input layer e nybb come Join layer. Lasciare pure il Geometry predicate al valore di default Intersects. Clicca il pulsante vicino a Fields to add e seleziona la colonna BoroName. Click OK.

../../_images/1720.png
  1. Siccome un segmento stradale può «scavalcare» un confine amministrativo, i.e. non trovarsi completamente dentro un unico confine amministrativo, selezioniamo l’opzione Join type come Crate separate feature for each located feature (one-to-many). Cliccare Run.

../../_images/1818.png
  1. Una volta finito il process, aprite la tabella attributi del livello appena aggiunto Joined layer. Vedrete una nuova colonna BoroName.

../../_images/1915.png

If you want to give feedback or share your experience with this tutorial, please comment below. (requires GitHub account)