Closed67

PLATEAUのCityGMLをArcGISに読み込んでシーンレイヤーに変換しようと思ってたけど失敗したので3DTilesをslkpに変換する

にー兄さんにー兄さん

筑波大学のライセンスでArcGIS Proが使えそうなことが分かった
なのでCutyGMLをシーンレイヤーに変換してUnityで表示できそうな気がしたのでメモ

にー兄さんにー兄さん

ツールをダウンロードし、解凍した
そもそもこのツールは、Dataなんとかというパッケージを補強するような拡張機能らしい

にー兄さんにー兄さん

ドキュメント通りに進めていたが、なぜかツールを起動しようとダブルクリックするとこんなエラーが

なんか変だなと思って情報を漁っていると、なんかPythonの環境が変なのかな?となり
存在していなかったproenv.txtを追加・編集した
https://support.esri.com/ja/technical-article/000022262

にー兄さんにー兄さん

なんかスクリプトというものはちゃんと起動するけど、
GPって書いてあるもの(多分ジプロセッシングかな)はツールが開けませんと出る

で、カーソルを合わせるとクラスが登録されていませんと出る

にー兄さんにー兄さん

GPを編集しようと思って右クリく

すると例のData Interoperabilityがないよって言われた。おや?インストールされてないの?

にー兄さんにー兄さん

現状の結論から整理すると

  • ArcGIS Pro自体は使えた
  • 変換ツールもインポート出来た
  • なぜかジオプロセッシングが動かない
  • 表示的にData Interpropabilityエクステンションがインストールされていない
  • エクステンションはMy ESRIからDLできる
  • でもなぜか筑波大のアカウントではMy ESRIに飛べない

という状況
なので、ん-なんか厳しいなぁとなってます

にー兄さんにー兄さん

ArcGIS Pro自体は21日間のトライアルが用意されているので、その時が来たら試用ライセンスで試してみるのもいいかもしれない

にー兄さんにー兄さん

npx tile-converter --input-type 3DTILES --tileset .\tileset.json --name saitamashi --output ./output --7zExe D:/ProgramFilesD/7-Zip/7z.exe --slpk

ってな感じでドキュメント通りにやったら、なんだかファイル自体出来てるっぽい
だけどこれは失敗見たいです

にー兄さんにー兄さん

よくログを見るとundefinedになってる
3dtilesはtileset.jsonからパスをたどっていく形式なので、
b3dmをちゃんと政敵にホスティングしておかなくてはモデルを取得できないので
たぶんそこらへんが絡んでローカルフォルダからは取得できなかったのかな

にー兄さんにー兄さん

cesium ionにさいたま市の3dtilesを配置することにした
cesium ion使うの初めてだったので3dtilesをアップロードするのにちょっと手間取ったが、
最終的に、うp画面でtileset.jsonとdataフォルダをD&Dしたら大丈夫だった

そこからアップロードと処理に時間がかかったが、無事にcesium ion上で表示することに成功

にー兄さんにー兄さん

cesium ionからtileset.jsonを引っ張ってくるわけだが、ここはどうしよか迷った
結局 Open complete code exampleからcesiumのビューワを起動して
開発者ツールからネットワークを監視してtileset.jsonのurlを割り出した

にー兄さんにー兄さん

ツールで見た感じだと

https://assets.cesium.com/<ID>/tileset.jsonという感じらしい
このURLをtile-converterに入れたらなんだか処理が始まり、
ログを見ている限りだとb3dmの取得には成功しているらしい

にー兄さんにー兄さん

tile-converterをずっと回しているわけだけど、さぁそろそろ終わるかなと思ったら3000番台を処理している頃だった
b3dmのファイルを見て見たら7300までindexが降られているので、これはめっちゃ時間がかかりそう
1時間や2時間ではなさそうだな......

さいたまのモデルでこんな感じなので、東京とか別の場所だともっと時間かかりそう

にー兄さんにー兄さん

