9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

国土地理院の標高データ(DEM)Rustで高速にパースしてGeoTiffに変換するツールを公開しました!(Terrain RGBもあるよ)

Last updated at Posted at 2025-06-02

みなさんこんにちわ!

みなさんは突然「あーーーー地表面の形状を可視化してぇなーーーーー」と思うことはありますか?

僕はあります。
(4年ぶり2度目)

以前こんな記事を公開しました!

これはQGISで国土地理院のDEM(数値標高モデル)XMLファイルを読み込むQGISプラグインを作った記事なんですが、おかげさまでとてもたくさんの方に利用してもらっています。
(現在、僕は関わっていないんですが…)

image.png

この中で利用している内部モジュールでconvert_fgd_demというライブラリも自作しています。

なんですが!結構処理が非効率だったり、そもそもPythonで書かれていて遅かったりします。

もう4年も経ったし、最近はRustも書いてるしAIも発展しているしで色々状況は変わったので「ちょっとリファクタするかー」と思ったのでガッと作り直してしまいました!

今回はQGISプラグイン化していないんですが、PyO3とmaturinでPythonバインディングも作ってるので、いつかQGISプラグインにも移植しようと思います!

使い方

インストール

今回作ったのはこちらのライブラリです。

crates.ioに公開しているので、Cargoでサクッとインストールできます。

Rustがインストールされていない場合は以下を参考にしてコマンドを1つ実行するだけでインストールできるようになります。

もしくは、curlでバイナリを直接インストールすることもできます。

$ cargo install japan-dem
or
$ curl --proto '=https' --tlsv1.2 -LsSf https://github.com/nokonoko1203/japan-dem/releases/download/${VERSION}/japan-dem-installer.sh | sh

基本的な使い方

利用方法はとても簡単です。

# 単一XMLファイルの変換
japan-dem input.xml -o output_dir

# ディレクトリ一括変換(複数DEM結合しない)
japan-dem input_dir/ -o output_dir

# ZIPファイルを処理(複数DEM結合)
japan-dem input.zip -o output_dir --merge

# Terrain-RGB形式で出力
japan-dem input.xml -o output_dir --terrain-rgb

# 並列処理のスレッド数を明示的に指定
japan-dem input_dir/ -o output_dir --threads 8

QGISなどで読み込ませるとこんな感じでよく見るDEMが表示されます。

QuickDEM4JPプラグインと比較すると20倍超の速度が出ていたので、大規模に変換したい場合はこちらのツールで変換されると良いのではないでしょうか!

image.png

ちなみにTerrain-RGBも綺麗に変換できていそうです!

image.png

Pythonバインディングの実装

せっかくRustで高速なパーサーを作ったので、Pythonからも使えるようにしたくなりました。

現代ではPyO3を利用してこんな感じで簡単にバインディングを作れます。
(作成したRustの関数などをPythonで呼び出すための特殊な記法で修飾してあげるだけ)

(ちなみに、こんな感じで公開していますが、CIが微妙に上手くいってなくて最新版がアップロードされていないかもしれません。)

Pythonでの使い方

import japan_dem

# XMLファイルを解析
dem_tile = japan_dem.parse_dem_xml("input.xml")
print(f"Mesh code: {dem_tile.metadata.mesh_code}")
print(f"Size: {dem_tile.rows}x{dem_tile.cols}")

# Terrain-RGB GeoTIFFとして出力
japan_dem.dem_to_terrain_rgb(dem_tile, "output.tif")

終わりに

今回はRustで高速なDEM(XML)パーサーを作ってみました!
また、Pythonバインディングも提供することで、既存のGISワークフローにも簡単に組み込めるようになりそうです!

オープンソースで公開しているので、ぜひ皆さんも使ってみてください!
バグ報告や機能要望もお待ちしています。

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?