3D地形と3D都市を表示して富士山と渋谷にドローン飛ばしてみた

こんにちは! 運航管理開発部の藤井です。

最近UTM(ドローン運航管理システム)サービスの開発でフロントエンドの開発をする機会があり、地図系WebGLで3d terrainと3dモデルを組み合わせて描画できるのかを検証したく今回記事にしてみました。Maplibre-gl-jsのaddProtocolを使用して国土地理院の標高タイルをDEMのラスタータイルに変更したものを描画するような作りにしております。

使用技術, ライブラリ
  • React
  • Typescript
  • Three.js
  • Maplibre-gl-js

3D地形の描画と3Dモデルのシミュレーション

具体的な実装は @itouotiさん、@Kanahiroさんの記事が詳しいです。

今回の実装にあたりmaplibre-gl-jsから標高値の取得をおこなっており、Map.transformクラス内のメソッドgetElevationから取得します。

この際デフォルトで450m標高が高く表示される実装になっているため一律で450m下げる必要があります。

 API to access thr camara target elevation when using terrain

また、terrainのスタイルを適用する時に実標高データをそのまま適用するために標高データに対してどれだけ地形を隆起して表示させるかの倍率を表すexaggerationをデフォルトもしくは1にします。

map = new maplibregl.Map({
        container: mapContainer.current,
        ...
        style: {
          sources: {
            ...
            terrain: gsiTerrainSource,
            ...
          },
          layers: [
            ...
          ],
          terrain: {
            source: "terrain",
            exaggeration: 1,
          },
        },
      });
const lngLat = map.unproject(e.point);
setLng(Number(lngLat.lng.toFixed(4)));
setLan(Number(lngLat.lat.toFixed(4)));
setElevation(
    Number(
        map.transform.getElevation(lngLat, map.styl.terrain).toFixed(2)) - 450
    );
});

ドローンのフライトルートについては国土地理院のWeb地図より線形データをgeoJson形式で取得しました。

都心部では平地に高さのある建物が建っています。おおよそドローンは30mから150mの間で飛行することが想定されており、上記だけだと建物への接近状況が可視化できません。

そのため今回はPlateauの3Dモデルをindigoさんがベクタータイルに変換したものを使用して建物の可視化までやってみます。

map = new maplibregl.Map({
        ...
        style: {
          sources: {
            ...
            plateau: {
              type: "vector",
              tiles: [
                "https://indigo-lab.github.io/plateau-tokyo23ku-building-mvt-2020/{z}/{x}/{y}.pbf",
              ],
              minzoom: 10,
              maxzoom: 16,
              attribution:
                "データの出典:<a href='https://github.com/indigo-lab/plateau-tokyo23ku-building-mvt-2020'>plateau-tokyo23ku-building-mvt-2020 by indigo-lab</a> (<a href='https://www.mlit.go.jp/plateau/'>国土交通省 Project PLATEAU</a> のデータを加工して作成)",
            },
          },
          layers: [
            ...
            {
              id: "bldg",
              type: "fill-extrusion",
              source: "plateau",
              "source-layer": "bldg",
              "minzoom": 10,
              "maxzoom": 20,
              paint: {
                "fill-extrusion-color": "#797979",
                "fill-extrusion-height": ["*", 1.0, ["get", "measuredHeight"]],
              },
            },
          ],
          terrain: {
            ...
          },
        },
      });

画面の表示するタイミングで録画を開始しております。ベクターファイルですが思ったより早く描画されているなと感じました!

まとめ

ドローンの運行管理をデジタルツインっぽい3Dにする際の主要なものを組み合わせてみましたが、ドローンの実映像と画面上の視界を一致させようとするにはまだDSMの建物や大きいオブジェクトの標高データをどのように取るかの課題があります。

またドローンは高度を変えながら飛行するためそれを画面上に反映する必要もあります。

参照データ
DEM標高タイル(国土地理院)
国土地理院地図Web
indigo株式会社さんのMVT形式データセット – 3D都市モデル
ドローン3Dモデル

参考資料
@itouoti – React/mapboxの地図上で3Dモデルを動かす(Qiita )
@Kanahiro – maplibre-gl-gsi-terrain(github)
MapLibre GL JSと地理院標高タイルで3D地形を表示(Qiita)
Maplibre GL JS の addProtocol の使い方を調べる (Qiita)
MapLibre(v2.2.0-pre.2.)での3次元表示(Terrain 3D)を試してみる
Reactを用いたCesiumの応用
航空レーザ測量の仕組み

Join our team!

ご覧いただきありがとうございました。テラドローンではエンジニアを募集しています!一緒にテラドローンで技術のアップデート・社会に役立つプロダクト開発を行っていきたい方
ぜひCasual Talk へ気軽にお申し込みください。

hiroyuki_fujii

運航管理開発部に所属しています, Go / pythonでバックエンドの開発をしてきました.
mapboxやTypescriptを最近触り始めました
ほぼ毎日サウナに行っています


Posted

in

, , , ,

by

Tags: