QGISでのバッチ処理

#1.はじめに
コメント投稿用にアカウントを取得しましたが、1つも記事を書かないのはもったいないと思うようになりました。
エンドユーザーの作業記録程度のものですが、こんなものもあっても良いですよね？
本人にとっては備忘録のようなものです。

#2.やってみたこと
今回バッチプロセスを試してみたのは、「形式変換（gdal_translate）」、「全体図の作成（ピラミッド）」、「シェープファイルの投影法の定義」、「フィールド計算機」の4つです。
この中の「フィールド計算機」で、ちょっと苦労しています。
動作環境はWindows10 Pro 64bitでユーザ名は「owner」。QGISのバージョンは3.10.6です。
デスクトップに作業用の「TEST_1」と「TEST_2」というフォルダを作っています。

##2-1.ワールドファイル付きのTiffをGeoTiffへ変換する
メニューの「ラスタ － 変換 － 形式変換（gdal_translate）」をクリックします。
「形式変換（gdal_translate）」が立ち上がったら、左端下にある「バッチプロセスで実行」ボタンをクリックします。

「入力ラスタ」の行番号「2」に「 ･･･ 」というボタンがあるので、これをクリックします。
「ディレクトリ選択」を選ぶとエクスプローラー風の選択画面が出るので、Tiffとワールドファイルが入っているフォルダを選択して「フォルダの選択」ボタンをクリックします。

「出力のCRSを上書きする」では、一番上の上で適当なCRSを選択してから「オートフィル」ボタンをクリックして「フィルダウン」を選びます。

「出力バンドにnodata値を割り当てる」と「各出力ファイルに全データをコピーする」は、特に設定しません。

「出力ファイル」は出力ファイルのファイル名とパスを設定するところです。入力フォルダとは別のフォルダに、同一ファイル名で出力するように設定します。
「オートフィル」ボタンをクリックして、「式による計算」を選択すると「式文字列ビルダ」が立ち上がります。

「式文字列ビルダ」の真ん中のウインドウには、関数がカテゴリー毎に整理されていて、検索機能も用意されていますので、これを活用すると便利です。
関数をクリックしてアクティブにすると、右側のウインドウに現在の値や関数の説明などが表示されます。
今回は「INPUT」と「replace」を使うのでこれらをみてみます。

最初に「INPUT」です。現在の値に'C:/Users/owner/Desktop/TEST_1/ImgKA10ID9034.tif'と表示されています。
ユーザー名が「owner」で、デスクトップの「TEST_1」というフォルダに変換元のファイルを入れています。
この関数を使うと、フルパスでファイル名が取得されていることがわかります。
![fig_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/fafbe965-ca5a-920d-a0ed-668a3d689d14.png)

次に「replace」をみてみます。
文字列内で文字の入れ替えができるようです。デスクトップに「TEST_2」という出力フォルダを用意しているので、「TEST_1」を「TEST_2」に入れ替えると目的が達成できそうです。
![fig_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/f9a7ebfb-5cfd-a9ad-8cf5-b76e80b1841e.png)

入力した式は次のとおりです。

```
replace(@INPUT,'TEST_1','TEST_2')
```

「実行」ボタンをクリックして、処理を開始します。

##2-2.GeoTiffにピラミッドを作成する
高解像度のラスタがたくさんあると描画に時間が掛かり、スクロールがスムーズにできなくなります。
そこで、縮尺に応じて解像度を下げて表示させるために、ピラミッドを作成します。

メニューの「ラスタ － その他 － 全体図の作成（ピラミッド）」をクリックします。
「全体図の作成（ピラミッド）」が立ち上がったら、左端下にある「バッチプロセスで実行」ボタンをクリックします。

「入力ラスタ」の行番号「2」に「 ･･･ 」というボタンがあるので、これをクリックします。
「ディレクトリ選択」を選ぶとエクスプローラー風の選択画面が出るので、GeoTiffが入っているフォルダを選択して「フォルダの選択」ボタンをクリックします。

「全体図を作成するレベル」の2行目の値を「2 4 8 16 32 64」として、「オートフィルボタン」を押して「フィルダウン」を選択します。
「実行」ボタンをクリックして、処理を実行します。

