静岡県が公開している点群データの中で掛川城のデータを3D TilesにしてCesiumで表示できるようにしてみました。
今回は実際に行った処理について解説してみます。
点群データのマージ
まずは掛川城オープンデータ化プロジェクト(執筆時に何故か静岡県のサイトから反応がないため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で処理が一つでも失敗してるとコケるので注意が必要です。