Ich verwende Pyqgis in einer eigenständigen Anwendung. Jetzt wollte ich einen benutzerdefinierten Ausdruck erstellen, der in der Regel als filterExpression verwendet werden soll ruleBasedRendererV2
. (Ich habe den Renderer mit vorhandenen Funktionen ausprobiert und alles hat gut funktioniert!)
Benutzerdefiniert qgisfunction
(bitweise UND-Funktion - da es noch keine solche Funktion gibt) sieht folgendermaßen aus:
from qgis.utils import qgsfunction
@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
return value1 & value2
Ich habe auch versucht, es zu registrieren, über:
from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and)
Testen des Ausdrucks über:
expressionString = 'bitwise_and(2, 2) = 2'
exp = QgsExpression(expressionString)
if exp.hasParserError():
print(exp.parserErrorString())
( 2=2
Immer so geben True
) funktioniert nach der Registrierung der Funktion und schlägt fehl, wenn nicht. Trotzdem kann ich den Ausdruck nicht innerhalb einer Regel verwenden ...
Im Moment befindet sich die Datei mit der Funktion oben in meinem Projektordner, der automatisch in PATH aufgenommen wird, nicht wahr?! (Laut Nathan Woodrow kann die Datei an einer beliebigen Stelle in PATH abgelegt werden - siehe https://nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/ ).
UPDATE: Die Registrierung der Funktion funktioniert bisher mit Code von oben - jetzt liegt das Problem in der Funktion selbst ...
UPDATE 2:
Sehr eigenartig! Die einfache Funktion zum do_nothing
Abrufen von zwei Argumenten funktioniert in meinem Code einwandfrei:
@qgsfunction(args="auto", group='Python')
def do_nothing(value1, value2, feature, parent):
return value1
Ausdruck verwenden expString = 'do_nothing(2, 2) = 2'
UPDATE 3:
Ein einfacher Wechsel von do_nothing
zu add_one
funktioniert nicht mehr:
@qgsfunction(args="auto", group='Python')
def add_one(value1, value2, feature, parent):
return value1 + 1
Aufruf über expString = 'add_one(2, 2) = 3'
. Deshalb denke ich, dass es etwas mit der Rückgabe von Typ zu tun hat?!
@qgsfunction
Funktion in Ihrem Code, wie Sie die Funktion im Code definieren ? Sie können den expressions
Ordner ignorieren, wenn Sie Ihr eigenes Skript
do_nothing
). Aber meine ursprüngliche Funktion bitwise_and
funktioniert immer noch nicht. Nun, ich denke, es hat etwas mit dem Rückgabetyp der Funktion zu tun, da do_nothing works
, aber add_one
nicht!
~/.qgis2/python/expressions/
und laden Sie QGIS neu. Die Funktion ist im Abschnitt Python des Ausdrucksgenerators verfügbar