Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OpenDroneMapで構築されたPoint Cloudを、Smart MapsのOSS技術スタックで、Webにオープンにデプロイする #61

Closed
yuiseki opened this issue Jan 24, 2023 · 22 comments
Assignees

Comments

@yuiseki
Copy link
Member

yuiseki commented Jan 24, 2023

#58 に参加してのフィードバックとしてのIssueです。

  • DWG-7 Smart Mapsは、WebベースでPoint Cloudを扱う下地はある
  • DWG-6 OpenDroneMapは、Point Cloudを構築する下地はある
  • 短期的な目標の提案:OpenDroneMapで構築されたPoint Cloudを、Smart MapsのOSS技術スタックで、Webにオープンにデプロイする
  • OpenDroneMapのサンプルデータは以下にある

memo:

  • OpenDroneMapの画面共有では、MINUSMA(国連マリ多面的統合安定化ミッション)のUN Campの3D Point CloudモデルをBlenderで作っていた
@yuiseki
Copy link
Member Author

yuiseki commented Jan 28, 2023

なぜかバナナのPoint Cloudが定番データセットらしくて面白いが、このデータセットには位置情報がない

@yuiseki
Copy link
Member Author

yuiseki commented Jan 28, 2023

caliterra というデータセットが良さそうな感じなのでこれをいじってみる。
道路と複数の建物?とちょっとした起伏があり、基地に似ているし、位置情報もついている。

Image from Gyazo
Image from Gyazo

@yuiseki
Copy link
Member Author

yuiseki commented Jan 28, 2023

@yuiseki
Copy link
Member Author

yuiseki commented Jan 28, 2023

.laz について調べる

LAZ は、圧縮された LIDAR (Light Detection and Ranging) データ形式であり、多くの場合、大量の LIDAR データを転送するために使用されます。
https://support.esri.com/ja/technical-article/000018224

LAS/LAZファイルは、航空機LIDAR データを格納する業界標準の形式です。
LASがアスキー形式でLAZがバイナリ形式です。
LAS/LAZファイルは点群データだけをサポートするLIDAR専用フォーマットです。
各点はそれぞれの座標値のほかにLIDARデータ特有の属性(反射強度、リターン値、スキャン角度、他)を持ちます。
大まかな構造としては、 先頭に固定長ヘッダがあり、それに続いて可変長ヘッダ、点群データというように記録されています。
https://droneandco.hamazo.tv/e9095989.html

なるほど。

@yuiseki
Copy link
Member Author

yuiseki commented Jan 28, 2023

Tansei-3のデモで使われていた技術スタックについて調べる

https://hackmd.io/sYF6zDTdRheWn8F8kG-n9w#Tansei-3

.copc.laz について調べる

COPC – Cloud Optimized Point Cloud
A COPC file is a LAZ 1.4 file that stores point data organized in a clustered octree. It contains a VLR that describe the octree organization of data that are stored in LAZ 1.4 chunks.
https://copc.io/

なるほど!!

@yuiseki
Copy link
Member Author

yuiseki commented Jan 28, 2023

.laz.copc.laz に変換する方法を把握する

PDALを使用します。WindowsならQGIS3.26をインストールした際に入るOSGeo4Wで利用できます。
OSGeo4Wで以下のコマンドを実行しするとlazをcopcに変換できます。
pdal translate -i xxx.laz -o xxx.copc.laz --writers.copc.forward=all
https://tmizu23.hatenablog.com/entry/2022/10/17/151442

OSGeo4Wの存在を初めて知った!!!

しかし私はWSL2上のUbuntuで作業したいのでaptでpdalをインストールする

sudo apt install -y pdal
cd tmp
wget https://hub.dronedb.app/orgs/odm/ds/caliterra/download/odm_georeferencing/odm_georeferenced_model.laz
pdal translate -i odm_georeferenced_model.laz -o caliterra.copc.laz --writers.copc.forward=all

…… PDAL: Argument references invalid/unused stage: 'writers.copc'. というエラーになってしまった。

エラーメッセージでググる
微妙そうな結果しかヒットしない

真面目に公式ドキュメントを読む

https://pdal.io/en/2.5-maintenance/
まず、最新バージョンが PDAL 2.5.0 らしい

手元のpdalのバージョンは……

pdal --version

pdal 2.2.0 (git-version: Release)

ウーンaptで入るpdalは古いのかも…

一旦aptで入れたpdalを除去する

sudo apt purge -y pdal

@yuiseki
Copy link
Member Author

yuiseki commented Jan 28, 2023

Dockerイメージを使ったらいけるか…?

