QGISのプラグイン作成 マルチポリゴンの各パーツのバウンディングボックスを作成するサンプル

はじめに

QGISで地物のバウンディングボックスを取得するツール「バウンディングボックス」を使うと、下の画像の様になってしまいます。

f:id:Chiakikun:20210505154822p:plain

これは各レコードのマルチポリゴン全体を囲ってしまっている状態なので、各パーツ毎にボックスを作成するようなプラグインを作成してみました。


このサンプルの使い方

インストールzipはここからダウンロードできます。
インストールできたら、バウンディングボックスを作成したいレイヤをアクティブにした状態でプラグインを実行します。
しばらくすると一時レイヤにバウンディングボックスが作成されます。

f:id:Chiakikun:20210505171228p:plain


コード

~略~
    def start(self):
        # バウンディングボックス作成元
        srclayer = self.iface.activeLayer()
        if (srclayer == None) or (type(srclayer) is not QgsVectorLayer):
            QMessageBox.about(None, '警告', 'ベクタレイヤを選択してから実行してください')
            self.action.setChecked(False)
            return
        # バウンディングボックス投入先
        fieldstr = ''
        for field in srclayer.fields():
            fieldstr = fieldstr + '&field=' + str(field.name()) + ':' + str(field.typeName())
        crsstr = srclayer.sourceCrs().authid()
        dstlayer = QgsVectorLayer("Polygon?crs=" + crsstr + fieldstr, "サンプルレイヤ", "memory")

        for f in srclayer.getFeatures():

            # 属性
            qf = QgsFields()
            ## フィールド
            for field in srclayer.fields():
                qf.append(QgsField(str(field.name()), typeName=field.typeName()))
            record = QgsFeature(qf)
            ## 値投入
            for i in range(0, f.fields().count()):
                record[i] = f[i]
            # オブジェクト
            mpol = f.geometry().asMultiPolygon()
            bnds = []
            for i in range(0, len(mpol)):
                bnds.append(QgsGeometry.fromRect(QgsGeometry().fromPolygonXY(mpol[i]).boundingBox()).asPolygon())
            newobj = QgsGeometry.fromMultiPolygonXY(bnds)
            record.setGeometry(newobj)
            # レイヤに追加
            dstlayer.dataProvider().addFeatures([record])
            dstlayer.updateExtents()

        # キャンバスにオブジェクトを表示する      
        QgsProject.instance().addMapLayers([dstlayer])
        self.canvas.refreshAllLayers()
~略~

28行目 マルチオブジェクトをレコードから取り出して...
30~31行目 各バーツのバウンディングボックスを作成して...
32行目 作成したバウンディングボックスをまとめて一つのオブジェクトを作成しています。

コード全文はこちら

 


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