QGISのプラグイン作成 スクリーンショットサンプル(フューチャー毎)


はじめに

このページでは、ベクタレイヤの地物毎にスクリーンショットを撮って保存するサンプルを紹介しています。


サンプルプラグインの使い方

ここからzipファイルをダウンロードして、インストールしてください。

 

screenShot_sample_dialog.pyの41行目辺りの以下の部分を適当に設定してください。

        self.savedir = 'c:/users/〇〇/desktop' # 画像の保存先
        self.scale = 250000                    # スクリーンショット撮るときのマップの縮尺

 

f:id:Chiakikun:20210507124001p:plain

プラグインを実行すると、上のダイアログが表示されるので、スクリーンショットを撮りたいベクタレイヤを選択してから、実行ボタンを押下します。

 

f:id:Chiakikun:20200607164017p:plain

保存先に指定したフォルダ内に、選択したベクタレイヤの地物毎に画像が保存されていきます。


コード

class ScreenShotSampleDialog(QtWidgets.QDialog, FORM_CLASS):

~略~

    def exportMap(self):
        self.canvas.saveAsImage( self.savedir + "/{}.png".format( self.ids.pop() ) )

        if self.ids:
            self.setNextFeatureExtent()
        else:
            self.canvas.mapCanvasRefreshed.disconnect( self.exportMap )


    def setNextFeatureExtent(self): # この関数が終わるとself.exportMapが呼ばれます(リフレッシュが終わるので)
        self.canvas.zoomToFeatureIds( self.layer, [self.ids[-1]] )
        self.canvas.zoomScale(self.scale) # 縮尺 


    def pushExec(self):
        self.layer = self.iface.activeLayer()
        if type(self.layer) is not qgis.core.QgsVectorLayer:
            return
        self.ids = self.layer.allFeatureIds()

        self.canvas.mapCanvasRefreshed.connect( self.exportMap )

        self.setNextFeatureExtent() # setNextFeatureExtent -> exportMap -> ...のループに突入

        self.close()

25行目 マップがリフレッシュされたときに、exportMapを実行してほしいので、登録しています。
14,15行目 撮影したい地物がマップの中心になるように移動して、縮尺設定する。この後マップの描画が終わると...
5行目 マップのスクリーンショットが撮られ、setNextFeatureExtentが実行されます。

ソース全文


参考にしたサイト

gis.stackexchange.com

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