Performing Spatial Joins (QGIS3)¶
Spatial Join is a classic GIS problem - transferring attributes from one layer to another based on their spatial relationship. In QGIS, this functionality is available through the Join attributes by location
Processing algorithm.
Overview of the task¶
We will use 2 layers - A shapefile of Borough boundaries of New York city and another shapefile of Street Pavement Rating for all streets in New York city. The first task will be to find the average rating of streets in each of the borough using a spatial join with summary algorithm. The second task will be to add the name of the borough to the street features through a one-to-many spatial join.
Other skills you will learn¶
Creating filters to temporarily exclude certain features from computation.
Get the data¶
NYC Open Data Portal is an excellent source of free data for New York city.
Download the Borough Boundaries zip file using the Export option on the portal.
Download the Street Pavement Rating zip file using the Export option on the portal.
For convenience, you may directly download a copy of the datasets from the links below:
Data Source [CITYOFNY]
Procedure¶
Locate the
nybb_19a.zip
file in the QGIS Browser and expand it. Select thenybb_19a/nybb.shp
layer and drag it to the canvas. This is a polygon layer representing the borough boundaries in New York city.
Next, locate the
V_SSS_SEGMENTRATING_1.zip
file and expand it. Select thedot_V_SSS_SEGMENTRATING_1_20190129.shp
layer and add it to the canvas. This is a line layer of all streets in the city.
Let’s examine the attributes available for each feature of the
dot_V_SSS_SEGMENTRATING_1_20190129
layer. Right-click and select Open Attribute Table.
You will notice the attribute called
Rating_B
which has values in the range 0-10 representing the street segment’s rating. The attributeRatingWord
has descriptive rating. We can use theRating_B
field to calculate the average rating.
You may have notice some features have a rating of
NR
. These are the segments that were not rated. Including them in our analysis will not be correct. Before we do the spatial join, let’s set up a Filter to exclude these records. Right-click thedot_V_SSS_SEGMENTRATING_1_20190129
layer and select Filter.
In the Query Builder, type the following expression to select all records that are not rated
NR
. You can also build the expression interactively by clicking on Field, Operator and selecting the appropriate Value. Click OK.
"RatingWord" != 'NR'
You will notice the
dot_V_SSS_SEGMENTRATING_1_20190129
layer now has a filter icon indicating that there is an active filter applied to this layer. Now we can do a spatial join using this layer. Go to .
Search and locate the
algorithm. Double-click to launch it.
In the Join attribute by location (summary) dialog, select
nybb
as the Input layer. The street layerdot_V_SSS_SEGMENTRATING_1_20190129
will be the Join layer. You can leave the Geometry predicate to the defaultIntersects
. Click the … button next to Fields to sumarize.
Note
A tip to help you select the correct input and join layers: The input layer is the one that will be modified will new attributes in the spatial join. As we want the average rating field to be added to the borough layer, it will be the input layer.
Select
Rating_B
and click OK.
Similarly, click the … button next to Summaries to calculate.
Select
mean
as the summary operator and click OK. Now we are ready to start the processing. Click Run.
The processing algorithm will work through the features and apply the spatial join. Verify that the processing job was successful and click Close.
Back in the main QGIS window, you will see a new
Joined layer
layer added to canvas. Open the attribute table for this layer. You will see a new columnRating_B_mean
is added to the input borough layer with the average rating of all streets that are interesecting with that feature.
Now we can perform a reverse operation. Sometimes your analysis requires getting attributes from another layer based on the spatial relationship but not compute any summary. We can use the
Join attribute by location
algorithm for such analysis. The task is to add the name of the borough to each feature in the streets layer based on which borough polygon it intersects with. Before we run this algorithm, let’s remove the filter from thedot_V_SSS_SEGMENTRATING_1_20190129
layer. Click the filter icon and press the Clear in the Query Builder. Click OK.
Turn of the
Joined layer
in the Layers panel. Find the algorithm in the Processing Toolbox and double-click it to launch.
Select
dot_V_SSS_SEGMENTRATING_1_20190129
as the Input layer andnybb
as the Join layer. You can leave the Geometry predicate to the defaultIntersects
. Click the … button next to Fields to add and selectBoroName
. Click OK.
The line segment may cross a borough boundary, so we choose the Join type as
Crate separate feature for each located feature (one-to-many)
. Click Run.
Once the processing finishes, open the attribute table of the newly added
Joined layer
. You will see that there is a newBoroName
attribute added to each street feature.
If you want to give feedback or share your experience with this tutorial, please comment below. (requires GitHub account)