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行目 描画したオブジェクトをレイヤに追加します。
コード全文


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