batコードと,レイヤ結合方法のメモです.
win11, 24H2環境で作成してます.
以下の内容を含みます.
- 複数のzipファイルの解凍するbat
- 複数のフォルダ内のデータを同じディレクトリに移動するbat
- 複数のベクタファイルの統合
- 複数のラスタファイルの統合
- 文字列を指定して指定したフォルダに移動するbat
何に使うの?
日本国内のGISデータを使用したいと考えたとき,まず使いたくなるのが国土数値情報だと思う.
データ自体は国土地理の標高データとか国土数情報のサイトから無料でダウンロードできるのでお手軽なわけだが,QGISなどで利用可能な形態に変換するのは非常に面倒くさい.
ちなみに,単に陰影図を描画したいだけで,精度が低くても問題ないならGEBCOのサイトから,指定した座標範囲のラスタデータを直接ダウンロードできる.
海岸線のshpファイルを使用すると描画しやすくなるよ.

こんな感じのフォームから,ダウンロードしたいグリッドを選択して全ファイルをダウンロードできるが...

ダウンロード先のディレクトリには大量のzipファイルが生成されてしまい,これの一括解凍が第一の難関になる.
複数のzipファイルを解凍するbat
大量のzipの解凍自体は7-Zipを使用すれば解決するのだが,うぷ主の環境ではエラーを吐いてしまった...
そこで以下のようなbatを作成してみた.
@echo off
setlocal enabledelayedexpansion
:: 解凍対象のディレクトリを指定
set "target_dir=C:\path\to\your\directory"
:: 対象ディレクトリに移動
cd /d "%target_dir%"
:: すべてのZIPファイルを処理
for %%f in (*.zip) do (
echo 解凍中: %%f
powershell -command "Expand-Archive -Path '%%f' -DestinationPath '.' -Force"
)
echo 処理が完了しました。
pause
これを適当なtxtエディタに突っ込んで拡張子を.batに変更し,実行すると指定したディレクトリ内のzipファイルを順次解凍してくれる.
※ただし,UTF-8の全角日本語はcmd上で文字化けするので注意
以下のようになる.
指定したディレクトリを見てみると,zipファイルと同じ数の解凍済みフォルダが生成されている.

この各フォルダ内に,ラスタデータやベクタデータセットが格納されている.

複数のフォルダ内のデータを同じディレクトリに移動するbat
QGISを使用する場合,ここまで出来たらそのままファイルのマージに取り掛かれる.
のだが,のちの操作をいろいろと楽にするため,すべてのフォルダ内のデータを同じディレクトリにおいておきたい.
そこで,解凍済みのフォルダのみからなるフォルダを新しく作成.

G02_12_unfold内にすべてのサブフォルダを格納しておく.

以下のbatを実行することで,G02_12_unfold内のすべてのサブフォルダ内のファイルをG02_12_unfold/の位置に移動させる.
@echo off
setlocal enabledelayedexpansion
:: 移動元の親ディレクトリを指定
set "source_dir=C:\Users\IWASAKI_YUKATA\Desktop\project"
:: 対象のディレクトリに移動
cd /d "%source_dir%"
:: サブフォルダ内のすべてのファイルを移動
for /r %%d in (*) do (
if "%%~xd" neq "" (
echo 移動中: %%d
move "%%d" "%source_dir%"
)
)
echo 処理が完了しました。
pause
以下のように,サブフォルダ内のすべてのファイルが移動され

もとのサブフォルダ内はからっぽになる

空フォルダは消去してしまったほうがよいと思われ
複数のベクタファイルの統合
ベクタファイルの統合にはQGISを使用できる.
新しいプロジェクトを作成し,

ベクタ>データ管理ツール>ベクタレイヤをマージ


入力レイヤの...>ファイルを追加で先ほどのファイルの入ったディレクトリ内のファイルを指定する(今回は.shp)
次にCRSを指定する.


ここは何でもいいと思うけど,とりあえずならWGS 84の世界測地系にしておくのが便利かと思う.
適当なファイル名を指定したら実行
.shpと一緒に生成されてる.dbfを適当なスプレッドシートで開くと,属性テーブルを確認できる.

