使用Python根据其属性过滤功能?


16

如何使用python在Qgis中按特征(类似于arcobjects中的Iqueryfilter)的属性获取特征?除了获取所有功能并手动对其进行过滤之外,是否可以使用where子句将其过滤掉?

示例:我有一个名为“县”的字段。它具有五万多个特征。即,由于耗时,无法获取所有特征并对其进行过滤。所以我可以在arcobjects中使用iqueryfilter.whereclause ='Counties = Norwich'来查询它。我在PyQgis中需要类似的东西。


1
@NathanW是的,您是正确的。我只需要使用来自图层的查询返回数据。您能在pyqgis中提供任何示例吗?
venkat 2013年

@NathanW嗨,我知道了。它的工作方式类似于arcgis中的定义查询。看到这个例子。如果t == True,则t = outputLayer.setSubsetString('UniqID ='+ inputFeat.attribute(“ UniqID”)。toPyObject()):outputProvider = outputLayer.dataProvider()打印outputProvider.featureCount(),即它将仅返回查询满意的数据
venkat 2013年

@venkat您在QGIS中将查询放在哪里?谢谢。
ianbroad

Answers:


12

QGIS表达式引擎可以使用该QgsFeatureRequest.setFilterExpression( unicode )方法执行此操作(自QGIS 2.2开始)

request = QgsFeatureRequest().setFilterExpression( u'"Counties" = \'Norwich\'' )
it = l.getFeatures( request )

从QGIS 2.10开始,以这种方式进行过滤甚至有可能比其他类型的过滤(例如python实现)为您提供额外的性能。

如果满足以下三个条件,则基本上适用:

  • 您正在使用postgis提供程序使用一个层目前(2.16),不仅仅是postgis提供程序实现此功能(spatialite,ogr,oracle ...)。
  • 你的表情是不是太复杂(东西喜欢>=INNOT NULL...的支持)
  • 您已在设置>选项>数据源>数据源处理>在postgres服务器端执行表达式中启用了此功能
  • 通过在数据库表上使用适当的索引,性能收益是最佳的

使用QGIS 3.0,甚至可以简单地执行

features = l.getFeatures('"Counties" = \'Norwicth\'')

1

这篇文章 -可被视为重复问题的答案-详细介绍了如何从图层中获取所有属性。作者描述了您正在寻找的过程,因为一旦返回数据,便要手动对其进行过滤。这是一个非常完整的参考,它们的链接应该可以真正帮助您。


2
这不是重复的问题。我不想从图层中获取所有属性。首先对其进行过滤,然后我想获取过滤条件下的功能。即性能要好得多。
venkat 2013年

1

通过使用sql查询,也可以轻松实现ogr。您可以在QGIS python控制台或独立脚本中执行此代码。
范例

from osgeo import ogr

path = "path to your shapefile.shp"
ID = "FieldID" # For instance 'Countries' 
datasource = ogr.Open(str(path)) # your datasource

layer = datasource.GetLayer(0) # Import layer 0 --> only works with shapefiles
layerName = str( layer.GetName() )# Save the Layersname first

# Do the sql query
# Selects all features from a layer datasource where Field Countries is equal to 'Germany'
layers = datasource.ExecuteSQL("SELECT * FROM %s WHERE %s = '%s'" % (layerName, ID, 'Germany') )
res = []
for i in range(0,layers.GetFeatureCount()):
   f = layers.GetFeature(i)
   g = f.GetGeometryRef()
   res.append(g.Area()) 

# res now contains the measured area of each feature where the attribute ID has the value 'Germany'

0

从1.9版开始,尚不支持使用QGIS API指定SQL过滤器。

据我从此邮件列表文章中了解到,仅在将来的版本中才支持“本地提供程序的SQL”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.