今回は地物の検索方法について、紹介します。
地物を検索する方法としては、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"