tile-converterを実行するコマンドは
npx tile-converter --input-type 3DTILES --tileset https://assets.cesium.com/<ID>/tileset.json --name saitamashi --output ./output --7zExe D:/ProgramFilesD/7-Zip/7z.exe --slpk --token <cesium ion token>

という感じ
ポイントはcesiumIonからインポートする都合でionのトークンが必要なところ

何気に7-z.exeが必須なんですよね
自分はデフォルトのパスにインストールされていないのでオプションで指定しています

にー兄さんにー兄さん

さっき実行した変換処理、--slpkオプション付け忘れました、最悪です
また2時間くらい?変換処理が必要

再度変換するときは出力先フォルダを変えたほうがいいです
出力先にデータがある場合それを削除してから行うようなコードが書かれて入るっぽいので
前に変換したデータ消えちゃうし、削除するのにも時間がかかるので出力先は変えましょう

にー兄さんにー兄さん

思いのほか2回目のほうが速く実行されているな
なんとなくCesiumIonのほうでキャッシュされている説が出てきた

にー兄さんにー兄さん

slpkができたのでとりあえずArcGIS Proに入れて見たところ、
読み込んだ時に何かのデータが欠損している的な警告が表示されて、
ひどいメッシュデータが表示された

ズームするとちょっとよくなるのはメッシュを動的に生成・読み込んでいるからだろうなぁ

にー兄さんにー兄さん

ここまで来るのにかなり時間がかかった
さいたましのエンティティが多い説があるな

にー兄さんにー兄さん

これからやりたいことめも

  • さいたま市とは別のPLATEAU 3dtilesではどうなるのか(もっとミニマルな場所で試してみたい)
  • 産総研3DDB Model Viewerの3dtilesならどうなるのか

3DDB Viewerの場合特定のエントリポイントから3DTilesが取得できるっぽい

にー兄さんにー兄さん

3ddb viewerの3DTilesを試してみる

何となくやったところ、tileset.jsonを指定してコマンドを実行してみても
なぜかError: Not Foundとなってしまう

にー兄さんにー兄さん

slpkシーンレイヤ―をArcGIS Maps SDK for UnityでUnity HDRPで表示してみた
ArcGIS Proのときはメッシュがすごいことになってたけど、Unityではそうはならず
データの欠損しているメッシュは軒並み表示されスラしなかった
そして表示されていないところから、どうやらデータの欠損しているデータはテクスチャなしのモデルだったみたい

にー兄さんにー兄さん

今思ったこと
やっぱりさいたま市のデータは重いような気がしている
重いというのは語弊があって、テクスチャ付きデータが少ないのでサイズとしてはそんなことはないんだけど
変換するときにエンティティを一個ずつ見ていくので建物が多ければ多いほど時間がかかる

大して港区のモデルは
テクスチャのせいでファイルサイズは大きいが、エンティティが少ない
範囲も狭い

にー兄さんにー兄さん

ということで港区の低解像度テクスチャ付き建物データでもう一回チャレンジしてみる

にー兄さんにー兄さん

毎回変換作業のためだけにCesiumIONを使うのは
アップロードの時間やストレージの問題で厳しいので、ローカルストレージでホストする作戦を決行した

このリポジトリのサンプルを使えば、Expressを使って3dtilesを静的データとしてホスティングできる
https://github.com/CesiumGS/3d-tiles-samples/tree/e13380168ea1bb077382d9e61d94823bba7411e3

気を付けたいのが、これは最新の状態ではないということ
結構前に使って便利だったんだけど、いつの間にか変なサンプルに代わっていた

にー兄さんにー兄さん

普通に実行してみたところ、なぜかtoo many filesなるエラーが出た、謎だ
子の実行というのは、3dtilesをホストしたローカルサーバーからtileset.jsonを読み込んで変換してみたことを意味する

にー兄さんにー兄さん

これ、確実にtiles-converterによるものなきがしている

たぶんローカルホストだから読み込みが速すぎてファイルを開きすぎですってnodeに怒られてる
tコンバーターの修正は気力が無いので、またCesiumIONにアップしてみます

