官术网_书友最值得收藏!

Filtering a layer by attributes

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.

Getting ready

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.

How to do it...

In this recipe, we'll filter the layer by an attribute, select the filtered features, and zoom to them, as follows:

  1. First, we load the point layer:
    lyrPts = QgsVectorLayer("/qgis_data/nyc/NYC_MUSEUMS_GEO.shp", "Museums", "ogr")
    
  2. Next, we add the layer to the map in order to visualize the points:
    QgsMapLayerRegistry.instance().addMapLayers([lyrPts])
    
  3. Now, we filter the point layer to points with attributes that match a specific zip code:
    selection = lyrPts.getFeatures(QgsFeatureRequest().setFilterExpression(u'"ZIP" = 10002'))
    
  4. Then, we use a list comprehension to create a list of feature IDs that are fed to the feature selection method:
    lyrPts.setSelectedFeatures([s.id() for s in selection])
    
  5. Finally, we zoom to the selection:
    iface.mapCanvas().zoomToSelected()
    

Verify that the point layer has three selected features, shown in yellow.

How it works...

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.

主站蜘蛛池模板: 聊城市| 庄河市| 新干县| 越西县| 太仆寺旗| 镇雄县| 通辽市| 车险| 肇庆市| 调兵山市| 兴仁县| 牙克石市| 绿春县| 双城市| 洪湖市| 都匀市| 镇坪县| 紫云| 三明市| 马尔康县| 蓬溪县| 兴化市| 胶南市| 绵阳市| 崇信县| 铜陵市| 广丰县| 通许县| 孟津县| 寿光市| 六安市| 三门峡市| 湘潭市| 利津县| 苏尼特左旗| 大庆市| 江西省| 保德县| 丰县| 沽源县| 昌吉市|