今回は地物の検索方法について、紹介します。
地物を検索する方法としては、3種類ほどあります。
1.QgsFeatureからAttributesをすべてチェックしていく
2.sql(subset)で絞り、その後、sql(subset)を外す
3.qgsExpressionで対象地物を取得
3の処理が早いのでを紹介します。
QgsExpressionについて詳しくは
QGIS Document
QGIS API Documentation QgsExpression
を参照
この関数は条件の関数です。
queryを渡して、インスタンスを作成
その後、結果を取得する。
query = '1 + 1 = 2' expression = QgsExpression(query) expression.evaluate() # True なら 1 False なら 0を返す
これを地物の検索に利用する場合以下になります。
layer = iface.activeLayer() # id というフィールドを持っているレイヤという設定 result = [] field_name = 'id' search_value = '1' query = '"{field}" = {value}'.format(field=field_name, value=search_value) # idが1の地物がほしい expression = QgsExpression(query) expression.prepare(layer.dataProvider().fields()) # queryでフィールドの値を参照できるようにするために、QgsFieldsをセット for index, feature in enumerate(layer.dataProvider().getFeatures()): if expression.evaluate(feature): # id = 1なら result.append(feature)
QGISのドキュメントにあるサンプルなのですが、これは汎用性があっていいですね。
def where(layer, exp): exp = QgsExpression(exp) if exp.hasParserError(): raise Expection(exp.parserErrorString()) exp.prepare(layer.pendingFields()) for feature in layer.getFeatures(): value = exp.evaluate(feature) if exp.hasEvalError(): raise ValueError(exp.evalErrorString()) if bool(value): yield feature layer = qgis.utils.iface.activeLayer() for f in where(layer, 'Test > 1.0'): print f + " Matches expression"