にー兄さんにー兄さん

結果、CesiumIonでも読み込みが速すぎてtoo manu open filesになってしまった
これはコンバーターが悪そうなので改良しなくてはいけなさそう

そんな時にこんな記事を見かけた
http://dotnsf.blog.jp/archives/1064268194.html

記事の解決策を抜粋すると

この graceful-fs は fs の代わりに使うことができ、かつ "Too many open files" エラー時に発生する EMFILE イベントを検知したら、少し待ってからやり直し処理を行う(という方法でエラーを回避しながら全ファイルを処理する)、という処理が実装されたもののようです。

graceful-fsを使うように改良しろということらしい

にー兄さんにー兄さん

とりま試してみないとということで、loaders.glをクローンしてみる
同改良するかはまだ見当はついていない

https://github.com/visgl/loaders.gl

tiles-converterはここにある

https://github.com/visgl/loaders.gl/tree/master/modules/tile-converter

にー兄さんにー兄さん

ビルド済みのnode_modulesを見て見ると、graceful-fsを使っているものもむけられた
やっぱりfsをloaders.glが直接使っているわけではなく、ほかのライブラリが使っているみたいなのでお手上げっぽい

にー兄さんにー兄さん

サーバーのリクエスト制限を試してみたが、あまり効果は得られなかった

そして次の仮説が生まれた。
それは、生成されるファイル数が多い説
そして生成されるファイルが多いのは属性情報などが多い説

複雑なメッシュや情報を格納しているせいで、compressしたデータが多くなって爆発する

つまりいくらサーバーでb3dmの制限をしようと、一つのb3dmから生まれるファイルが多いので避けられないのではないか

あとslpkのときのほうがファイル制限に引っかかる気がする

にー兄さんにー兄さん

unity で表示したらいい感じになった
そうそうこういう感じのがやりたかったんだよなぁ


にー兄さんにー兄さん

よく見ると普通に鯖を立てずにローカルストレージを指定できているものが多いので
試しにwslでやってみたら普通に読み込めた、環境の違いによるものなのか

ただ、八王子のデータは途中でtoo many open filesになってしまったので
鯖を使ったメリットはあったんだなぁとなった

にー兄さんにー兄さん

と思ったら普通にWindowsでもローカルストレージから読み込めた
何だったんだろう

あと、Windowsだとtoo manu filesにならなかった。これはどこで決まるんだろう
もしtoo manu open filesの閾値を上げられるんだったら港区もまたチャレンジしたい

にー兄さんにー兄さん

ちなみにUbuntu on WSLのulimit -nの値は65535だった
港区のデータを変換しているが、今のところ問題なさそう
ただ時間はすごいかかってるし、vmのメモリ消費が激しい

にー兄さんにー兄さん

ubuntuで動かしてたら最後の最後にzipコマンドがないよって言われた

にー兄さんにー兄さん

sudo apt install zipでzipをインストール
上に出ているコマンドを実行。スキャニングにかなりの時間がかかってる。まぁ無理もないか。かなりの量生成されているし

にー兄さんにー兄さん

今思ったけど、zipコマンドの最後の引数がディレクトリ丸ごとだった
つまりよくわからんoutputファイルとかnode_modulesとかも全部捜査してて、かなり気がめいりそうだったのでもう中断

これどのディレクトリがいいのかわからないので、
とりまアウトプット先 /SceneServer以下を圧縮してみる
それでもスキャンには時間がかかっている模様

にー兄さんにー兄さん

つくばセンターモデルでも実験

作り方が違うせいなのか、今回は3DObjectSceneではなく、Integrated Meshとして表示している

ここでメッシュが欠損しているのは例のごとくtile-converterのせい
テクスチャが変なのはArcGIS for Unityのせい。なぜならArcGIS Proでは正常だったので

にー兄さんにー兄さん

次つくば市のPLATEAUが公開される時が来たら期待です
そしたらまたこの試行を続けることにします、以上

このスクラップは2022/08/09にクローズされました