In addition to the spatial queries outlined in the previous recipe, we can also subset a layer by its attributes. This type of query resembles a more traditional relational database query and in fact uses SQL statements. In this recipe, we will filter a point shapefile-based layer by an attribute.
We'll use the same New York City Museums layer used in the previous recipes in this chapter. You can download the layer from https://geospatialpython.googlecode.com/svn/NYC_MUSEUMS_GEO.zip.
Unzip that file and place the shapefile's contents in a directory named nyc
within your qgis_data
directory, within your root or home directory.
In this recipe, we'll filter the layer by an attribute, select the filtered features, and zoom to them, as follows:
lyrPts = QgsVectorLayer("/qgis_data/nyc/NYC_MUSEUMS_GEO.shp", "Museums", "ogr")
QgsMapLayerRegistry.instance().addMapLayers([lyrPts])
selection = lyrPts.getFeatures(QgsFeatureRequest().setFilterExpression(u'"ZIP" = 10002'))
lyrPts.setSelectedFeatures([s.id() for s in selection])
iface.mapCanvas().zoomToSelected()
Verify that the point layer has three selected features, shown in yellow.
This recipe takes advantage of QGIS filter expressions, highlighted in step 3. These filter expressions are a subset of SQL. The QgsFeatureRequest
handles the query expression as an optional argument to return an iterator with just the features you want. These queries also allow some basic geometry manipulation. This recipe also introduces the mapCanvas().zoomToSelected()
method, which is a convenient way to set the map's extent to the features of interest.