tpc06-1

TOPIC 6|Cesiumで活用する[1/2]|Cesiumの基礎を体験する

Cesiumは、オープンソースの3D地理空間可視化プラットフォームです。3Dの地物や地形データを読み込んで、ブラウザだけでGISを実現できます。ここでは、CesiumのJavaScriptライブラリであるCesiumJSを使って、PLATEAUの3D都市モデルをブラウザで表示するプログラムを作っていきます。

Share

TOPIC6:Cesiumで活用する

Cesiumは、オープンソースのWebGISです。このトピックでは、CesiumでPLATEAUを活用する方法を説明します。

【目次】

6.1  Cesiumとは

 6.1.1  Cesiumの構成

6.2  CesiumJSの基礎を体験する

 6.2.1  Glitchのプロジェクトを作る

 6.2.2  建築物モデルを追加する

 6.2.3  オルソ画像(地表面)を表示する

 6.2.4  地形(Terrain)を適用する

6.1 _ Cesiumとは

Cesium(セシウム)は、オープンソースとして提供される3D地理空間可視化プラットフォームです。3Dの地物や地形のデータを読み込んで、ブラウザだけでGISを実現します。時系列のデータを表示する機能もあります。【PLATEAU VIEWで体験する】で紹介したPLATEAU VIEWはCesiumを使って実装されています。

Cesiumは、データカタログビューアを作成するフレームワークであるTerriaJSと組み合わせてよく使われます(TerriaJSについては、次のトピック【TerriaJSで活用する】で説明します)。

6.1.1_ Cesiumの構成

Cesiumは、クライアント側とサーバー側で構成されるシステムです(図6-1)。

CesiumをWebブラウザで動かす場合、クライアント側では「CesiumJS」というJavaScriptのオープンソースのライブラリを使います。このライブラリは、3D Tiles形式のデータを表示する機能を備えています。

図6-1 CesiumでPLATEAUの3D都市モデルを扱う場合の主な構成

3D Tiles形式のデータを送信するサーバーの構成として代表的な方法は、次の2つです。

① PLATEAU配信サービス(試験運用)を使う

PLATEAUでは、3D Tiles形式の建築物データならびに地形データを配信する「PLATEAU配信サービス」を試験運用しています。PLATEAU配信サービス(試験運用)のURLを指定するだけで簡単に使えます。

【メモ】

PLATEAU配信サービスは、試験運用のサービスです。提供期間やサービスレベルについては保証されていません。
【PLATEAU配信サービス(試験運用)-チュートリアル】
https://github.com/Project-PLATEAU/plateau-streaming-tutorial

② 3D Tiles形式のファイルをサーバーに置く

もうひとつの方法は、自身でWebサーバーを用意し、そこに建築物や地形の3D Tiles形式のファイルを配置する方法です。3D Tiles形式のファイルは、G空間情報センターからダウンロードできます。

【メモ】

G空間情報センターからダウンロードするのではなく、CityGMLファイルから変換した3D Tiles形式のデータを使うこともできます。FME Formを使って3D Tilesに変換する方法については、下記の資料を参考にしてください。
【FMEを用いたCityGMLから3D Tilesへの変換テンプレート】
https://github.com/Project-PLATEAU/FMEscript-CityGML-to-3DTiles

本トピックでは、主に①の方法を説明します。

コラム:Cesium ionを使う

そのほかの方法として、有償サービスのCesium ionを使って3D Tilesデータを配信する方法もあります。Cesium ionは、CityGML、OBJ、FBX、点群ファイルなどから3D Tilesデータに変換する配信サービスです。こうしたデータを登録しておくことで、事前に加工したカスタムな3D地図も扱えます。

図6-2 Cesium ionに3D都市モデルをインポートしてカスタマイズしてから配信する

6.2_ CesiumJSの基礎を体験する

実際にCesiumJSを使って、PLATEAUの3D都市モデルをブラウザで表示するプログラムを作っていきます。

CesiumJSのチュートリアルでは、「Glitch」という、ブラウザだけで開発できるサービスを使う方法が示されています。ここでもそれにならって、Glitch環境を使った方法から説明します。3D Tilesの配信サーバーには、PLATEAU配信サービスを使います。

6.2.1_ Glitchのプロジェクトを作る

まずは、Glitchでプロジェクトを作ります。Glitchにアクセスして[Sign up]をクリックし、Glitchのアカウントを作成してください。GitHubやGoogleのアカウントがあれば、すぐに使えます。メールでのユーザー登録もできます。

【メモ】

便宜上、Glitchを用いますが、自ら構築したWebサーバー上で実装することもできます(「6.3 Reactを用いたCesiumの応用」を参照)。

図6-3 Glitchのサイト
図6-4 Glitchでアカウント登録する

Glitchにサインインしたら、次のURLをブラウザで開きます。するとCesium Template Appというテンプレートからプロジェクトが作られます。

