#author("2020-08-02T13:42:07+09:00","default:nobuoki","nobuoki") #author("2020-08-28T11:40:48+09:00","default:nobuoki","nobuoki") * はじめに [#ga13929e] みんなが大好きな [[基盤地図情報 標高DEMデータ変換ツール | コンテンツ | 株式会社エコリス>https://www.ecoris.co.jp/contents/demtool.html]] をLinuxのCLIで動かしたいと思った人向けの記事です このデータ変換ツールは、 : 変換結合.vbs, convert_and_merge.vbs | 後述する3つのexeファイルとのインターフェース : dem.exe | 基盤地図情報 数値標高データをgeotiffに変換 : gdalbuildvrt.exe | vrtファイル(後述のgdalwarp.exeが参照する)を生成 : gdalwarp.exe | dem.exeが生成したgeotiffファイルを結合 という作りになっているようです vbsファイルはCLI化する際は不要、gdalbuildvrtとgdalwarpはGDALパッケージのインストールでOKなので、dem.exe部分をどうにかすれば良いです * 案1:ソース修正&ビルド [#i3462c95] 容易に使えるよう、コンテナ化してみました #prism(bash){{{ # コンテナのビルド(10分くらいかかります) podman build https://gist.github.com/kemasoft-gist/c5a837b62b4758996c3341d65c8f43b1/raw -t kemasoft/gdal # コンテナでbashを起動する(カレントディレクトリを /mnt にマウント) podman run --rm -it -v .:/mnt kemasoft/gdal bash # コンテナ内:dem -> geotiff 変換 # dem <dem-xml> <0|1> <output.tif> # 第1、第2引数はオリジナルと一緒 # 第3引数に出力先tifファイル名を指定 dem ls FG*.xml | sed 's/.xml$//' | xargs -I@ -P4 dem @.xml 1 @.tif # コンテナ内:vrtファイル作成 gdalbuildvrt -overwrite mergeLL.vrt *.tif # コンテナ内:geotiffファイル結合 gdalwarp -r bilinear -srcnodata -9999 -dstnodata -9999 -t_srs epsg:6668 mergeLL.vrt merge.tif }}} ソース変更箇所 - 冒頭にコピーライト入れた - win32apiの_splitpathが使えないので、思い切って第3引数で出力ファイルを指定するようにした #pre{{{ $ diff -u dem.cpp{.orig,} --- dem.cpp.orig 2020-08-02 08:01:11.360533403 +0900 +++ dem.cpp 2020-08-02 08:11:00.022764072 +0900 @@ -1,3 +1,12 @@ +/* + Copyright (c) 2020 Nobuhiro OKI + Released under the MIT license + https://opensource.org/licenses/mit-license.php + + Original: + https://github.com/tmizu23/demtool/blob/master/dem.cpp +*/ + #include "gdal_priv.h" #include "ogr_spatialref.h" #include "gdalwarper.h" @@ -189,11 +198,14 @@ char fname[256]; char ext[256]; char outpath[1024] = ""; + /* kemasoft _splitpath(argv[1], drive, dir, fname, ext); strcat(outpath, drive); strcat(outpath, dir); strcat(outpath, d0.mesh); strcat(outpath, ".tif"); + */ + strcat(outpath, argv[3]); // kemasoft makeGeotiff(&d0, outpath, nodata); free(d0.alti); return d0.jgd; }}} これでGDAL導入済み環境で g++ dem.cpp -odem -lgdal が出来るようになります - 修正版ソース:[[dem.cpp>https://gist.github.com/kemasoft-gist/4af0d9f60b27487d984a0d2ea7e61624]] - ビルド(Dockerfile):[[Dockerfile.kemasoft-gdal>https://gist.github.com/kemasoft-gist/c5a837b62b4758996c3341d65c8f43b1]] * 案2:wineを使う [#je5832b7] 面倒な割に利便性が全く上がらないのでお勧めしませんw ポイントだけ書いておきます - win32でwineを初期化 - winetricksでMDACをインストール -- 失敗したら手動でMDAC_TYP.EXEを解凍しsetup.exeを起動 - dem.exeを起動 #prism(bash){{{ # コンテナのビルド # オリジナル scottyhardy/docker-wine との差分 # /mnt のパーミッション変更、sudo, vim, build-essential追加) curl -L https://gist.github.com/kemasoft-gist/b4d101eaa922df66c5660e394314d7ca/raw | podman build - -t kemasoft/docker-wine # コンテナ起動 podman run -it \ --rm \ --name wine \ -d \ -v .:/mnt \ --hostname="$(hostname)" \ --env="RDP_SERVER=yes" \ --publish="13389:3389/tcp" \ kemasoft/docker-wine tail -f /dev/null # MDACインストールまではGUIを使うのが無難 # リモートデスクトップで母艦のIP:13389に接続し、その中のターミナルで作業 # 一旦dem.exeが動いてしまえばそれ以降はCLIでOK # wineを32bitモードで初期化 WINEARCH=win32 winecfg # mdac導入 winetricks mdac28 cd /home/wineuser/.cache/winetricks/mdac28 # エラーになった場合の追加手順 cabextract MDAC_TYP.EXE wine $(winepath -w $(pwd))\\dasetup # コマンドプロンプト起動 WINEDEBUG=-msvcrt wine cmd # dem.exe にパスを通し、環境変数 GDAL_DATA を設定 set PATH="%PATH%;Z:\path\to\dem-exe-directory" set GDAL_DATA="Z:\path\to\dem-exe-directory\data" # dem.exe を実行 dem FG-GML-6741-71-07-DEM5C-20190221.xml 0 }}} #ref(./dem01.jpg,50%) * 別解 [#x05dda2f] 先人の知恵にあやかります(というか最初からこれ見つけていれば・・・) - [[Pythonを用いた基盤地図情報 数値標高データのgeotiff変換 - Qiita>https://qiita.com/HidKamiya/items/66b1d98503301446460c]] 先述の「案1」で出てきたコンテナに仕込んであります #prism(bash){{{ # コンテナのビルド(10分くらいかかります) podman build https://gist.github.com/kemasoft-gist/c5a837b62b4758996c3341d65c8f43b1/raw -t kemasoft/gdal # コンテナでbashを起動する(カレントディレクトリを /mnt にマウント) podman run --rm -it -v .:/mnt kemasoft/gdal bash # ここまで「案1」と同じ # コンテナ内:zipファイルのままgeotiffを生成する例 cd /path/to/dem-file-dir zdem2tif FG*.zip # コンテナ内:dem -> geotiff 変換 # コンテナ内で作業:dem -> geotiff 変換 # dem <dem-xml> <0|1> <output.tif> # 第1、第2引数はオリジナルと一緒 # 第3引数に出力先tifファイル名を指定 dem ls FG*.xml | sed 's/.xml$//' | xargs -I@ -P4 dem @.xml 1 @.tif ls FG*.xml | sed 's/.xml$//' | xargs -I@ -P4 dem @.xml 1 @.tif # コンテナ内:vrtファイル作成(案1と同じ) # コンテナ内で作業:vrtファイル作成(案1と同じ) gdalbuildvrt -overwrite mergeLL.vrt *.tif # コンテナ内:geotiffファイル結合 # コンテナ内で作業:geotiffファイル結合 # ★ srcnodata = -1 を指定するのがおすすめです gdalwarp -r bilinear -srcnodata -1 -dstnodata -9999 -t_srs epsg:6668 mergeLL.vrt merge.tif }}} #ref(./dem02.jpg,50%) * 別解その2 [#a1b43b2b] [[fgddem.py/fgddem.py at master · minorua/fgddem.py>https://github.com/minorua/fgddem.py/blob/master/fgddem.py]] をLinuxで動くようにちょっと変更します - ワイルドカード展開を(system.osが起動する) sh に任せます -- ただし空白などエスケープが必要な文字を含む入力ファイル名を指定するとエラーになります #prism(bash){{{ root@d9395998343a:/usr/local/bin# diff -u fgddem{.py,} --- fgddem.py 2020-08-02 03:29:45.800481748 +0000 +++ fgddem 2020-08-02 03:21:35.000000000 +0000 @@ -194,7 +194,7 @@ # TODO: testing in Linux # Wildcards cannot be used for arguments now. See http://trac.osgeo.org/gdal/ticket/4542 (2012/04/08) else: - merge_command = 'gdalwarp%s "%s" "%s"' % (gdalwarp_options, + merge_command = 'gdalwarp%s %s "%s"' % (gdalwarp_options, os.path.join(temp_dir, "*.tif"), dst_file) }}} こちらも先述の「案1」で出てきたコンテナに仕込んでありますので、コンテナ起動後、 fgddem path/to/xml-or-zip-file で起動できます ** memo [#h733350b] : vrd | gdalbuildvrt -overwrite mergeLL.vrt *.tif : JGD2011 緯度経度 | gdalwarp -r bilinear -srcnodata None -t_srs epsg:6668 mergeLL.vrt merge-6668.tif : 平面座標系12 | gdalwarp -r bilinear -srcnodata None -t_srs epsg:6680 mergeLL.vrt merge-6680.tif : -9999 | gdalwarp -r bilinear -srcnodata -9999 -dstnodata -9999 -t_srs epsg:6668 mergeLL.vrt merge-6668.tif : zdem2tif | gdalwarp -r bilinear -srcnodata -1 -dstnodata -9999 -t_srs epsg:6668 mergeLL.vrt merge-6668.tif