pdalのDockerイメージから2.5を探す

https://hub.docker.com/r/pdal/pdal/tags?page=1&name=2.

docker pull pdal/pdal:2.5.0
docker run --rm -it pdal/pdal:2.5.0 pdal --version
docker run --rm -v /$(pwd):/tmp -it pdal/pdal:2.5.0 pdal translate -i /tmp/odm_georeferenced_model.laz -o /tmp/caliterra.copc.laz --writers.copc.forward=all

なんかWarningはでるけどいけたっぽい…?

ls -alh *.laz
-rw-r--r-- 1 root    root    74M Jan 28 10:33 caliterra.copc.laz
-rw-r--r-- 1 yuiseki yuiseki 46M Nov 21 10:07 odm_georeferenced_model.laz
sudo chown yuiseki:yuiseki caliterra.copc.laz

しておく

@yuiseki
Copy link
Member Author

yuiseki commented Jan 28, 2023

@yuiseki
Copy link
Member Author

yuiseki commented Jan 28, 2023

この記事もかなり参考になりそうだ

Cesium.jsという地図上に3Dデータを配置することができるJavaScriptのライブラリがあります
https://qiita.com/nokonoko_1203/items/97ee058dc6df4e399d02

@yuiseki
Copy link
Member Author

yuiseki commented Jan 28, 2023

そろそろGitHubリポジトリを作る。リポジトリ名は odm-pointcloud-map-vite とする

npm create vite@latest odm-pointcloud-map-vite --template react-ts
cd odm-pointcloud-map-vite/
cd npm i

さっきできた caliterra.copc.laz をもってくる

mkdir docs
cp ~/tmp/caliterra.copc.laz docs

いったんここまででGitHubにCreate a new repositoryしちゃう

git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:yuiseki/odm-pointcloud-map-vite.git
git push -u origin main

以降は以下のリポジトリで作業します
https://github.com/yuiseki/odm-pointcloud-map-vite

@yuiseki
Copy link
Member Author

yuiseki commented Jan 28, 2023

GitHub Pagesを有効化して https://viewer.copc.io/ でちゃんと表示できるのかを先に確認しておきたい

GitHub Pagesを設定

  • Settings -> Pages
    • Branch
      • main
        • docs

しばらく待つ……

curl --head https://yuiseki.github.io/odm-pointcloud-map-vite/caliterra.copc.laz

で200が返ってくればOK

https://viewer.copc.io/?copc=https://yuiseki.github.io/odm-pointcloud-map-vite/caliterra.copc.laz を開いてみる

表示はできた!!!けど空中に浮いてしまっていてあきらかにおかしい…w

Image from Gyazo

@yuiseki
Copy link
Member Author

yuiseki commented Jan 29, 2023

caliterra はgeoreferencingがそもそもずれていることに気づいたので別のものにする
sheffield-cross はちゃんとgeoreferencingされていそうだ……たぶん

@yuiseki
Copy link
Member Author

yuiseki commented Jan 29, 2023

COPCに変換したら100MBを超えた。 git lfs が必要…

git reset --hard origin/main
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
git lfs install
git lfs track "*.laz"
git add .
git commit -m "use git lfs"
git push

pushはできた。GitHub PagesにはDeployできるのか…?

@yuiseki
Copy link
Member Author

yuiseki commented Jan 29, 2023

あー…git lfsしたファイルを素朴にGitHub Pagesに置くと内容が虚無になる模様

@yuiseki
Copy link
Member Author

yuiseki commented Jan 29, 2023

やはり、COPCは先送りにする。
hfuさん、ubukawaさんがやっていた、Voxel Tileへの変換をやってみる。

ODMのデータは投影変換は不要のようなので、いきなりリサンプリングをしてみる

pdal_pipeline_resample.yaml を用意

pipeline:
  - 
    filename: /tmp/odm_georeferenced_model.laz
    type: readers.las
  -
    type: filters.voxelcenternearestneighbor
    cell: 1.0
  -
    type: writers.text
    format: csv
    filename: /tmp/sheffield-cross.csv

js-yamlでjsonに変換する

js-yaml pdal_pipeline_resample.yaml > pdal_pipeline_resample.json

dockerにぶちこむ

docker run --rm -v /$(pwd):/tmp -it pdal/pdal:2.5.0 pdal pipeline /tmp/pdal_pipeline_resample.json

カレントディレクトリに sheffield-cross.csv が得られた。

次のステップ。CSVをGeoJSONにしたい。
なんとかしてrubyを書くのをサボれないかと思ったが、ややこしい処理になってきたな……

@yuiseki
Copy link
Member Author

