在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/)。

更新:到目前为止,函数的注册可以通过上面的代码进行-现在问题出在函数本身上。

更新#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'。这就是为什么我认为它与返回类型有关?


1
复制您的文件,~/.qgis2/python/expressions/然后重新加载QGIS,该函数在表达式生成器部分python中可用
ThomasG77

按照您的建议,功能将出现在QGIS功能编辑器中,并且可以按预期使用它。但是,当尝试在我的独立应用程序中使用它时,功能不起作用!-我认为,当QGIS启动时,它会以某种方式在表达式文件夹中注册所有文件,但是我想知道如何?
Henhuy

您是否@qgsfunction在代码中使用该函数,就像在代码中定义该函数一样?expressions如果您要制作自己的脚本仅用于主应用程序,则可以忽略该文件夹
Nathan W

您是对的-当该功能的注册如上所述工作时(例如do_nothing)。但是我的原始功能bitwise_and仍然无法正常工作。现在,我认为它与函数的返回类型有关,因为do_nothing works,但与之add_one无关!
Henhuy

Answers:


8

我终于解决了问题!

这确实是一个类型问题,因为输入值定义为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) 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.