標高タイルは地形データをウェブで効率的に配信・利用するための重要な技術です。現在、主に使用されている3つの規格について解説します。
標高タイル規格の計算式
現在、主に使われている標高タイルの規格は、主に以下の3つです。
1. 数値PNGタイル
- 計算式:
X = 216×R + 28
として×
G + BX < 223
の場合:標高値 = X × 標高分解能X > 223
の場合:標高値 = (X – 224) × 標高分解能
- 無効値:アルファチャンネル0(完全に透明な画素)
※国土地理院の標高タイルなど、X = 223
の場合((R, G, B) = (128,0,0))を無効値と扱う場合もあります。 - 標高分解能:0.01m
※標高分解能は任意に設定できますが、標高を表現する場合には通常0.01mが使われますので、以下、標高分解0.01mとして説明します。 - 表現可能な範囲
- 最小値:(R, G, B) = (128,0,0) の場合で、-83,886.08m
- 最大値:(R, G, B) = (127,255,255) の場合で、83,886.07m
- 参考:産業技術総合研究所のグリッドPNGタイルのページ
2. Mapbox Terrain-RGB
- 計算式:標高値 = -10000 + ((216 × R + 28 × G + B) × 0.1)
- 標高分解能:0.1m
- 表現可能な範囲
- 最小値:(R, G, B) = (0, 0, 0) の場合で、-10,000m
- 最大値:(R, G, B) = (255, 255, 255) の場合で、1,667,721.5m
- 参考:Mapbox社のTerrain-RGBのページ
3. Terrarium
- 計算式:標高値 = -32768 + (28 × R + G + 2-8 × B)
- 標高分解能:0.00390625m
- 表現可能な範囲
- 最小値:(R, G, B) = (0, 0, 0) の場合で、-32,768m
- 最大値:(R, G, B) = (255, 255, 255) の場合で、32,767.9960938m
- 参考:TilezenのTerrain Tilesのページ
これをグラフで表現すると以下のようになります。
数値タイル規格の比較
表現可能な標高範囲 | 標高分解能 | 無効値 | |
数値PNGタイル | -83,886.08m ~ 83,886.07m | 0.01m | (R, G, B) = (128,0,0) |
Mapbox Terrain-RGB | -10,000m ~ 1,667,721.5m | 0.1m | 定義なし |
Terrarium | -32,768m ~ 32,767.9960938m | 0.00390625m | 定義なし |
- 表現可能な標高範囲
規格により異なりますが、いずれの規格でもエベレスト(8,849m)やマリアナ海溝チャレンジャー海淵(-10,920m)などの標高を表現可能です。 - 標高分解能
規格により異なり、Mapbox Terrain-RGBは0.1mで、他の規格より大きくなっています。 - 無効値
無効値が定義されているのは、数値PNGタイルのみです。
標高分解能と無効値について、以下で詳しく見ていきます。
標高分解能の違いによる地形表現の違い
Mapbox Terrain-RGBは標高分解能が0.1mで、他の規格より大きくなっていますが、標高タイルを使った地形表現にこれがどう影響するかを考察します。
下の図は、数値標高タイルをもとにCS立体図を描画したものです。右側の図は、Mapbox Terrain-RGB形式のタイルを再現するため、0.1m単位でデコードしています。
左右を見比べて分かるように、右側の図では等高線状のラインが入っています。
なぜこのような状態になるかというと、下図のように標高分解能が不足し、緩傾斜の地形を適切に表現できていないからです。
標高分解能が不足すると書きましたが、正確には水平方向の解像度に比べて標高分解能が不足している状況です。
先ほどの図はズームレベル18(水平解像度0.5m相当)の場合でしたが、ズームレベルを下げてみてみると、標高分解能0.1mではズームレベル15(水平解像度5m相当)までは、等高線状のラインが入ることが分かりました。
今回はCS立体図で比較しましたが、傾斜量図や陰影図でも上記と同じ結果になります。
したがって、ZL15(水平解像度5m相当)以上の標高タイルの場合、標高分解能0.1mでは不足することが分かりました。つまり、Mapbox Terrain-RGBは、ZL15(水平解像度5m相当)以上には適さないということになります。
無効値
標高タイルを作成する際、標高データの提供範囲外は無効値として扱う必要があります。
例えば、航空レーザ測量による標高データをタイル化する場合、測量区域外、海上、河川、湖沼などは無効値となります。下図の数値PNGタイルで赤色の部分が無効値として扱われている部分です。
しかし、Mapbox Terrain-RGBやTerrariumでは無効値の取り決めがありません。無効値を0mとする場合もありますが、本当に0mの部分なのか、無効値なのか判別できなくなってしまいます。
数値PNGタイルのメリット
以上から数値PNGタイルには、
- 適切な標高分解能で標高を表現できること
- 無効値の定義が明確であること
というメリットがあるため、全国Q地図では数値PNGタイルを採用しています。
また、数値PNGタイルの作成には、全国Q地図で提供しているgdal2NPtiles.pyが利用可能です。
ただし、MapLibre GL JSなどの地図ライブラリは、現時点において数値PNGタイルに対応していませんので、プラグインやaddProtocolなどを使用する必要があります。
Q&A
ここからは、Q&A形式で更に深く考察します。
Q1 0.01mの標高分解能が必要とのことですが、そもそも航空レーザ測量でそこまでの分解能のデータが取得されているのですか?
確かに、公共測量における標準的な作業方法等を定める「作業規程の準則」において、グリッドデータの標高値は0.1メートル位とする旨が定められています。
作業規程の準則 第564条
6 グリッドデータにおける標高値は、0.1メートル位とする。
一方、現在公開されている航空レーザ測量のDEM(グリッドデータ)を見てみると、実際には0.01メートル位(場合によっては0.001メートル位)で標高値が格納されています(0.01m位:栃木県、兵庫県、林野庁・能登、高知県、0.001m位:東京都)。
国土地理院の基盤地図情報においても、以下のように扱われています。
国土地理院基盤地図情報サイトFAQ 3-5
基盤地図情報(数値標高モデル)の標高値の記載は0.01m単位となっていますが、0.1m単位で求めたものが有効値であり、小数点以下2位については参考値として格納しています。
0.01m位は、絶対的な精度としては参考値という扱いですが、相対的な精度としては十分に意味のあるものになっていて、グリッドデータを使った地形の可視化には0.01m位までの標高データを使用することが有効であると考えています。
Q2 標高分解能0.1mと0.01mでは、本当に見た目が違うんですか?
まず、(例は省略しますが)立体表示(3D)では違いはほとんど分かりません。
見た目が違ってくるのは、おおむねズームレベル15(5mメッシュ相当)以上の標高タイルを使って、傾斜量図やCS立体図などに加工した場合で、緩傾斜の部分で違いが顕著にあらわれます。急傾斜の部分では、違いはほとんどありません。
これまで標高タイルを使って違いを説明してきましたが、ここでは標高タイルを使わない例をお示しします。
下の図は、栃木県の標高データをもとに作成したCS立体図です(csmap-pyを使用して作成)。上は0.01m位で標高が記録されたもとのTIFを使用、もう1つは0.1m位に四捨五入したTIFを使用したものです。0.1m位に四捨五入した方は、等高線状のラインが入ってしまい、地形が分かりにくくなっているのが分かります。
もう一つ例をお示しします。同じ栃木県の標高データを使った例ですが、こちらは傾斜のある山地です。谷底の緩傾斜の部分に等高線状のラインが一部で見られますが、それ以外の部分ではほとんど違いはありません。
標高タイルを作成するエリアや、標高タイルを使う地形表現が限定されている場合では、標高分解能0.1mのMapbox Terrain-RGBでも支障はないかもしれません。
しかし、現実的には、急傾斜の部分だけを対象にして標高タイルを作成する場合というのはほとんどないでしょうし、ベクトルタイル同様、使う側が表現を自由に変えられるのが標高タイルのメリットです。ズームレベル15以上で標高タイルを作成する場合には、多様な地形表現に利用可能な標高分解能をもつ規格を使うことが望ましいでしょう。
Q3 Mapbox Terrain-RGBやTerrariumで無効値を0にすることに問題があるのは理解しました。ほかに方法はないですか?
この点については例えば、数値PNGタイル同様、アルファチャンネルを使って、無効値の部分には透明の画素にするといったルールを設けることで解決が可能と考えます。
コメント