#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」というフォルダに変換元のファイルを入れています。
この関数を使うと、フルパスでファイル名が取得されていることがわかります。
次に「replace」をみてみます。
文字列内で文字の入れ替えができるようです。デスクトップに「TEST_2」という出力フォルダを用意しているので、「TEST_1」を「TEST_2」に入れ替えると目的が達成できそうです。
入力した式は次のとおりです。
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変換の時と違ってフルパスでなくファイル名が出力されます。
欲しいのはファイル名なので「INPUT」を使うだけで良いように思いましたが、新しいフィールドの値が「Null」になりました。
もしかしてと思い、手作業で「バッチ処理・フィールド計算機」の「計算式」フィールドに表示された文字列をシングルクオーテーションで囲んでから実行してみたところ、属性テーブルに書き込むことができました。
さて、これを式で処理したいですが、「''」をシングルクオーテーションで囲むことで解決しました。
「'」や「\」を文字列として扱う場合、2つ重ねますので、これをシングルクオーテーションで囲んだということですね。
入力した式は次のとおりです。
'''' || @INPUT || ''''
最後に「計算結果」です。ここには出力先のフルパスを入れたいです。
エクスプローラーで「TEST_2」フォルダまで移動してアドレスバーからパスをコピーしておきます。
「オートフィル」ボタンをクリックして「式による計算」を選びます。
左の式枠に先程のパスを貼り付けて、ちょこちょこと編集します。
'C:\\Users\\owner\\Desktop\\TEST_2\\' || @INPUT || '.shp'
「実行」ボタンをクリックして、処理を実行します。
#3.さいごに
「フィールド計算機」でバッチプロセスを行うことができるというのは、注目すべきことだと思いました。
たぶん気づいていない人も多いかと思います。
それとさらっと書いていますが、シングルクオーテーションの4連打('''')に辿り着くまで、それなりに試行錯誤しました。多分、半日くらい悩んだと思います。
プログラマーの方にとっては何でも無いことかと思いますが、非プログラマーのQGISユーザーが、高確率で躓く箇所かと思います。