QGIS python: 地物検索

今回は地物の検索方法について、紹介します。

地物を検索する方法としては、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"

コメントを残す

メールアドレスが公開されることはありません。