GISっ子/Linuxで基盤地図情報標高DEMデータ変換したい

はじめに

みんなが大好きな 基盤地図情報 標高DEMデータ変換ツール | コンテンツ | 株式会社エコリス を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:ソース修正&ビルド

容易に使えるよう、コンテナ化してみました

# コンテナのビルド(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

ソース変更箇所

$ 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 が出来るようになります

案2:wineを使う

面倒な割に利便性が全く上がらないのでお勧めしませんw
ポイントだけ書いておきます

# コンテナのビルド
#   オリジナル 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
dem01.jpg

別解

先人の知恵にあやかります(というか最初からこれ見つけていれば・・・)

先述の「案1」で出てきたコンテナに仕込んであります

# コンテナのビルド(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 <dem-xml> <0|1> <output.tif>
#     第1、第2引数はオリジナルと一緒
#     第3引数に出力先tifファイル名を指定
ls FG*.xml | sed 's/.xml$//' | xargs -I@ -P4 dem @.xml 1 @.tif

# コンテナ内で作業:vrtファイル作成(案1と同じ)
gdalbuildvrt -overwrite mergeLL.vrt *.tif

# コンテナ内で作業:geotiffファイル結合
#   ★ srcnodata = -1 を指定するのがおすすめです
gdalwarp -r bilinear -srcnodata -1 -dstnodata -9999 -t_srs epsg:6668 mergeLL.vrt merge.tif
dem02.jpg

別解その2

fgddem.py/fgddem.py at master · minorua/fgddem.py をLinuxで動くようにちょっと変更します

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

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

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-08-02 (日) 12:45:01