今回の元データは1x1kmのグリッドデータなので,グリッド数と同じ行数のデータテーブルが閲覧できる.
統合前のファイルは消去してよいだろう.
複数のラスタファイルの統合
ここでは特に国土地理院の標高データを統合する手法について解説する.
余談だが,2025/04/01から基板地図情報ダウンロードサービスのフォームが利便性が低いものに改訂されている.
ユーザビリティに配慮できない改定は非常に害悪である
さて,国土地理院の数値データは.xmlファイルとして出力されている.

この拡張子は,QGISの対応外となっているので,そのまま読み込もうとしてもエラーが出力される.

ので,先ほどのベクタファイルのように結合をしようとしても...


結合はしてくれない.
これを解決する手法は2つある.
- QGISのプラグインを使用する方法
-
DEMの結合ツールを使用する方法
それぞれ順に解説していく.
QGISのプラグインを使用する方法
QGISのプラグイン-つまり拡張機能-の一つに,QuickDEM4JPというものがある.
これをインストールすると,指定したディレクトリ内の.xmlファイルを統合してくれる.


…特段解説は不要だと思うが,統合したいファイルを選択し,実行するだけで統合した.tifを作成してくれる.
ただし,以下の点に注意
- メモリの使用量が多い
どうやら,.xmlの読み込みの際,データをメモリ上にプールするようで,ファイルサイズの合計値分のメモリ容量が消費される.(画像では赤線の時点から処理を開始)
つまり,合計サイズ50GBのファイルを統合したいなら64GB分のメモリを積む必要があるので,大規模なデータの処理には不適だろう.
- ファイル数が多い場合や座標系が異なる場合エラーが出る.
これは当然といえば当然.
座標系については言うに及ばずだが,ファイル数についてはうぷ主の経験上450ファイルを超えるとまず確実に止まる.
そのため,日本列島規模などの大規模なデータを統合する予定なら,以下の手法を試してみてほしい.
DEMの結合ツールを使用する方法
ここでは,株式会社エコリスが提供する基盤地図情報 標高DEMデータ変換ツールを使用する方法について解説していく.
まずは上記のリンクのソフトウェアを入手してほしい.
これもRedMeを読めば済む話だが...

変換結合.vbsで実行できる.
起動すると以下のような警告が出る.

これに対処するには,測地系ごとに個別に変換結合.vbsを実行するしかない.
改訂前のサイトからダウンロードした際は,測地系が異なった場合,
FG-GML-4730-00-dem10b-20161001.xml
FG-GML-4731-00-DEM10b-20161001.xml
といった感じに小文字のdemと大文字のDEMで識別できた.
そこで,以下のようなbatを作ってみた.
@echo off
setlocal
:: 指定するディレクトリを設定
set "DIR=H:\20250406151942432-001"
:: "1"フォルダがない場合、作成
if not exist "%DIR%\1" (
mkdir "%DIR%\1"
)
:: "2"フォルダがない場合、作成
if not exist "%DIR%\2" (
mkdir "%DIR%\2"
)
:: "dem"を含むファイルを"1"フォルダに移動
for %%F in (%DIR%\*) do (
if /i "%%~nxF" neq "1" if /i "%%~nxF" neq "2" (
echo %%~nxF | findstr "dem" > nul
if not errorlevel 1 (
if "%%~dpF" neq "%DIR%\1\" (
move "%%F" "%DIR%\1\"
)
)
)
)
:: "DEM"を含むファイルを"2"フォルダに移動
for %%F in (%DIR%\*) do (
if /i "%%~nxF" neq "1" if /i "%%~nxF" neq "2" (
echo %%~nxF | findstr "DEM" > nul
if not errorlevel 1 (
if "%%~dpF" neq "%DIR%\2\" (
move "%%F" "%DIR%\2\"
)
)
)
)
endlocal
これで振り分けた先のフォルダを指定し,実行すると...

フォルダ内に続々と.tif変換されたファイルが生成される.

最後に統合プロセスが行われ…

merge.tifという名前の統合されたファイルが生成される.
複数座標系があった場合,座標系ごとに統合ファイルが生成されるので,最後にラスタ>その他>結合を行えばよい.
この結合プロセスではメモリはあまり圧迫されなかったはず...

以上!

