PyQGIS를 사용하여 규칙 기반 라벨링을 제어 하시겠습니까?


15

이 질문에 이어 : QGIS에서 모든 레이어의 모든 레이블 ON / OFF를 설정하는 방법 , 자신의 언급 영업 이익 코멘트 그는 규칙 기반 라벨을 사용. 이러한 유형의 레이블을 읽고 수정하는 방법에 대해 온라인으로 검색을 시도했지만 lutraconsulting 에서이 게시물 을 찾을 수만있었습니다 .

규칙 기반 레이블을 쉽게 추가 할 수 있도록 QGIS 레이블 엔진 인터페이스에 일부 내부 변경이 이루어졌습니다. 라벨링은 이제 새로운 클래스에 의해 구동되며 QgsLabelingEngineV2여기에는 여러 라벨 제공자가 연관 될 수 있습니다.

잘 들린다. 그러나 QgsLabelingEngineV2 클래스를 읽을 때 다음을 언급합니다.

이 클래스는 아직 공개 API의 일부가 아닙니다.

현재 파이썬을 사용하여 규칙 기반 레이블을 제어 할 수 있습니까?


1
Github의 Qgis Documentation 프로젝트에서 공개 이슈를 발견 했습니다 . MASTER 또는 2.18 분기에서 해당 클래스에 대한 SIP 바인딩을 찾을 수 없으므로 여전히 C ++ 코드에서만 사용할 수 있다고 생각합니다.
Steven Kay

@StevenKay-감사합니다! 그들은 편집을 위해 ... 그것을 또한 감사하는 API를 만들 않은 경우 매우 유용 할 것, 나는 :) 클래스에 대한 올바른 링크를 붙여 넣을 생각
조셉

@StevenKay-나는 이것을 위해 더 구체적으로 QgsRuleBasedLabeling Class를 위해 API를 만들었다 고 생각합니다 :)
Joseph

답변:


6

새로운 QGIS 3 API로 규칙 기반 레이블을 처음부터 설정하는 데 도움이되는 도움말

#Configure label settings
settings = QgsPalLayerSettings()
settings.fieldName = 'myFieldName'
textFormat = QgsTextFormat()
textFormat.setSize(10)
settings.setFormat(textFormat)
#create and append a new rule
root = QgsRuleBasedLabeling.Rule(QgsPalLayerSettings())
rule = QgsRuleBasedLabeling.Rule(settings)
rule.setDescription(fieldName)
rule.setFilterExpression('myExpression')
root.appendChild(rule)
#Apply label configuration
rules = QgsRuleBasedLabeling(root)
myLayer.setLabeling(rules)
myLayer.triggerRepaint()

불행히도 기존 규칙을 반복하는 방법을 찾을 수 없습니다. 벡터 레이어에 사용 가능한 labeling () 메서드는 QgsAbstractVectorLayerLabeling 의 객체를 반환합니다 클래스 하지만 근본 규칙을 얻는 방법이없는 것 같습니다 ( QgsRuleBasedLabeling 이 클래스에서 ) 공급자 ID를 사용하여 직접 친구 설정을 얻는 것이지만 규칙 트리에 액세스 할 수 없습니다. 누구나 실마리가 있습니까?

편집하다

이제 labeling () 함수가 QgsRuleBasedLabeling ()을 반환합니다. https://github.com/qgis/QGIS/commit/4b365a8f47d96b35f7609859e580388927ae0606


답장을 보내 주셔서 감사합니다. 마음에 들지 않기를 바라지 만 myLayer.triggerRepaint()레이어를 새로 고치고 규칙을 설정 한 직후 레이블이 표시되도록 게시물을 약간 편집했습니다.
Joseph

3

에서 QGIS 3 , 새로운이 QgsRuleBasedLabeling 클래스 새 API를 사용하여 규칙 기반의 라벨을 제어 할 수있다.

QgsRuleBasedLabeling :: Rule을 사용하여 규칙을 추가 할 수 있습니다 .


( 불행히도 현재 2.99 버전을 테스트 할 수는 없지만 실제 예제를 제공하면 행복하게 대답 할 것입니다. )


1

이것이 QGIS 2.18의 규칙 기반 심볼로지에서 필터 표현식을 변경하는 데 사용하는 것입니다. http://qgis.org/api/2.18/classQgsRuleBasedRendererV2.html의 API 참조

import re
lddLrs = qgis.utils.iface.legendInterface().layers()    #get all loaded layers
for lyr in lddLrs:
    if (lyr.type()==QgsMapLayer.VectorLayer and lyr.name()=='layer_with_rules'): rLyr = lyr

newType = 1
for child in rLyr.rendererV2().rootRule().children():
    oldFilter = child.filterExpression()  #you can print this to see what the old expression is
    print oldFilter

    newFilter = re.sub(r"type = (\d*)", r"type = {0}".format(newType), oldFilter)  #this is an example to substitute a rule-based filter to a new number
    print newFilter

    child.setFilterExpression(newFilter)

당신의 대답에 감사하지만 당신이 말했듯이, 나는 이것이 레이블이 아닌 상징 에만 적용된다고 생각합니다 :)
Joseph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.