smellman's Broken Diary

クソみたいなもんです

掛川城 3D Tilesを作ったって話

静岡県が公開している点群データの中で掛川城のデータを3D TilesにしてCesiumで表示できるようにしてみました。

Kakegawa Castle on Cesium

f:id:smellman:20200823154530j:plain

今回は実際に行った処理について解説してみます。

利用するツール

  1. lastools
  2. entwine
  3. ept-tools
  4. CesiumJS

点群データのマージ

まずは掛川城オープンデータ化プロジェクト(執筆時に何故か静岡県のサイトから反応がないためG空間情報センターの方にリンクを貼っています)をすべてファイルをダウンロードします。

点群データ(lasファイル)のタイル化自体はentwine及びept-toolsで行いますが、entwineで複数ファイルを読んだ場合と一つのファイルにしてから読んだ場合では後者の方がまともなデータになるので、ひと手間加えて24個のファイルを一つのデータにまとめます。

lasファイルをまとめるにはlastoolsのlasmergeコマンドを利用します。ただ、lastoolsとliblasで同じ名前の実行ファイルがあったりして取り扱いが面倒*1なので、dockerを使って処理をします。

今回は仮に$(HOME)/hogehogeで作業するとします。

cd ~/hogehoge
mkdir merged
docker run --rm -v $(pwd):/working smellman/lastools:latest sh -c 'lasmerge -i /working/*.las -o /working/merged/kakegawa.las'

これで単体のkakegawa.lasが得られました。

EPTへの変換

3D Tilesへの変換を行う前にentwineでEPTというフォーマットに変換をします。

なお、entwine.ioではentwineのみで3D Tilesへ変更できるとありますが、これは古い情報で、現在ではEPTから3D Tilesに変換するためにept-toolsを使うようになっています。

では、entwineで変換をしていきます。

今回は以下のようなスクリプトを動かします。

#!/bin/bash

input=/entwine/kakegawa.las
output=/entwine/kakegawa_output

for i in `seq 16`;
do
  docker run -it -v $(pwd):/entwine connormanning/entwine build -t 10 --subset $i 16 -i $input -o $output --srs EPSG:2450 --deep --scale 0.001
done
docker run -it -v $(pwd):/entwine connormanning/entwine merge -o $output

まず、seqと--subset引数を利用して16個のプロセスに分割をしています。
これはentwine自体が強烈にメモリを消費してしまうため、掛川城のデータを全部処理するとdockerで24GB割り当てても死ぬっていうのが発生するため、だいたい4GBぐらいdockerで割り当てても動くようにしています。

--srs引数はept-toolsで変換するときに参照されるため、必須となります。EPSG:2450は静岡県なので平面直角座標系の8番という感じで指定しています。自分の地域がどの平面直角座標系かは「EPSG 平面直角座標系」でググればだいたい出てきます。

--deepはすべての点群を参照するかどうかを決定します。この引数が無いと処理時間が早くなりますが、どうも出力結果が綺麗にならなかったです。

--scaleは本来点群のヘッダにある値で良いはずなのですが、これを指定しないとEPTの出力の一部がぶっ壊れてしまうので、わざと0.001(1ミリ)を指定しています。ここらへんの仕組みがあまり良くわかってなかったりします。

この処理でだいたい3時間ぐらいかかります。メモリの具合によってsubsetを変えてみるなどしてもよいかと思います。

あと、-tでスレッドの数を指定しているのですが、一つのファイルにマージしてしまうと意味がないっぽい感じがしています...*2

3D Tilesへの変換

最後に3D Tilesへの変換を行いますが、この処理を行うept-toolsはEPSG:2450に対応していないので、対応したものを使います。

cd ~/tools
git clone -b dev/add_proj4_text_for_japanese https://github.com/smellman/ept-tools.git
cd ept-tools
npm i
cd ~/hogehoge/merged
node ~/tools/ept-tools/lib/app.js tile kakegawa_output

なお、前述のentwineで処理が一つでも失敗してるとコケるので注意が必要です。

websiteを作成する

作成したkakegawa_output以下にindex.htmlを以下のようなコードで配置します。


Kakegawa Castle on Cesium

ept-tileset/tileset.json が3D Tilesのエントリポイントとなります。

以上で作成は完了です。

個人的にはPotreeConverterがプロプライエタリになってしまってv1.7のdocker imageはもともと作ってあるとはいえ、ThreeJSと現実の世界をつなげるのは厳しい*3のでCesiumで動くものが作れたのはかなり安心感があります。

*1:macではlastoolsはosgeoのformulaを使わないといけないとかもある

*2:docker stat見てもCPU100%以上にならない...

*3:実装はやってるけど...