cesiumのreact wrapperであるresiumでPLATEAUのデータを表示する
こんにちは。Web エンジニアの Yuichiro Izumi です。
日本の都市の 3D 都市モデルの整備を推進するプロジェクト「PLATEAU」にて、
公開されている 3D 都市モデルが最近話題になっていました。
公式サイトはこちら
GitHub ページはこちら
今回はこのデータを React を利用して Web で表示するところまで実装してみたところ、
とてもお手軽にできたので、記事にまとめました。
利用するライブラリ
react
create-react-app
cesiumjs
Web で 3D 都市モデルをビジュアライズするライブラリ
resium
Cesium.js を React で使えるライブラリ
craco
create-react-app を利用した際の設定をいい感じに上書きできるライブラリ
craco は、「Create React App Configuration Override」の略称です。
craco-cesium
cesium/resium を利用するための設定をいい感じにしてくれる craco plugin
craco-plugin-react-hot-reload
hot reload を利用するための設定をいい感じにしてくれる craco plugin
実装手順
create-react-app でプロジェクトを作成
create-react-app plateau-sample
必要な Package を追加
yarn add cesium @craco/craco craco-cesium craco-plugin-react-hot-reload resium
package.json の修正
package.json の script を一部をreact-scripts
からcraco
に修正します。
{
// ...
"scripts": {
"start": "craco start", // react-scripts -> craco
"build": "craco build", // react-scripts -> craco
"test": "craco test", // react-scripts -> craco
"eject": "react-scripts eject"
},
// ...
}
craco.config.js を追加
ルートディレクトリに craco.config.js を作成し、下記設定を記述します。
詳細は、https://github.com/reearth/craco-cesium を参照ください。
module.exports = {
webpack: {
alias: {
"react-dom": "@hot-loader/react-dom",
},
},
plugins: [
{ plugin: require("craco-plugin-react-hot-reload") },
{ plugin: require("craco-cesium")() },
],
};
3D 都市モデルの追加
G 空間情報センターの Web ページから 3D 都市モデルをダウンロードします。
-
G 空間情報センターの Web ページにアクセス
https://www.geospatial.jp/ckan/dataset/plateau-tokyo23ku -
「3D Tiles / GeoPakage / JSON 形式」を選択
https://www.geospatial.jp/ckan/dataset/plateau-tokyo23ku-3dtiles-2020 -
お好みの区のファイルを一覧からダウンロード
-
zip ファイルを解凍
適当なツールで zip ファイルを解凍してください。 -
ファイルの移動
解凍したファイルをディレクトリごと/public に移動してください。
App.tsx の編集
import React from "react";
import { hot } from "react-hot-loader/root";
import Cesium, { Cartesian3 } from "cesium";
import {
Viewer,
Entity,
PointGraphics,
EntityDescription,
Cesium3DTileset,
} from "resium";
function App() {
let viewer: Cesium.Viewer; // This will be raw Cesium's Viewer object.
const handleReady = (tileset: Cesium.Cesium3DTileset) => {
if (viewer) {
viewer.zoomTo(tileset);
}
};
return (
<Viewer
full
ref={(e) => {
if (e?.cesiumElement) {
viewer = e.cesiumElement;
}
}}
>
<Cesium3DTileset
url="http://localhost:3000/13102_chuo-ku/tileset.json" // ダウンロードした地図データのパス
onReady={handleReady}
/>
</Viewer>
);
}
export default hot(App);
いざ、プレビュー
yarn start
https://localhost:3000 を開いてみてください
地図上に都市 3D モデルが表示されているはずです!
移動操作や拡大縮小操作が可能です。
また、オブジェクトをクリックすると情報が表示されます。
実際にプレビューしてみて、読み込みまでの時間やブラウザの重さが気になりました。
3D で表示するエリアを狭めて読み込むデータを小さくしたり、工夫が必要な部分がありそうです。
最後に
わずかなコード記述で 3D 都市データの描画ができました。
ライブラリもとても充実しており、色々なことができそうと感じました。
面白いアイディアが浮かべば、3D 都市データを利用したクールなサービス作りたいなと思いました。
Discussion