Я использую Pyqgis в автономном приложении. Теперь я хотел создать собственное выражение для использования в качестве filterExpression в rule 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, не так ли ?! (По словам Натана Вудроу, файл можно разместить в любом месте в PATH - см. Https://nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/ ).
ОБНОВЛЕНИЕ: регистрация функции работает до сих пор, с кодом сверху - теперь проблема заключается в самой функции ...
ОБНОВЛЕНИЕ № 2:
Очень странно! Простая функция do_nothing
получения двух аргументов прекрасно работает в моем коде:
@qgsfunction(args="auto", group='Python')
def do_nothing(value1, value2, feature, parent):
return value1
Используя выражение expString = 'do_nothing(2, 2) = 2'
ОБНОВЛЕНИЕ № 3:
Простое изменение do_nothing
на add_one
больше не работает:
@qgsfunction(args="auto", group='Python')
def add_one(value1, value2, feature, parent):
return value1 + 1
звонить через expString = 'add_one(2, 2) = 3'
. Вот почему я думаю, что это как-то связано с возвращением типа ?!
источник
~/.qgis2/python/expressions/
затем перезагрузите QGIS, и функция будет доступна в разделе python для построителя выражений@qgsfunction
функцию в вашем коде, как вы определяете функцию в коде. Вы можете игнорироватьexpressions
папку, если вы создаете свой собственный скрипт, предназначенный только для основного приложенияdo_nothing
). Но моя оригинальная функцияbitwise_and
все еще не работает. Теперь я думаю, что это как-то связано с типом возвращаемого значения функции, посколькуdo_nothing works
, ноadd_one
не имеет!Ответы:
Я наконец-то решил проблему!
Это была действительно проблема типа, так как входные значения определены как
QVariant
внутри@qgsfunction
. Итак, чтобы заставить мой код работать, я должен был сначала преобразовать их в целые числа. Судя по всему, QGIS сама занимается преобразованием типов ...Теперь функция выглядит так:
И если у вас есть функция, размещенная в папке вашего проекта, не забудьте сначала зарегистрировать ее:
источник