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?!
quelle
~/.qgis2/python/expressions/
und laden Sie QGIS neu. Die Funktion ist im Abschnitt Python des Ausdrucksgenerators verfügbar@qgsfunction
Funktion in Ihrem Code, wie Sie die Funktion im Code definieren ? Sie können denexpressions
Ordner ignorieren, wenn Sie Ihr eigenes Skriptdo_nothing
). Aber meine ursprüngliche Funktionbitwise_and
funktioniert immer noch nicht. Nun, ich denke, es hat etwas mit dem Rückgabetyp der Funktion zu tun, dado_nothing works
, aberadd_one
nicht!Antworten:
Ich habe das Problem endlich gelöst!
Es war wirklich ein Typproblem, da Eingabewerte wie
QVariant
innen definiert sind@qgsfunction
. Um meinen Code zum Laufen zu bringen, musste ich sie zuerst in ganze Zahlen konvertieren. Anscheinend kümmert sich QGIS selbst um die Typkonvertierung ...Die Funktion sieht jetzt so aus:
Und wenn Sie die Funktion in Ihrem Projektordner abgelegt haben, vergessen Sie nicht, sie zuerst zu registrieren:
quelle