このページでは、主に技術的な情報を記載しています。使用方法など、一般利用者向けの情報は、以下のURLで公開しています。 https://info.qchizu.xyz/qchizu/maplibre_terrain/
オープンソースの地図ライブラリであるMapLibre GL JSを使った「全国Q地図MapLibre版」は、2024年1月7日に公開を開始し、現在、地形表示に特化して順次、機能追加を進めています。
URL(地図ページ) https://maps.qchizu.xyz/maplibre
URL(紹介ページ) https://info.qchizu.xyz/qchizu/maplibre_terrain/
地理院地図をベースに開発した全国Q地図(通常版)では、独自にタイル化したラスタータイルの地形図を中心に公開を行っていますが、地形の立体表示や大量のベクトルデータの表示は困難でした。 そこで、これらのデータの表示・公開のため、オープンソースの地図ライブラリであるMapLibre GL JSを使った全国Q地図MapLibre版を開発し公開しました。
航空レーザによる詳細な標高データを使って、様々な地形表現ができるため、とにかく地形がよく分かります。
地形の立体表示と平面表示を切り替えられます。
標高データから等高線や段彩図、陰影図、傾斜量図を生成して表示できます。
立体的表示や等高線などの表示に利用する標高データの切り替えが可能です。
JavaScriptのフレームワークとして、Svelteを利用しています。
.gitignore
: gitの追跡対象外とするファイル/ディレクトリを指定index.html
: サイトのエントリーポイントとなるHTMLファイルpackage.json
: プロジェクトの依存関係やスクリプトを管理README.md
: 本ファイル。プロジェクトの説明や構成を記載vite.config.js
: Viteの設定ファイル
App.svelte
: SvelteのルートコンポーネントファイルAppButton.svelte
: ボタンのSvelteコンポーネントmain.js
: Svelteアプリのエントリーポイント。App.svelteをマウントするMap.svelte
: 地図を表示するSvelteコンポーネントSidebar.svelte
: サイドバーを表示するSvelteコンポーネントutils.js
: 描画を更新する関数を定義
dem2ReliefProtocol.js
: DEMデータから段彩図を作成するプロトコルdem2SlopeProtocol.js
: DEMデータから傾斜量図を作成するプロトコルdemTranscoderProtocol.js
: DEMデータの形式を変換(gsj→mapbox)するプロトコルprotocolUtils.js
: protocolから共通して利用する関数を定義
MapSources.js
: 地図のソースを定義MapLayers.js
: 地図のレイヤーを定義MapViewParameters.js
: 地図表示のパラメーター(中心座標、ズームレベルなど)を管理するストアPitch.js
: 地図の傾きを管理するストアSelectedBaseLayer.js
: 選択されたベースマップレイヤーを管理するストアSelectedDemSource.js
: 選択されたDEMソースを管理するストアSelectedOverLayers.js
: 選択されたオーバーレイレイヤーを管理するストアDemSources.js
: DEMソースの定義
layer_map.png
: 地図ボタンで使用する画像
PNG標高タイルは、0.01mの標高分解能で-83,886.07~83,886.07mまでの範囲を表現可能で、無効値も明確に定義されている1という点で優れた規格ですが、MapLibre GL JSではサポートされていません。 そこで、本サイトでは、MapLibre GL JSのaddProtocolという仕組み2を利用して、タイルをmapbox形式に変換しています。具体的には、自作のprotocol(demTranscoderProtocol.js)で変換し、立体表示と陰影表示に利用しています。
MapLibre GL JSの機能3を利用しています。
maplibre-contourという等高線を表示できるプラグイン4を一部改良して、PNG標高タイルを処理できるようにして利用しています。 改良したプラグインは、maplibre-contour-adding-PNG-Elevation-Tileという名前でGitHubで公開しています5。
MapLibre GL JSのaddProtocolを利用して、標高タイルから標高値を計算し、標高値に応じて塗り分けて表示しています。
MapLibre GL JSのaddProtocolを利用して、標高タイルから標高値を計算し、さらに隣接するピクセルの標高値から傾斜量を計算し、傾斜量に応じて塗り分けて表示しています。 なお、addProtocolは、タイルを1枚ごとに変換する仕組みですが、傾斜量図を作成するprotocolは、隣接するタイル(具体的には右、右下、下のタイル)をあわせて読み込んで処理するようにしています。これは、隣接するピクセル(具体的には右、右下、下のピクセル)の標高値を用いて計算する傾斜量図を、タイル境界によらずシームレスに表示するためです。
本サイトでは、国土地理院、産総研が配信している標高タイルに加えて、独自に作成した以下の標高タイルを利用しています。
国土地理院の基盤地図情報(標高)を加工したものです。なお、国土地理院から測量成果の使用承認を受けています。 作成手順
- 株式会社エコリスの「基盤地図情報 標高DEMデータ変換ツール」を用いてJPGIS(GML)形式をGeoTIFF形式に変換。
- Pythonを用いた自作プログラムでRGBの画像に変換。
- gdal2tilesでタイルに変換。
朝日航洋株式会社が公開するGeoTIFF形式の標高データを加工したものです。 作成手順は、上記2~3と同じです。
G空間情報センターが公開するグランドデータを加工したものです。 作成手順
- GMTを用いてグランドデータからTIN(不整三角モデル)によりグリッドデータ(GeoTIFF形式)を作成。
以降は、上記1~3と同じです。
なお、これらの標高タイルの詳細は、G空間情報センターのページで公開しており6、他のウェブサイトから利用することも可能です。
標高タイルからCS立体図を作成するaddProtocolを作成し、2024.5.12に試験公開を開始しました。
標高タイルからCS立体図を作成するには、標高の平滑化や複数の画像の重ね合わせなど、複雑な計算が必要なため、TensorFlow.jsを用いて計算の高速化を図りました。
今後は、無効値の取り扱いや小縮尺での表示など、各種パラメーターの最適化、さらなる表示の高速化、メモリやキャッシュの使用量の最適化などを行う予定です。
Footnotes
-
国土地理院の資料に分かりやすい記載があります。 令和2年度調査研究年報「3次元地図データをウェブ地図に表示するための技術的検討」 ↩
-
https://maplibre.org/maplibre-gl-js/docs/API/functions/addProtocol/ ↩
-
https://maplibre.org/maplibre-gl-js/docs/examples/3d-terrain/ ↩
-
https://github.com/qchizu/maplibre-contour-adding-PNG-Elevation-Tile ↩
-
基盤地図情報1m・5mメッシュDEM 標高データ(PNG標高タイル) https://www.geospatial.jp/ckan/dataset/qchizu_94dem_99gsi 石川県能登地方 標高データ(PNG標高タイル) https://www.geospatial.jp/ckan/dataset/qchizu_94dem_17p_ishikawa_f ↩