Kural tabanlı etiketlemeyi PyQGIS kullanarak kontrol etmek?


15

Bu sorudan sonra: QGIS'deki tüm katmanların tüm etiketlerini açma / kapatma , OP yorumunda kural tabanlı etiketler kullandığını belirtti. Bu tür etiketlerin nasıl okunabileceği ve değiştirilebileceği konusunda çevrimiçi arama yapmayı denedim, ancak sadece bu yazıyı lutraconsulting'den bulmayı başardım :

Kural tabanlı etiketlemenin eklenmesini kolaylaştırmak için QGIS etiketleme motoru arayüzünde bazı dahili değişiklikler yapıldı. Etiketleme şimdi QgsLabelingEngineV2kendisiyle ilişkilendirilmiş birkaç etiket sağlayıcısı olabilen yeni sınıf tarafından yönlendirilmektedir .

Harika görünüyor. Ancak, QgsLabelingEngineV2 sınıfını okurken aşağıdakilerden bahseder:

bu sınıf henüz herkese açık API'nın bir parçası değil.

Şu anda kural tabanlı etiketlemeyi python kullanarak kontrol etmek mümkün mü?


1
Burada Github'daki Qgis Documentation projesinde de açık bir sorun buldum . MASTER veya 2.18 dallarında bu sınıf için bir SIP bağlaması bulamadım, bu yüzden hala sadece C ++ kodu için kullanılabilir olduğundan şüpheleniyorum.
Steven Kay

@StevenKay - Harika bul, teşekkürler! Onlar için bir API yapmak oldukça yararlı olacaktır ... Ayrıca düzenleme için teşekkürler, ben sınıf için doğru bağlantı yapıştırdı düşündüm :)
Joseph

@StevenKay - Sanırım şimdi bunun için bir API yaptılar, daha spesifik olarak QgsRuleBasedLabeling Sınıfı :)
Joseph

Yanıtlar:


6

Yeni QGIS 3 API ile kural tabanlı etiketlemeyi sıfırdan ayarlamak için bazı yardımlar aşağıda

#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()

Ne yazık ki mevcut kurallar üzerinden yineleme nasıl bulamıyorum, vektör katmanları için mevcut labeling () yöntemi QgsAbstractVectorLayerLabeling sınıfının bir nesnesini döndürür, ancak bu, kök kuralı ( QgsRuleBasedLabeling ) bu sınıftan almanın bir yolu yok gibi görünüyor , tek olasılık Ben sağlayıcıları kimlikleri kullanarak doğrudan pal ayarları almak olduğunu buldum ama kurallar ağacına erişemiyorum. Kimsenin ipucu var mı?

DÜZENLE

Artık düzeltildi, labeling () işlevi bir QgsRuleBasedLabeling () döndürüyor: https://github.com/qgis/QGIS/commit/4b365a8f47d96b35f7609859e580388927ae0606


Cevabınız için teşekkürler, güzel çalıştı! Umursamıyorum ama myLayer.triggerRepaint()katmanı yenilemek ve kuralları belirledikten hemen sonra etiketlerin gösterilmesine izin vermek için yayınınızı hafifçe düzenledim :)
Joseph


1

QGIS 2.18 altında kural tabanlı sembolojide bir filtre ifadesini değiştirmek için kullandığım şey budur. Http://qgis.org/api/2.18/classQgsRuleBasedRendererV2.html adresindeki API referansı

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)

Cevabınız için teşekkür ederiz, ancak dediğin gibi, bunun sadece etiketler için değil, sadece semboloji için geçerli olduğunu düşünüyorum :)
Joseph
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.