pyqgis에서 사용자 정의 qgs 기능 등록


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 2016 년

@qgsfunction코드에서 함수를 정의 할 때와 같이 코드 에서 함수 를 사용하고 있습니까? expressions메인 앱 전용 스크립트를 만드는 경우 폴더 를 무시할 수 있습니다.
Nathan W

함수 등록시 위에 설명한대로 작동합니다 (예 do_nothing:). 그러나 내 원래 기능 bitwise_and은 여전히 작동 하지 않습니다. 이제 함수의 반환 유형과 관련이 있다고 생각 do_nothing works하지만 add_one그렇지 않습니다!
Henhuy 2016 년

답변:


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) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.