PLATEAUのCityGMLをArcGISに読み込んでシーンレイヤーに変換しようと思ってたけど失敗したので3DTilesをslkpに変換する
筑波大学のライセンスでArcGIS Proが使えそうなことが分かった
なのでCutyGMLをシーンレイヤーに変換してUnityで表示できそうな気がしたのでメモ
調べたらなんか3dtilesならloaders.glを使ってi3sシーンファイルに変換で切るっぽさがあった
ArcGISいらんのか......まぁとりあえずやってみよう
このツールを使うことでCityGMLをファイルジオデータベースに変換できるらしい
とはいえArcGISじたい初めてなので、ちょっとチュートリアルをやる
読み込みと表示
なるほど
CityGMLの変換ツールにData Interoperabilityなるものが必要とのことで、どこでインストールできるんだろうといろいろさがしても見つからない
でいろいろ見た感じだと、ライセンスで有効になっているなら普通にもう使えそう、そうだったんか......
ツールをダウンロードし、解凍した
そもそもこのツールは、Dataなんとかというパッケージを補強するような拡張機能らしい
ドキュメント通りに進めていたが、なぜかツールを起動しようとダブルクリックするとこんなエラーが
なんか変だなと思って情報を漁っていると、なんかPythonの環境が変なのかな?となり
存在していなかったproenv.txtを追加・編集した
なんかスクリプトというものはちゃんと起動するけど、
GPって書いてあるもの(多分ジプロセッシングかな)はツールが開けませんと出る
で、カーソルを合わせるとクラスが登録されていませんと出る
GPを編集しようと思って右クリく
すると例のData Interoperabilityがないよって言われた。おや?インストールされてないの?
My ESRIに行くと、なんかアカウントが有効になっていない?
対処する
現状の結論から整理すると
- ArcGIS Pro自体は使えた
- 変換ツールもインポート出来た
- なぜかジオプロセッシングが動かない
- 表示的にData Interpropabilityエクステンションがインストールされていない
- エクステンションはMy ESRIからDLできる
- でもなぜか筑波大のアカウントではMy ESRIに飛べない
という状況
なので、ん-なんか厳しいなぁとなってます
ArcGIS Pro自体は21日間のトライアルが用意されているので、その時が来たら試用ライセンスで試してみるのもいいかもしれない
いったん3dtilesからI3Sへの変換を試してみるか
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が必須なんですよね
自分はデフォルトのパスにインストールされていないのでオプションで指定しています
ArcGIS Maps SDK for Unityでローカルファイルを読み込むときもslkp形式らしいです
Unityのほうでも読めるのは嬉しい、よかった
さっき実行した変換処理、--slpkオプション付け忘れました、最悪です
また2時間くらい?変換処理が必要
再度変換するときは出力先フォルダを変えたほうがいいです
出力先にデータがある場合それを削除してから行うようなコードが書かれて入るっぽいので
前に変換したデータ消えちゃうし、削除するのにも時間がかかるので出力先は変えましょう
変換処理が長いので鯖で実行したいです
loaders.glにはdockerImageが用意されて入るっぽいので、それを使えばVMインスタンス立てて実行できるかも
思いのほか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ではそうはならず
データの欠損しているメッシュは軒並み表示されスラしなかった
そして表示されていないところから、どうやらデータの欠損しているデータはテクスチャなしのモデルだったみたい
今思ったこと
やっぱりさいたま市のデータは重いような気がしている
重いというのは語弊があって、テクスチャ付きデータが少ないのでサイズとしてはそんなことはないんだけど
変換するときにエンティティを一個ずつ見ていくので建物が多ければ多いほど時間がかかる
大して港区のモデルは
テクスチャのせいでファイルサイズは大きいが、エンティティが少ない
範囲も狭い
これはPLATEAU VIEWで見たデータ
ということで港区の低解像度テクスチャ付き建物データでもう一回チャレンジしてみる
とりあえず港区のデータを取得
PLATEAUのデータさガスの、ちょっと利便性がねぇ......
毎回変換作業のためだけにCesiumIONを使うのは
アップロードの時間やストレージの問題で厳しいので、ローカルストレージでホストする作戦を決行した
このリポジトリのサンプルを使えば、Expressを使って3dtilesを静的データとしてホスティングできる
気を付けたいのが、これは最新の状態ではないということ
結構前に使って便利だったんだけど、いつの間にか変なサンプルに代わっていた
普通に実行してみたところ、なぜかtoo many filesなるエラーが出た、謎だ
子の実行というのは、3dtilesをホストしたローカルサーバーからtileset.jsonを読み込んで変換してみたことを意味する
これ、確実にtiles-converterによるものなきがしている
たぶんローカルホストだから読み込みが速すぎてファイルを開きすぎですってnodeに怒られてる
tコンバーターの修正は気力が無いので、またCesiumIONにアップしてみます
結果、CesiumIonでも読み込みが速すぎてtoo manu open filesになってしまった
これはコンバーターが悪そうなので改良しなくてはいけなさそう
そんな時にこんな記事を見かけた
記事の解決策を抜粋すると
この graceful-fs は fs の代わりに使うことができ、かつ "Too many open files" エラー時に発生する EMFILE イベントを検知したら、少し待ってからやり直し処理を行う(という方法でエラーを回避しながら全ファイルを処理する)、という処理が実装されたもののようです。
graceful-fsを使うように改良しろということらしい
とりま試してみないとということで、loaders.glをクローンしてみる
同改良するかはまだ見当はついていない
tiles-converterはここにある
ビルド済みのnode_modulesを見て見ると、graceful-fsを使っているものもむけられた
やっぱりfsをloaders.glが直接使っているわけではなく、ほかのライブラリが使っているみたいなのでお手上げっぽい
ネットで探したら、どうやらExpressのリクエストを制限するパッケージがあった
これを使えばサーバーのrequestを制限してファイルを配信できるかも
どちらかというとこっちが本命っぽいな
サーバーのリクエスト制限を試してみたが、あまり効果は得られなかった
そして次の仮説が生まれた。
それは、生成されるファイル数が多い説
そして生成されるファイルが多いのは属性情報などが多い説
複雑なメッシュや情報を格納しているせいで、compressしたデータが多くなって爆発する
つまりいくらサーバーでb3dmの制限をしようと、一つのb3dmから生まれるファイルが多いので避けられないのではないか
あとslpkのときのほうがファイル制限に引っかかる気がする
ちょうどいいサイズのデータないかなーと探していて、八王子をやってみたらいい感じにslpkに変換できた
例のごとくテクスチャなしの建物はめちゃくちゃだけど、Proでも表示は確認
八王子のページ
unity で表示したらいい感じになった
そうそうこういう感じのがやりたかったんだよなぁ
こちらの記事も同じような感じの操作をしている
よく見ると普通に鯖を立てずにローカルストレージを指定できているものが多いので
試しにwslでやってみたら普通に読み込めた、環境の違いによるものなのか
ただ、八王子のデータは途中でtoo many open filesになってしまったので
鯖を使ったメリットはあったんだなぁとなった
と思ったら普通にWindowsでもローカルストレージから読み込めた
何だったんだろう
あと、Windowsだとtoo manu filesにならなかった。これはどこで決まるんだろう
もしtoo manu open filesの閾値を上げられるんだったら港区もまたチャレンジしたい
すごい情報が少ないエントリだけど、watchmanなるものを使うと解決すRケースがあるらしい
これは見当違いだった
react-nativeがwatchmanに依存しているからこのエラーが出るだけ
wslのulimit -nを増やす方向で進めていたら、おそらくtoo manu open filesのエラーが解決した
WSLでやった場合、なんかユーザをsu drumath2237みたいな感じでログインしないと適用されなかったので注意
ちなみにUbuntu on WSLのulimit -nの値は65535だった
港区のデータを変換しているが、今のところ問題なさそう
ただ時間はすごいかかってるし、vmのメモリ消費が激しい
ubuntuで動かしてたら最後の最後にzipコマンドがないよって言われた
つくばセンターモデルでも実験
作り方が違うせいなのか、今回は3DObjectSceneではなく、Integrated Meshとして表示している
ここでメッシュが欠損しているのは例のごとくtile-converterのせい
テクスチャが変なのはArcGIS for Unityのせい。なぜならArcGIS Proでは正常だったので
港区のデータは諦めました、データが多すぎて時間が長い
次つくば市のPLATEAUが公開される時が来たら期待です
そしたらまたこの試行を続けることにします、以上