QGISのプラグイン作成 地物の色設定(連続値による定義)のサンプル


はじめに

このサンプルプラグインは、あるフィールドの値を基に、連続値による定義で色設定を行います。例えば...

f:id:Chiakikun:20200531165640p:plain
点群のレイヤです。

 

f:id:Chiakikun:20200531165657p:plain
拡大したところ。あるフィールドには標高値が入っています。

 

f:id:Chiakikun:20200531165721p:plain
あるフィールドを対象に連続値による定義で地物の色を設定すると、上の真っ黒にしか見えなかった点群がこんな感じに見えるようになります


使い方

ここからzipファイルをダウンロードしてインストールします。
インストールできたら、値が入っているフィールドと色の設定をします。
graduatedsymbol_sample.pyの以下の部分を適当に編集して下さい。

        self.field = '〇〇'

        # ルール
        self.rules = (
            (0,     30,   '#ffffff'),
            (30.1,  60,   '#ffcccc'),
            (60.1,  90,   '#ff9999'),
            (90.1,  120,  '#ff6666'),
            (120.1, 150,  '#ff3333'),
            (150.1, 9999, '#ff0000')
        )

設定が終わったら、プラグインを再読み込みして、色分けしたいレイヤをアクティブにした状態で実行します。

f:id:Chiakikun:20210515110205p:plain

設定後のシンボロジは上の画像の様になります。


コード

class GraduatedSymbolSample(QgsMapTool):

    def start(self):
    
~略~

        # 元の設定を保存
        self.oldrenderer = self.layer.renderer().clone()

        # 設定
        rangelist = []
        for minv, maxv, color_name in self.rules:
            symbol = QgsSymbol.defaultSymbol(self.layer.geometryType())
            symbol.symbolLayer(0).setStrokeColor(QColor('transparent'))
            symbol.setColor(QColor(color_name))        
            rangelist.append( QgsRendererRange(minv, maxv, symbol, str(minv) +' - '+ str(maxv)) )

        self.renderer = QgsGraduatedSymbolRenderer(self.field, rangelist)
        self.renderer.setMode(QgsGraduatedSymbolRenderer.Custom)
        self.layer.setRenderer(self.renderer)
        self.layer.triggerRepaint()


    def finish(self):
        # 元の設定に戻す
        self.layer.setRenderer(self.oldrenderer)
        self.layer.triggerRepaint()

~略~

    def __init__(self, iface):

~略~

        self.field = '〇〇'

        # ルール
        self.rules = (
            (0,     30,   '#ffffff'),
            (30.1,  60,   '#ffcccc'),
            (60.1,  90,   '#ff9999'),
            (90.1,  120,  '#ff6666'),
            (120.1, 150,  '#ff3333'),
            (150.1, 9999, '#ff0000')
        )

~略~

35行目~45行目 色設定のルールを作成します。
8行目 新しく色設定をする前に、現在の設定を退避します。
11行目~16行目 色設定のルールを基に、連続値による色設定を行います。
18行目~21行目 設定を適用して、マップに再描画します。
26行目 プラグインを終了したら、プラグイン実行前の色設定に戻します。
ソース全文


最後までご覧いただき、ありがとうございました。

QGISのプラグイン作成 地物の色設定(ルールによる定義)のサンプル


はじめに

このサンプルは、設定するフィルタによって個別の色設定をすることができるプラグインです。
例えば、Aというフィールドの値に〇〇が含まれている地物は赤色とか、オブジェクトの面積が□□以上なら青色にすることができます。


使い方

ここからzipファイルをダウンロードしてインストールします。
rulebase_sample.pyの76行目からの以下の部分を、適当に編集します。

        # ルール (ラベル, 式, 色)
        self.style_rules = (
            ('設定1', '"フィールド名" = \'〇〇\'', '#ff0000'), # この設定では赤
            ('設定2', '"フィールド名" = \'□□\'', '#00ff00'), # この設定では緑
            ('その他',  'ELSE',    '#ffffff')                  # それ以外は白
        )

f:id:Chiakikun:20210514224331p:plain

上記のコードの設定項目は上の画像の赤で囲った部分になります。


コード

class RulebaseSample(QgsMapTool):

    def start(self):
    
~略~
        # 元の設定を保存
        self.oldrenderer = self.layer.renderer().clone()

        # 設定
        self.renderer = QgsRuleBasedRenderer(QgsSymbol.defaultSymbol(self.layer.geometryType()))
        self.root_rule = self.renderer.rootRule()
        for label, expression, color_name in self.style_rules:
            rule = self.root_rule.children()[0].clone() # ラベル、フィルタ、色以外はデフォルト 
            rule.setLabel(label)
            rule.setFilterExpression(expression)
            rule.symbol().setColor(QColor(color_name))
            self.root_rule.appendChild(rule)
        self.root_rule.removeChildAt(0)

        self.layer.setRenderer(self.renderer)
        self.layer.triggerRepaint()


    def finish(self):
        # 元の設定に戻す
        self.layer.setRenderer(self.oldrenderer)
        self.layer.triggerRepaint()

        self.canvas.mapToolSet.disconnect(self.unsetTool)


    def __init__(self, iface):
    
