Performing Spatial Queries

Warning

This tutorial is now obsolete. A new and updated version is available at Performing Spatial Queries (QGIS3)

Spatial queries are core to many types of GIS analysis. In QGIS, this functionality is available via the Spatial Query plugin.

Overview of the task

We will be working with 2 datasets - a lines layer representing rivers and a point layer representing cities. The task is to run a spatial query to find all cities that are within 10 kms of a river.

Other skills you will learn

  • Opening .zip files directly in QGIS.

  • Choosing an appropriate projection and re-projecting vector data.

  • Creating buffers.

  • Selecting features using SQL-like expressions.

  • Coverting a shpefile to a KML file.

  • Validating your results using Google Earth.

Get the data

We will use ne_10m_rivers_lake_centerlines and 10m_populated_places_simple datasets from Natural Earth.

Download Rivers and Lake Centerlines

Download Populated Places.

Data Source: [NATURALEARTH]

Procedure

  1. Once you have downloaded the data, open QGIS. Go to Layer ‣ Add Vector Layer.

../_images/1206.png
  1. Click Browse and navigate to the folder where you downloaded the zip files.

../_images/2170.png
  1. Hold the Shift key and click on both the zip files to select them. Click Open.

../_images/3106.png
  1. You will be asked to choose a layer from the zip archive. Select ne_10m_rivers_lake_centerlines.shp and click OK.

../_images/471.png
  1. Since you have selected multiple files, repeat the process for the next file. Select 10m_populated_places_simple.shp and click OK.

../_images/565.png
  1. You will see both the shapefiles now loaded in QGIS.

../_images/663.png
  1. We will be created buffers around the point and line layers. The Buffer geoprocessing tool in QGIS uses layer units to calculate buffer distances. The layers we have are in Geographic Coordinate Reference System (CRS) with the unit of degrees. This is not appropriate as we want our analysis to use metres or kilometres. To achive this, we must re-project our layers to a Projected Coordinate Reference System (CRS). Right-click on the 10m_populated_places_simple layer and choose Save As.

../_images/762.png
  1. In the Save vector layer as… dialog, click Browse next to Save as and select the output file location. Name the output file as populated_places_reprojected.shp. Next, click the Browse button next to CRS.

../_images/860.png
  1. Now we must choose an appropriate CRS for our purpose. For creating buffers, a Azimuthal Equidistant projection would be best suited as radial distances around the center of the projection are accurate. In our case, since the dataset is global, we will choose a World projection. In the Coordinate Reference System Selector dialog, start searching for world az.. and you will see the results show up. Select the World_Azimuthal_Equidistant and click OK.

Note

The World_Azimuthal_Equidistant projection spans 90 degrees from the origin. Here the origin being 0 degrees longitude, the only data contained within +/- 90 degrees longitude will be converted.

../_images/959.png
  1. Back in Save vector layer as … dialog, check the box next to Add saved file to map and click OK.

../_images/1067.png
  1. Repeat the re-projection process for the ne_10m_rivers_lake_centerlines layer and save the new layer as rivers_lake_reprojected.shp.

../_images/11105.png
  1. Now you will have 4 layers in your Layers Panel. Un-check the boxes next to the original layers to display only the re-projected layers. The re-projected layers are still being shown in the Geographic CRS because of a setting. Let’s turn that off. Click on the Project Properties button. This setting can also be accessed from Project ‣ Project Properties.

../_images/1269.png
  1. In the CRS tab of the Project Properties dialog, un-check the box next to Enable on-the-fly CRS transformation. Click OK.

../_images/1366.png
  1. Back in the main QGIS window, right-click on any one of the re-projected layers and select Zoom to Layer Extent.

../_images/1462.png
  1. Now you will see the data in the layer’s CRS. We will now create buffers for both the datasets. Click Vector ‣ Geoprocessing Tools ‣ Buffer.

../_images/1555.png
  1. In the Buffer tool, select populated_places_reprojected layer as Input. Enter the buffer distance as 10000. Note that we want a buffer of 10kms and since the CRS units are metres, we need to enter 10,000. Enter the output file name as populated_places_buffer.shp. Click OK.

../_images/1652.png
  1. Once the buffer processing is over, click the Yes to add the newly created layer to the TOC.

../_images/1749.png
  1. Repeat the same buffer process for the rivers_lake_reprojected layer and create an output file named rivers_lake_buffer.shp.

../_images/1845.png
  1. The rivers_lake_buffer contains features that are both rivers as well as lakes. Our analysis calls for using only river features, so we will run a query to select only river features. Right-click on the rivers_lake_buffer layer and select Open Attribute Table.

../_images/1936.png
  1. You will see that the featurecla attribute contains the information we can use to select the river features. Click on Select features using an expression button.

../_images/2031.png
  1. Enter the expression “featurecla” = “River” and click Select and then click Close to back to the main QGIS window.

../_images/2171.png
  1. Now we are ready to perform the spatial query. You need to enable the Spatial Query plugin to use this functionality. See Using Plugins for more details. Once enabled, go to Vector ‣ Spatial Query ‣ Spatial Query.

../_images/2231.png
  1. For our query, we want to select features from the buffered places that intersect with the buffered river lines. Make sure the checkbox next to selected geometries is checked. This is to ensure the query uses only river features that we selected previously. Click Apply.

../_images/2328.png
  1. Once the query is complete, you will see a new section named Selected features. Click on the Create layer with selected button. A new layer will be added to the Layers Panel. Click Close.

../_images/2428.png
  1. Zoom-in to any area and compare the results. You will notice that the new layer contains only the features that intersect with river buffers.

../_images/2526.png
  1. We should always verify my results to ensure the analysis is not flawed. One way to verify the results is to export this layer as a KML file and load it up in Google Earth. You can check if the areas you found really are within 10kms of a river. Right-click the layer and Save As….

../_images/2623.png
  1. In the Save vector layer as…, choose WGS84 as the CRS. This because KML format needs the coordinates to be in this CRS. Name your KML as cities_near_river.kml.

../_images/2723.png
  1. Open Google Earth and verify that the cities represented by these buffers are indeed close to rivers.

../_images/2822.png

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