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.
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.
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]
nybb_19a.zip
file in the QGIS Browser and expand it. Select the nybb_19a/nybb.shp
layer and drag it to the canvas. This is a polygon layer representing the borough boundaries in New York city.V_SSS_SEGMENTRATING_1.zip
file and expand it. Select the dot_V_SSS_SEGMENTRATING_1_20190129.shp
layer and add it to the canvas. This is a line layer of all streets in the city.dot_V_SSS_SEGMENTRATING_1_20190129
layer. Right-click and select Open Attribute Table.Rating_B
which has values in the range 0-10 representing the street segment’s rating. The attribute RatingWord
has descriptive rating. We can use the Rating_B
field to calculate the average rating.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 the dot_V_SSS_SEGMENTRATING_1_20190129
layer and select Filter.NR
. You can also build the expression interactively by clicking on Field, Operator and selecting the appropriate Value. Click OK."RatingWord" != 'NR'
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 .nybb
as the Input layer. The street layer dot_V_SSS_SEGMENTRATING_1_20190129
will be the Join layer. You can leave the Geometry predicate to the default Intersects
. 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.
Rating_B
and click OK.mean
as the summary operator and click OK. Now we are ready to start the processing. Click Run.Joined layer
layer added to canvas. Open the attribute table for this layer. You will see a new column Rating_B_mean
is added to the input borough layer with the average rating of all streets that are interesecting with that feature.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 the dot_V_SSS_SEGMENTRATING_1_20190129
layer. Click the filter icon and press the Clear in the Query Builder. Click OK.Joined layer
in the Layers panel. Find the algorithm in the Processing Toolbox and double-click it to launch.dot_V_SSS_SEGMENTRATING_1_20190129
as the Input layer and nybb
as the Join layer. You can leave the Geometry predicate to the default Intersects
. Click the ... button next to Fields to add and select BoroName
. Click OK.Crate separate feature for each located feature (one-to-many)
. Click Run.Joined layer
. You will see that there is a new BoroName
attribute added to each street feature.This work is licensed under a Creative Commons Attribution 4.0 International License