QGISのプラグイン作成 マルチポリゴンの各パーツのバウンディングボックスを作成するサンプル
はじめに
QGISで地物のバウンディングボックスを取得するツール「バウンディングボックス」を使うと、下の画像の様になってしまいます。
これは各レコードのマルチポリゴン全体を囲ってしまっている状態なので、各パーツ毎にボックスを作成するようなプラグインを作成してみました。
このサンプルの使い方
インストールzipはここからダウンロードできます。
インストールできたら、バウンディングボックスを作成したいレイヤをアクティブにした状態でプラグインを実行します。
しばらくすると一時レイヤにバウンディングボックスが作成されます。
コード
~略~ 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行目 作成したバウンディングボックスをまとめて一つのオブジェクトを作成しています。
コード全文はこちら
最後までご覧頂き、ありがとうございました