##2-3.空間参照系が定義されていないShapeのprjファイルを作る
プロセッシングツールボックスの「ベクタ一般 － シェープファイルの投影法の定義」をクリックします。
「シェープファイルの投影法の定義」が立ち上がったら、左端下にある「バッチプロセスで実行」ボタンをクリックします。
「入力ラスタ」の行番号「2」に「 ･･･ 」というボタンがあるので、これをクリックします。
「ファイル選択」を選ぶとエクスプローラー風の選択画面が出るので、右下にあるファイルの種類を「全ファイル(*)」から「ESRI Shaoefilkes（*.shp *.SHP）」にします。
Shapeファイルが入っているフォルダへ移動して、ファイルを選択します。
「CRS」行番号「2」の右端のアイコンをクリックして、適正なCRSを選びます。
「実行」ボタンをクリックして、処理を実行します。

##2-4.ファイル名を属性テーブルに取り込む
プロセシングツールボックスの「ベクタテーブル」内に「フィールド計算機」があることに気がつきました。
喜んで起動させてみたものの、立ち上がったフィールド計算機には他のツールにあった「バッチプロセスで実行」ボタンがありません。
ところが、何気なくプロセシングツールボックス内の「フィールド計算機」の文字の上で右クリックしたところ、メニューに「バッチプロセスで実行」が表示されました。

「2-3」の処理の後ですので、ファイルは「TEST_1」に入っています。ファイル名を属性テーブルに取り込んだ新しいShapeファイルを「TEST_2」に出力させます。
まず、処理前のShapeファイルをQGISに読み込ませておきます。そして「フィールド計算機」を「バッチプロセスで実行」で立ち上げます。
「入力レイヤ」の行番号「2」に「 ･･･ 」というボタンがあるので、これをクリックして「レイヤを開くから選択」を選びます。
「全てを選択する」ボタンをクリックしてから、「OK」ボタンをクリックします。

「結果フィールド名」には適当な名前を入力してから「オートフィル」ボタンをクリックして「フィルダウン」を選択します。
「フィールド型」は行番号「2」に「 ･･･ 」というボタンをクリックして「文字列（string）」を選択します。
「オートフィル」ボタンをクリックして「フィルダウン」を選択します。

「フィールド長」と「精度」は行番号「2」に適当な数値を入れてから、「オートフィル」ボタンをクリックして「フィルダウン」を選択します。
なお、データ型が文字列ですので、「精度」は「0」としました。
「新フィールド」はデフォルトの「はい」のままにしておきます。

「計算式」ですが、ここで躓きました。
「式文字列ビルダ」にある「INPUT」を使いますが、GeoTiff変換の時と違ってフルパスでなくファイル名が出力されます。
![fig_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597262/2f115a39-1d7e-d607-71fe-a67af7b43c59.png)

欲しいのはファイル名なので「INPUT」を使うだけで良いように思いましたが、新しいフィールドの値が「Null」になりました。
もしかしてと思い、手作業で「バッチ処理・フィールド計算機」の「計算式」フィールドに表示された文字列をシングルクオーテーションで囲んでから実行してみたところ、属性テーブルに書き込むことができました。
さて、これを式で処理したいですが、「''」をシングルクオーテーションで囲むことで解決しました。
「'」や「\」を文字列として扱う場合、2つ重ねますので、これをシングルクオーテーションで囲んだということですね。
入力した式は次のとおりです。

```
'''' ||  @INPUT  || ''''
```

最後に「計算結果」です。ここには出力先のフルパスを入れたいです。
エクスプローラーで「TEST_2」フォルダまで移動してアドレスバーからパスをコピーしておきます。
「オートフィル」ボタンをクリックして「式による計算」を選びます。
左の式枠に先程のパスを貼り付けて、ちょこちょこと編集します。

```
'C:\\Users\\owner\\Desktop\\TEST_2\\' || @INPUT || '.shp'
```

「実行」ボタンをクリックして、処理を実行します。

#3.さいごに
「フィールド計算機」でバッチプロセスを行うことができるというのは、注目すべきことだと思いました。
たぶん気づいていない人も多いかと思います。

それとさらっと書いていますが、シングルクオーテーションの4連打（''''）に辿り着くまで、それなりに試行錯誤しました。多分、半日くらい悩んだと思います。
プログラマーの方にとっては何でも無いことかと思いますが、非プログラマーのQGISユーザーが、高確率で躓く箇所かと思います。