QGISのプラグイン作成 一時スクラッチレイヤ作成サンプル


はじめに

このサンプルは、一時スクラッチレイヤを作成し、そのレイヤにラバーバンドでオブジェクトを追加していくプラグインです。


使い方

ここからzipファイルをダウンロードしてインストールします。
インストールできたら、temporarylayer_sample.pyの以下の部分を適当に編集してから、プラグインを再読み込みして実行して下さい。

        # 一時レイヤ作成
        typestr  = 'Polygon?'
        fieldstr = '&field=〇〇:string&field=□□:double&field=××:date'
        crsstr   = '&crs=' + str(QgsProject.instance().crs().authid())
        layername= '一時レイヤ'
~略~
        # ラバーバンドのための設定
        self.objtype     = QgsWkbTypes.PolygonGeometry # QgsWkbTypes.PointGeometry, QgsWkbTypes.LineGeometry, QgsWkbTypes.PolygonGeometry

注 2行目と8行目のオブジェクトタイプは一致するように設定してください。


コード

class TemporaryLayerSample(QgsMapTool):

    def setGeometry(self, geom):
        qf = QgsFields()
        for field in self.tmplayer.fields():
            qf.append(QgsField(str(field.name()), typeName=field.typeName()))
        record = QgsFeature(qf) 
        # 地物をセットする
        record.setGeometry(geom) 
        # 属性をセットする
        record.setAttributes([])
        # 作成したレコードをレイヤに追加
        self.tmplayer.dataProvider().addFeatures([record])
        self.tmplayer.updateExtents()
        self.canvas.refreshAllLayers()


    def start(self):
        # 一時レイヤ作成
        typestr  = 'Polygon?'
        fieldstr = '&field=〇〇:string&field=□□:double&field=××:date'
        crsstr   = '&crs=EPSG:4612'
        layername= '一時レイヤ'
        self.tmplayer = QgsVectorLayer(typestr + crsstr + fieldstr, layername, "memory")
        QgsProject.instance().addMapLayer(self.tmplayer)

        maptool = RubberBandClass(self.iface, self.canvas, self.objtype)
        maptool.getObject.connect(self.setGeometry)
        
~略~

24行目 一時スクラッチレイヤを作成します。
27行目 ラバーバンドでオブジェクトが作成できるようになります。
28行目 一時スクラッチレイヤにオブジェクトを追加するためのメソッドを登録します。
3行目 描画したオブジェクトをレイヤに追加します。
コード全文


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

QGISのプラグイン作成 属性編集ダイアログのサンプル


はじめに

f:id:Chiakikun:20200531141501p:plain

このサンプルは、ベクタレイヤの地物を一つ選択した状態でプラグインを実行すると、上の画像のような属性編集ダイアログが表示されます。


使い方

ここからzipファイルをダウンロードしてインストールします。インストール後、属性編集したい地物を選択して、プラグインを実行してください。


コード

class AttributeEditorSample(QgsMapTool):

    def start(self):
        self.layer = self.iface.activeLayer()

        features = self.layer.selectedFeatures()

~略~

        self.layer.startEditing() # レイヤを編集状態にする

        # 選択しているフューチャーの属性フォーム表示
        self.attdlg = self.iface.getFeatureForm(self.layer, features[0])
        self.attdlg.setMode(QgsAttributeEditorContext.SingleEditMode)
        self.attdlg.finished.connect(self.commitEdit)
        self.attdlg.show()


    def commitEdit(self, result):
        if result == 1:
            self.layer.commitChanges()
        else:
            self.layer.rollBack()
        self.attdlg.finished.disconnect(self.commitEdit)

~略~

10行目 アクティブなレイヤを編集状態にします。
13行目~16行目 編集ダイアログのタイプを設定して表示します。また、編集が完了した時に呼び出すメソッドも登録します。
21行目 編集内容を反映します。
コード全文


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

QGISのプラグイン作成 ツールチップサンプル


はじめに

このサンプルは、マップ上のマウスカーソルの位置に、ツールチップを表示させることができます。常に表示させると邪魔になるので、マウスカーソルの動きが止まった時に表示させるようにしました。

f:id:Chiakikun:20200530220359p:plain


使い方

ここからzipファイルをダウンロードしてインストールします。プラグインを実行した状態でマップにカーソルを動かすと、その位置の座標がツールチップに表示されます。


コード

class ToolTipSample(QgsMapTool):

    def start(self):
        maptool = ToolTipClass(self.canvas, 100)

~略~

class ToolTipClass(QgsMapTool):

    def __init__(self, canvas, ms): # msはミリ秒
        QgsMapTool.__init__(self, canvas)

        self.canvas = canvas

        self.ms = ms
        # canvasMoveEventで設定した秒数(msで設定)経過したら呼ばれるメソッドを設定
        self.timerMapTips = QTimer( canvas )
        self.timerMapTips.timeout.connect( self.showMapTip )


    def canvasMoveEvent(self, event):
        QToolTip.hideText()
        self.timerMapTips.start(self.ms)


    def showMapTip( self ):
        self.timerMapTips.stop()

        # 表示する値を設定する。
        mappos = self.toMapCoordinates(self.canvas.mouseLastXY())
        value = mappos

        if value == None:
            return
        text = str(value)
        QToolTip.showText( self.canvas.mapToGlobal( self.canvas.mouseLastXY() ), text, self.canvas )

~略~

4行目 ツールチップの表示を、マウスカーソルの移動が止まってから0.1秒後に表示するように設定します。
18行目 4行目で設定した時間が経過したらツールチップを表示させるメソッドを実行するように設定します。
23行目 マウスを動かしたら、タイマーをスタートさせます。そのため、マウスを動かし続けている間は、タイマーはリセットされ続けることになります。
26行目 マウスを動かさなければタイマーは進むので、4行目で設定した時間マウスを止めていれば、このメソッドが呼ばれます。
コード全文


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