yuiseki commented Jan 29, 2023

面倒なので 3.rb をコピーさせていただいて csv2geojson.rb という名前にして以下を実行

cat sheffield-cross.csv | ruby csv2geojson.rb > sheffield-cross.geojson

うまくいった!ありがたい。

この調子で、tippecanoeにぶちこむ

cat sheffield-cross.geojson | tippecanoe --maximum-zoom=19 --minimum-zoom=10 --projection=EPSG:3857 --force --output output.mbtiles --no-tile-size-limit --no-feature-limit

760KBのMBTilesが得られた。

先に進む前に、一旦このMBTilesがちゃんと表示できるのかだけ確認しておきたい。

@yuiseki
Copy link
Member Author

yuiseki commented Jan 29, 2023

MBTilesの表示確認がめんどくさすぎるので、tile-joinでzxyにして、ubukawaさんの記事のとおりにstyle.json, html, css, jsを配置して、GitHub Pagesで確認することにした。

tile-join --force --output-to-directory=../docs/voxel --no-tile-size-limit --no-tile-compression output.mbtiles

表示された!!!けど、voxcelなのに、高さがないな?
https://yuiseki.github.io/odm-pointcloud-map-vite/#19/26.8357665/2.9927969/0/63

a1fb6cb20d4829483269da8fbacef0f6.mp4

@ubukawa
Copy link

ubukawa commented Jan 30, 2023

こちら、気づくのが遅くなりました。いろいろとされていますね!
フォローできていない部分も多いのですが、空中に浮いてしまうのは、私も経験があります。
https://qiita.com/T-ubu/items/0dd890177cf89460a0de

点群が標高を持っている一方で、背景にしいているラスタが標高を持っていないので、うまく重ならないのだと思います。
また、MapLibreの操作性も、私ができる範囲では、標高ゼロの地表面のところを中心に動くようになっているので、ズームレベルを上げていくと点群(というかボクセル)の下にもぐってしまったり、高さのあるタイルの表示がうまくいかなかったり、少し難しいと感じることもあったので、もう少し技術の進展を見ていこうと思っています。

@ubukawa
Copy link

ubukawa commented Jan 30, 2023

できた地図は、読み上げも働いていないようなので、hとspacingの値をうまく入れられていないかもしれませんね。

sheffield-cross.csv に xyz がきちんと入っているなら、3.rbのときにベースZ を 与えていないので、spacingが決まらないのかもしれません。(consants.rb でZ_ONE_METER も教えてあげることが必要かもしれません。)
spacing = (BASE ** (Z_ONE_METER - z)).to_f

あと、

pdal info docs/sheffield-cross.copc.laz --summary

でみると、これは投影が UTM zone 17N なので、もしかするとウェブメルカトルに投影変換が必要かもしれません。

@hfu hfu removed the meetup Smart Maps Meetup label Jan 31, 2023
@yuiseki
Copy link
Member Author

yuiseki commented Jan 31, 2023

memo

私のコードでは ENV['Z'] ではなく z = 19 とハードコーディングしている。
Z_ONE_METER もハードコーディングしている。

Image from Gyazo

生成されたgeojsonでは、hもspacingもちゃんとあるけど、hがマイナスなのが気になる

Image from Gyazo

いろいろ試行錯誤していたら、上下が反転した「サカサマのパテマ」みたいなボクセルタイルは表示できるようになった。

このポイントクラウド、一番高いところが一番高さの値が小さい=反転してしまっているのではないか……?

完全なる勘で、以下のようにしてみる:

h = 100 - h.to_i.abs

再実行してみる

cat sheffield-cross.csv | ruby csv2geojson.rb > sheffield-cross.geojson
cat sheffield-cross.geojson | tippecanoe --maximum-zoom=19 --minimum-zoom=10 --projection=EPSG:3857 --force --output output.mbtiles --no-tile-size-limit --no-feature-limit
tile-join --force --output-to-directory=../docs/voxel --no-tile-size-limit --no-tile-compression output.mbtiles

生成されたgeojsonは以下のようになる
Image from Gyazo

ついにできた!!!!!

https://yuiseki.github.io/odm-pointcloud-map-vite/#19.56/26.836011/2.9929492/62.5/63

Image from Gyazo

@hfu
Copy link
Contributor

hfu commented Jan 31, 2023

おめでとうございます!

@yuiseki yuiseki added the in progress In progress label Feb 7, 2023
@hfu
Copy link
Contributor

hfu commented Feb 28, 2023

運用できていると認識しているので、クローズします。

@hfu hfu closed this as completed Feb 28, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants