読者です 読者をやめる 読者になる 読者になる

waigani's diary

QGISを中心にFOSS4Gをいじくる

QGIS プロセッシング Scriptsで一括処理したい その1

QGIS プロセッシング Scripts

久々更新なのですっかり使い方忘れてます。QGIS プロセッシング Scriptsについては、下記の記事をまずはご参照ください。

QGIS プロセッシング Scriptsを使いたい その1 - waigani's diary

QGIS プロセッシング Scriptsを使いたい その2 - waigani's diary

QGIS プロセッシング Scriptsを使いたい その3 - waigani's diary

QGIS プロセッシング Scriptsを使いたい その4 - waigani's diary

フォルダ内のファイルをががーっと処理したい

フォルダ内にいくつかのshpefileがあるとして、同一の処理を全てのファイルに行うことを考えます。

下記のように、ランダムにポイントが配置されたshapefileが、それぞれの領域は重ならずに4ファイルあるとします。

f:id:waigani:20140723230024p:plain

 それぞれのファイルにボロノイ分割を行います。使用する機能としては、メニューの【ベクタ】→【ジオメトリツール】→【ボロノイポリゴン】になります。processingから呼ぶ際の名称としては、'qgis:voronoipolygons'です。

processing scriptsで処理するとして、まず入力は、

  • 入力先のフォルダを指定
  • ボロノイ図作成に必要なオプションを指定
  •  出力先のフォルダを指定

とします。

処理の内容としては、入力値のチェックなどなど省いて必要最小限にして、

  • 入力先フォルダから拡張子.shpのファイル名を取得
  • ファイル名からパス部分を削除して、出力先フォルダ名と'output_'を頭に付けて出力ファイル名作成
  • processingを使って、'qgis:voronoipolygons'を実行

だけ書いてみます。log出力してるのは気にしない。最後の行は、グラフィカルモデラーでつないでいくときのおまじない程度に考えてください。

##[My Scripts]=group
##input_dir=folder
##buffer=number 0.000000
##output_dir=folder
##outputDir=output string

from processing.core.ProcessingLog import ProcessingLog
import os
import glob

ProcessingLog().addToLog(ProcessingLog.LOG_INFO, "input folder :" + input_dir)
ProcessingLog().addToLog(ProcessingLog.LOG_INFO, "output folder :" + output_dir)

files = glob.glob(os.path.join(input_dir, r'*.shp'))
for file in files:
outputFile = os.path.join(output_dir, 'output_'+os.path.basename(file))
processing.runalg('qgis:voronoipolygons', file, buffer, outputFile)

outputDir = output_dir

"voronoi.py"という名称にして、

 ユーザのホームディレクトリ\.qgis2\processing\scripts

に置いておきます。qgisを再起動して、プロセッシングツールボックスから追加されたスクリプトを探して実行しましょう。

f:id:waigani:20140723233406p:plain

入力先フォルダ、出力先フォルダを指定して『run』すると、出力先フォルダにshapefileが作成されます。qgisでshapefileを開いてみると、ボロノイ図が作成されていることを確認出来ます。

f:id:waigani:20140723233756p:plain

改良点

バラバラにボロノイ図作っているので隙間開いてますね。読み込んだファイルを1ファイルにしてとか入れましょうか。