PyQGISを使用してルールベースのラベル付けを制御しますか?


15

この質問に続いて:QGISのすべてのレイヤーのすべてのラベルをオン/オフにする方法 OPは、彼がコメントにルールベースのラベルを使用していると述べました。私はこれらのタイプのラベルをどのように読んで修正できるかについてオンラインで検索しようとしましたが、lutraconsultingからこの投稿を見つけることができました

ルールベースのラベリングの追加を容易にするために、QGISラベリングエンジンインターフェイスにいくつかの内部変更が行われました。現在、ラベル付けは、QgsLabelingEngineV2複数のラベルプロバイダーが関連付けられている可能性がある新しいクラスによって駆動されます。

いいね。ただし、QgsLabelingEngineV2クラスを読むと、次のことに言及します。

このクラスはまだパブリックAPIの一部ではありません。

現在、Pythonを使用してルールベースのラベル付けを制御することは可能ですか?


1
GithubのQgis Documentationプロジェクトで未解決の問題を発見しまし。MASTERブランチまたは2.18ブランチでそのクラスのSIPバインディングを見つけることができなかったため、C ++コードでのみ使用できると思われます。
スティーブンケイ

@StevenKay-すばらしい発見、ありがとう!彼らがそれのためにAPIを作った場合、非常に便利でしょう...また、編集のおかげで、クラスの正しいリンクを貼り付けたと思いました:)
ジョセフ

@StevenKay-彼らは今、このためのAPI、より具体的にはQgsRuleBasedLabelingクラスを作成したと思います:)
ジョセフ

回答:


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を使用して直接pal設定を取得することですが、ルールツリーにアクセスできません。誰にも手がかりがありますか?

編集

これは修正され、labeling()関数はQgsRuleBasedLabeling()を返しますhttps : //github.com/qgis/QGIS/commit/4b365a8f47d96b35f7609859e580388927ae0606


あなたの答えをありがとう、うまく働いた!あなたが気にしないことを願っていますがmyLayer.triggerRepaint()、レイヤーを更新し、ルールを設定した直後にラベルが表示されるように投稿を少し編集しました:)
ジョセフ

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)

あなたの答えをありがとう、しかしあなたが言ったように、私はこれはシンボルではなくラベルにのみ適用されると思う:)
ジョセフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.