プロジェクトを開くと、この時点で、右側にCesiumの画面が開かれます(図6-5)。

【Cesium Template】
https://glitch.com/edit/#!/remix/cesium-template

【メモ】

右側のCesiumの画面が開いていないときは、ウィンドウ下の[PREVIEW]メニューから[Open preview pane]をクリックすると開けます。

図6-5 Cesium Templateからプロジェクトを作ったところ

6.2.2_ 建築物モデルを追加する

Cesium Templateから作ったプロジェクトのindex.htmlは、リスト6-1のとおりです。このプログラムを改良して、PLATEAUの3D都市モデルをCesiumで表示できるようにしていきます。

<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://cesium.com/downloads/cesiumjs/releases/1.82/Build/Cesium/Cesium.js"></script>
<link href="https://cesium.com/downloads/cesiumjs/releases/1.82/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
  <link href="style.css" rel="stylesheet">
</head>
<body>
  <div id="cesiumContainer"></div>
  <script>
    // Get your token from https://cesium.com/ion/tokens
    Cesium.Ion.defaultAccessToken = 'your_token_here';
    const viewer = new Cesium.Viewer('cesiumContainer');
  </script>
</body>
</html>

リスト6-1 index.html

■ 建築物モデルの配信URLを確認する

PLATEAU配信サービスで配信されている3D TilesデータのURLは「PLATEAU-3DTiles配信チュートリアル」に記載されています。図6-6のように、都市ごとに、テクスチャなし、テクスチャ付き、テクスチャ付き(低解像度)に分かれています。

【PLATEAU-3DTiles配信チュートリアル】
https://github.com/Project-PLATEAU/plateau-streaming-tutorial/blob/main/3d-tiles/plateau-3dtiles-streaming.md

図6-6 3D Tiles配信チュートリアルに記載のURLの例

これらのURLから、使いたいものを選びます。ここでは例として、「建物モデル(新宿区)」の「テクスチャ付き(低解像度)」のURLを控えておきます。

【建物モデル(新宿区)のテクスチャ付き(低解像度)】
https://plateau.geospatial.jp/main/data/3d-tiles/bldg/13100_tokyo/13104_shinjuku-ku/low_resolution/tileset.json

【メモ】

URLは変更される可能性があります。3D Tiles配信チュートリアルに記載の最新のURLを用いてください。

■ プログラムの修正

Cesium Templateから作ったプロジェクトのindex.htmlを修正し、建物モデル(新宿区)のテクスチャ付き(低解像度)を表示するようにしていきます。そのコード例は、3D Tiles配信チュートリアルにも記述されており、リスト6-2のように修正します。

<!DOCTYPE html>
<html lang="en">
…略(リスト6-1と同じ)…
  <script>
    // Get your token from https://cesium.com/ion/tokens
    Cesium.Ion.defaultAccessToken = 'your_token_here';
    const viewer = new Cesium.Viewer('cesiumContainer');
    //①建物モデルの追加
    var your_3d_tiles =viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
      url : 'https://plateau.geospatial.jp/main/data/3d-tiles/bldg/13100_tokyo/13104_shinjuku-ku/low_resolution/tileset.json'
    }));
    // ②カメラのズーム
    viewer.flyTo(your_3d_tiles);
  </script>
</body>
</html>

リスト6-2 建物モデル(新宿区)のテクスチャ付き(低解像度)を表示するように修正した例

次の2つを記述しています。

建物モデルの追加

viewer.seune.primitives.addメソッドを呼び出して、3D Tilesのデータを追加しています。urlプロパティには、追加したい建物モデルの配信URLを設定します。

ここではひとつしか追加していませんが、この処理を複数繰り返せば、複数の建物モデルをCesiumJSに追加できます。

② カメラのズーム

①で追加したタイルの中心にカメラが向くようにします。viewerのflyToメソッドを呼び出します。

【メモ】

