pyqgisにカスタムqgsfunctionを登録する


9

スタンドアロンアプリケーション内でpyqgisを使用しています。次に、のルールでfilterExpressionとして使用するカスタム式を作成したいと思いましたruleBasedRendererV2。(以前に既存の関数でレンダラーを試しましたが、すべてうまくいきました!)

カスタムqgisfunction(ビットごとのAND関数-そのような関数はまだないため)は次のようになります。

from qgis.utils import qgsfunction

@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
    return value1 & value2

私もそれを登録しようとしました:

from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and) 

式をテストする:

expressionString = 'bitwise_and(2, 2) = 2'
exp = QgsExpression(expressionString)
if exp.hasParserError():
    print(exp.parserErrorString())

(与える2=2ので、いつもはTrue)関数を登録した後動作し、ない場合は失敗します。それでも、ルール内で式を使用することはできません...

現時点では、関数を含むファイルは、自動的にPATHに含まれているプロジェクトフォルダーの一番上にありますね。(Nathan Woodrowによると、ファイルはPATHのどこにでも配置できます-https : //nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/を参照してください)。

UPDATE:上記のコードで、これまでの作品の関数の登録-機能自体に今問題の嘘...

アップデート#2:

非常に奇妙な!do_nothing2つの引数を取得する単純な関数は、私のコードでは正常に機能します。

@qgsfunction(args="auto", group='Python')
def do_nothing(value1, value2, feature, parent):
    return value1

式を使用する expString = 'do_nothing(2, 2) = 2'

アップデート#3:

do_nothingtoの単純な変更はadd_one機能しなくなりました。

@qgsfunction(args="auto", group='Python')
def add_one(value1, value2, feature, parent):
    return value1 + 1

を介してそれを呼び出すexpString = 'add_one(2, 2) = 3'。それが、戻り値の型と関係があると私が思う理由です!?


1
ファイルをコピーして~/.qgis2/python/expressions/QGISをリロードすると、関数は式ビルダーセクションのpythonで利用できます
ThomasG77

あなたのアドバイスに従って、関数はQGIS関数エディターに表示され、期待どおりに使用できます。しかし、スタンドアロンアプリケーションで使用しようとすると、機能しません。-QGISを起動すると、なんらかの方法ですべてのファイルが式フォルダーに登録されると思いますが、どうしたらいいのでしょうか。
Henhuy

@qgsfunctionコードで関数を定義する場合と同様に、コードで関数を使用していますか。expressionsメインアプリ専用の独自のスクリプトを作成している場合は、フォルダーを無視できます
Nathan W

あなたは正しいです-関数の登録は上記のように機能します(たとえばdo_nothing)。しかし、私の元の機能bitwise_andはまだ機能しません。今、私はそれがあるため、関数の戻り値の型とは何かを持っていると思いますdo_nothing worksが、add_oneしません!
Henhuy

回答:


7

ようやく問題を解決しました!

入力値がQVariantinside として定義されているため、これは本当に型の問題でした@qgsfunction。したがって、コードを機能させるには、まず整数に変換する必要がありました。どうやら、QGISは型変換自体を処理します...

関数は次のようになります。

@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
    return value1.toInt()[0] & value2.toInt()[0]

また、関数をプロジェクトフォルダに配置している場合は、最初に登録することを忘れないでください。

from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and) 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.