~略~
        # ルール (ラベル, 式, 色)
        self.style_rules = (
            ('設定1', '"フィールド名" = \'〇〇\'', '#ff0000'), # この設定では赤
            ('設定2', '"フィールド名" = \'□□\'', '#00ff00'), # この設定では緑
            ('その他',  'ELSE',    '#ffffff')                  # それ以外は白
        )

7行目 プラグインを実行すると、現在の設定を退避します。
10行目~18行目 36行目で作成したルールを設定します。
20行目 新しい設定でレイヤを描画します。
26行目 プラグインを終了すると、プラグイン実行前の色設定に戻ります。
ソース全文


最後までご覧頂き、ありがとうございました

QGISのプラグイン作成 ラバーバンドサンプル


はじめに

このサンプルプラグインでは、ラバーバンドを使ってオブジェクトを描画することができます。
描画が終わったら、Pythonコンソールにオブジェクトの座標を表示します。


使い方

f:id:Chiakikun:20210514003656p:plain

ここからプラグインのzipファイルをダウンロードしてインストールします。プラグインを実行した状態で、マップ上でマウスの左ボタンを押下すると図形を描画できます。
右ボタンを押下で決定され、Pythonコンソールにオブジェクトの座標が表示されます。


コード

class RubberbandSample(QgsMapTool):

    def printGeometry(self, geom):
        print(geom)


    def start(self):
        maptool = RubberBandClass(self.iface, self.canvas, self.objtype)
        maptool.getObject.connect(self.printGeometry)

~略~

    def __init__(self, iface):
        self.objtype     = QgsWkbTypes.PolygonGeometry # QgsWkbTypes.PointGeometry, QgsWkbTypes.LineGeometry, QgsWkbTypes.PolygonGeometry
~略~

class RubberBandClass(QgsMapTool):
    getObject = pyqtSignal(QgsGeometry)

    def __init__(self, iface, canvas, type):
        QgsMapTool.__init__(self, canvas)

        self.canvas = canvas
        self.iface = iface
        self.type = type

        self.myRubberBand = None


    def canvasMoveEvent(self, event):
        if self.myRubberBand == None: # 一度も左ボタンをクリックしてない時にこのメソッドが呼ばれた場合
            return

        # 地物の描画中に、マウスカーソルを追って形状が変わるように
        point = self.canvas.getCoordinateTransform().toMapCoordinates(event.pos())
        self.myRubberBand.movePoint(point)


    def canvasPressEvent(self, event):
        currentPos = self.toMapCoordinates(event.pos())

        # 地物の最初の一点目
        if event.button() == Qt.LeftButton and self.myRubberBand == None:
            if self.type == QgsWkbTypes.PointGeometry:
                self.getObject.emit(QgsGeometry.fromPointXY(currentPos))
                return
            else:
                self.myRubberBand = QgsRubberBand( self.canvas, self.type )
                self.myRubberBand.setColor( QColor(255, 0, 0, 128) )
                self.myRubberBand.addPoint( QgsPointXY(currentPos) )

        # 地物の二点目以降
        if event.button() == Qt.LeftButton and self.myRubberBand.numberOfVertices() > 0:
            self.myRubberBand.addPoint( QgsPointXY(currentPos) )

        # オブジェクト確定
        if event.button() == Qt.RightButton:
            if self.myRubberBand == None:
                return

            self.getObject.emit(self.myRubberBand.asGeometry()) # ラバーバンドのオブジェクト取り出し


            self.canvas.scene().removeItem(self.myRubberBand) # ラバーバンドで描いた図形はもう必要ないので消す
            self.myRubberBand = None


    def deactivate(self):
        try: # 右クリックしてmyRubberBandを解放していた場合は例外発生するので。
            self.myRubberBand.reset(True)
        except:
            pass

14行目 このプラグインで描画するオブジェクトのタイプを指定します。ここではポリゴンを描画する設定になっていますが、ポイントを描画したい(ラバーバンドの意味が無いですが)場合はQgsWkbTypes.PointGeometryを、ラインを描画したい場合はQgsWkbTypes.LineGeometryを指定してください。
9行目 オブジェクトを描画し終わったら呼ばれるメソッドを登録します。
43行目 マップで左クリックすると、オブジェクトの1点目が描画されます。
35行目 ラバーバンドが表示されている状態でマウスを動かすと、ラバーバンドも一緒に動きます。
53行目 左クリックで次のノードを決定します。
61行目 オブジェクトの描画を終了します。
4行目 描画したオブジェクトの座標がPythonコンソールに表示されます。
ソース全文


マルチオブジェクトを描画したい場合

インストール直後のサンプルではマルチオブジェクトを描画することはできませんが、上のコードの8行目を以下の様に書き換えると、一つオブジェクトを書き終えた後に右クリックで決定するのではなく、左ボタンをダブルクリックすることで、2つ目のパーツを描画することができます。

        maptool = RubberBandClassEx(self.iface, self.canvas, self.objtype)

最後までご覧頂き、ありがとうございました