任意の位置にカメラを動かしたり、向けたりするには、fromDegreesメソッドやlookAtTransform メソッドを使います。詳細は、Cesiumのカメラに関するドキュメント(https://cesium.com/learn/cesiumjs-learn/cesiumjs-camera/)を参照してください。

Glitchでファイルを編集して保存する([Ctrl]+[S]キーを押す)と、すぐに反映され、図6-7のように新宿区の3D都市モデルが表示されます。ドラッグで移動、スクロールでズームして、テクスチャの細部まで確認できます(図6-8)。

【メモ】

Cesiumは時刻によって日照の変化があります。画面全体が暗いときは、ウィンドウ下のゲージで、日中の時刻に変更してください。

【メモ】

プレビューが表示されていないときは、ウィンドウ下の[PREVIEW]から操作してください。[PREVIEW]―[Preview in a new window]を選択すれば、別ウィンドウを開いて大きな画面で確認できます。

図6-7 3D都市モデルを表示するようにコードを変更したところ
図6-8 ズームして細部を確認したところ

6.2.3_ オルソ画像(地表面)を表示する

次に、地表面を表示してみましょう。

PLATEAU配信サービスでは、航空写真をオルソ画像として提供しています。PLATEAUが提供するオルソ画像は他のサービスに比べて高精細で、ズームレベル19(約30cmの解像度)まで対応しています。

オルソ画像に関する情報は、PLATEAUオルソ配信チュートリアルに記載されています。

【PLATEAUオルソ配信チュートリアル】

https://github.com/Project-PLATEAU/plateau-streaming-tutorial/blob/main/ortho/plateau-ortho-streaming.md

このチュートリアルに記載されているオルソ画像の配信URLを控えておきます。

【メモ】

配信URLは変更されることがあります。最新情報は、PLATEAUオルソ配信チュートリアルを参照してください。

【オルソ画像の配信URL】

https://gic-plateau.s3.ap-northeast-1.amazonaws.com/2020/ortho/tiles/{z}/{x}/{y}.png

【メモ】

オルソ画像はPLATEAU以外からも提供されており、それを使うこともできます。例えば国土地理院は、地理院タイルを提供しています(https://maps.gsi.go.jp/development/ichiran.html)。

オルソ画像を適用するには、Cesiumのインスタンスを作成する際に、imageryProviderプロパティに指定します(リスト6-3)。実行結果を図6-9に示します。

<html lang="en">
…略(リスト6-1と同じ)…
  <script>
    // Get your token from https://cesium.com/ion/tokens
    Cesium.Ion.defaultAccessToken = 'your_token_here';
    // imageryProviderを設定
    const viewer = new Cesium.Viewer('cesiumContainer', {
        imageryProvider: new Cesium.UrlTemplateImageryProvider({
          url: 'https://gic-plateau.s3.ap-northeast-1.amazonaws.com/2020/ortho/tiles/{z}/{x}/{y}.png',
        })
   });
    //①建物モデルの追加
    var your_3d_tiles =viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
      url : 'https://plateau.geospatial.jp/main/data/3d-tiles/bldg/13100_tokyo/13104_shinjuku-ku/low_resolution/tileset.json'
    }));
    // ②カメラのズーム
    viewer.flyTo(your_3d_tiles);
  </script>
</body>

リスト6-3 オルソ画像を重ねる

図6-9 地表面を描画した

6.2.4_ 地形(Terrain)を適用する

PLATEAU配信サービスには、地形データを配信する「PLATEAU-Terrain配信サービス」も提供されています。このサービスは、地球楕円体を基準とした日本の地形のメッシュデータをquantized-mesh形式で配信しています。配信データは、5m~10mメッシュの高精度地形データで、このデータを使用することで、地面の起伏を表現できます。

【PLATEAU-Terrain配信チュートリアル】

https://github.com/Project-PLATEAU/plateau-streaming-tutorial/blob/main/terrain/plateau-terrain-streaming.md

PLATEAU-Terrain配信サービスは、Cesium ionで提供されています。このサービスにアクセスするためのトークンと、登録されているデータを区別するアセットIDを、CesiumJS側に設定します。

トークン

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5N2UyMjcwOS00MDY1LTQxYjEtYjZjMy00YTU0ZTg5MmViYWQiLCJpZCI6ODAzMDYsImlhdCI6MTY0Mjc0ODI2MX0.dkwAL1CcljUV7NA7fDbhXXnmyZQU_c-G5zRx8PtEcxE

アセットID

770371

具体的には、リスト6-4のように変更します。拡大してみると、地面の起伏が表現されることがわかります(図6-10)。

<html lang="en">
…略(リスト6-1と同じ)…
  <script>
    // Get your token from https://cesium.com/ion/tokens
    // A. トークンを設定
    Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5N2UyMjcwOS00MDY1LTQxYjEtYjZjMy00YTU0ZTg5MmViYWQiLCJpZCI6ODAzMDYsImlhdCI6MTY0Mjc0ODI2MX0.dkwAL1CcljUV7NA7fDbhXXnmyZQU_c-G5zRx8PtEcxE';
    // B. terrainProviderを設定
    const viewer = new Cesium.Viewer('cesiumContainer', {
      terrainProvider: new Cesium.CesiumTerrainProvider({
          url: Cesium.IonResource.fromAssetId(770371)
      })
    }
    );
    // ①建物モデルの追加
    var your_3d_tiles =viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
      url : 'https://plateau.geospatial.jp/main/data/3d-tiles/bldg/13100_tokyo/13104_shinjuku-ku/low_resolution/tileset.json'
    }));
    // ②カメラのズーム
    viewer.flyTo(your_3d_tiles);
  </script>
</body>

リスト6-4 PLATEAU-Terrainを使う

図6-10 地面の起伏が表現された

【文】

松田聖大(Takram)*6.3を執筆
大澤文孝

【監修】

高田知典(Symmetry Dimensions Inc.)
松田聖大(Takram)