PyQGIS スクリーンショットサンプル(フューチャー毎)


どんな動きをするの?

f:id:Chiakikun:20200607163901p:plain

上のようなレイヤを地物毎にスクリーンショット撮ります。

 

f:id:Chiakikun:20200607164306p:plain

こんな感じに。

 

f:id:Chiakikun:20200607164017p:plain

地物の数が多いレイヤで実行すると、出力されるファイルが多くなります。また、終了するのに時間がかかるので気を付けてください。


使い方

例として、ここからダウンロードできるサンプルプラグインに追加します。

nodialog_skelton.pyの__init__にcheckableを設定しているところがあるので、Trueが設定されている場合はFalseに変更します。

self.checkable = False

nodialog_skelton.pyのstartを次のコードに書き換えます。

    def start(self):
        self.outputdir = 'f:\\output'
        self.layer = self.iface.activeLayer()
        self.zoomscale = 0

        self.ids = self.layer.allFeatureIds()
        self.canvas.mapCanvasRefreshed.connect( self.exportMap )
        self.setNextFeatureExtent() # setNextFeatureExtent -> exportMap -> ... のループ

次のコードを追加します。

    def exportMap(self):
        self.canvas.saveAsImage(self.outputdir + '\{}.png'.format(self.ids.pop()) )

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


    def setNextFeatureExtent(self):
        self.canvas.zoomToFeatureIds( self.layer, [self.ids[-1]] )
        if self.zoomscale != 0:
            self.canvas.zoomScale(self.zoomscale)

このようになればOKです。

~略~

class NodialogSkelton(qgis.gui.QgsMapTool):

    def exportMap(self):
        self.canvas.saveAsImage(self.outputdir + '\{}.png'.format(self.ids.pop()) )

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


    def setNextFeatureExtent(self):
        self.canvas.zoomToFeatureIds( self.layer, [self.ids[-1]] )
        if self.zoomscale != 0:
            self.canvas.zoomScale(self.zoomscale)

    def start(self):
        self.outputdir = 'f:\\output'
        self.layer = self.iface.activeLayer()
        self.zoomscale = 0

        self.ids = self.layer.allFeatureIds()
        self.canvas.mapCanvasRefreshed.connect( self.exportMap )
        self.setNextFeatureExtent() # setNextFeatureExtent -> exportMap -> ... のループ

~略~
 
    def __init__(self, iface):
        self.plugin_name = 'ダイアログ無し雛形' # プラグイン名
        self.menu_pos    = '雛形'               # プラグインの登録場所(このサンプルの場合、メニューの「プラグイン/雛形/ダイアログ無し雛形」)
        self.toolbar     = True                 # Trueならツールバーにアイコンを表示する
        self.checkable   = False                 # Trueならプラグイン実行中はアイコンが凹んだままになる

参考にしたサイト

gis.stackexchange.com

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