地理空間情報×ChatGPT Code Interpreter 3Dデータ編
はじめに
この記事では、ChatGPT Code Interpreterを用いて地理空間情報の中でも3Dデータに対する処理がどこまで出来そうかを調査していきます。
記事を書こうと思った経緯や2Dのベクタデータに対する調査はこちらの記事に書いています。
調査
調査の概要
以下の3つの内容をChatGPTに依頼して調査していきます。
- Project PLATEAUにて配布されているCityGML形式データの可視化
- 兵庫県が公開しているDSMデータの可視化
- 静岡県が公開している3次元点群データの可視化
1. CityGMLデータの解析
CityGML形式のデータをアップロードし、このデータの可視化を頼んでみます。
使用したデータ
- 国土交通省都市局「3D都市モデル(Project PLATEAU)東京都23区 CityGML」
指示した内容
1つ目の指示
このファイルを可視化してください。
2つ目の指示
建物の属性について抽出をお願いします。
この指示を実現には以下のようなことを行う必要があります。
- アップロードしたデータをCityGML形式のデータと認識する
- XMLと同じ構造のため、XMLの解析ライブラリを用いて解析できると判断する
- 建物の外形線を表す要素を見つける
- 上の要素から緯度および経度に相当する部分を抽出する
- 抽出したデータを描画する
- 建物の属性に当たる部分を理解し、解析・抽出する
ChatGPTの回答
それでは、ChatGPTがこの指示に対してどのような処理をしたかを簡単にみていきます。
以下が、会話の履歴です。
上の回答を見ると以下のような処理をしていることが分かります。
- アップロードされたデータが拡張子から
Graph Modelling Language
と勘違いしていますが、ファイルの最初の部分を表示することでXML形式であることやCityGMLであることを認識 -
gml:posList
要素を見つけるためにElementTreeを用いて解析 - 各座標がX, Y, Zの順で並んでいることを認識
- X, Yの部分のみを抽出してmatplotlibにて建物を2Dで可視化
-
gen:stringAttribute
や.//bldg:measuredHeight
の要素に属性が格納されていることを理解し、属性情報を抽出 - GeoJSON形式を理解し、抽出した建物の属性情報と形状の情報を組み合わせて出力
実際にChatGPT内で表示された建物フットプリントは以下のようになりました。
出力されたGeoJSONファイルをQGISで表示してみると、上の画像と同じ建物フットプリントを出力してくれていることが分かります。
また、QGISのレイヤプロパティで元のCityGMLと属性を比較してみると、一部しか抽出できていないことが分かります。
▲ 左側がQGISでCityGMLを表示したとき、右側がChatGPT出力結果の属性
おまけ
追加で建物フットプリントを計測高さの値を用いて押し出して3次元表示を依頼してみました。1つの建物に対してはうまく出来てそうなものの、すべての建物に対しては上手に表示してくれませんでした。
▲ 1つの建物に対する結果
▲ 全ての建物に対する結果
2. DSMデータの可視化
テキスト形式のDSMデータをアップロードし、このデータの可視化を頼んでみます。
使用したデータ
- 兵庫県「兵庫県_全域DSM(2010年度~2018年度) 」
指示した内容
1つ目の指示
アップロードしたファイルは1mメッシュの航空レーザ測量データを用いて作成されたDSMです。
これをGeoTIFF形式にして可視化して頂けないでしょうか。
座標参照系はEPSG:2447です。
2つ目の指示
3次元で表示することも可能でしょうか。
この指示を実現には以下のようなことを行う必要があります。
- テキストファイルの中身がX座標、Y座標、Z座標の順で記載されていることを理解する
- X座標とY座標を座標値、Z座標を各ピクセルが持つ値として、解像度1mのGeoTIFFを作成する
- 3次元での表示は、テキストファイルの中身をmatplotlibなどで3次元で表示する
→ 個人的な考えです。GeoTIFF形式の画像を得られていれば、陰影図として表示するといったことも可能でしょう。
ChatGPTの回答
それでは、ChatGPTがこの指示をどのように実現したかを簡単に見ていきます。
以下が、会話の履歴です。
上の回答を見ると以下のような処理をしていることが分かります。
- アップロードされたテキストファイルが空白で区切られ、それぞれがX座標、Y座標、Z座標を表していると理解
- ラスタ化するために、
gdal_grid
コマンドを使用しようとするが、入っていないため実行に失敗 - 代替策としてpadasとnumpyを用いて色々頑張っていますが、最終的には
KeyboardInterrupt
が発生し、処理が停止
このままでは埒が明かないので、座標値に対して高さをそのまま描画するように頼んでみます。
座標値に対して高さをそのまま描画してみてください。
すると、ラスタ化は出来ていませんが、たくさんポイントがあるためそれらしいものを描画してくれました。
QGISを用いてDSMデータをGeoTIFF形式に変換して作成した画像(下図)と比べると合っているように思えます。
また、この画像を3次元で表示するように頼んでみると以下のようになりました。
上の2次元で可視化した図と比べてみると合っている気がします。
ちなみに、座標(79250, -144200)付近にある高い建物ですが、シティタワー神戸三宮という超高層マンションらしいです。高さが190mなので可視化結果も合っていそうです。
3. 3次元点群データの可視化
LAS形式の3次元点群データをアップロードして3次元および真上から見た様子の可視化と断面図の作成を依頼してみます。
使用したデータ
指示した内容
1つ目
このLAS形式の3次元点群データを20%の量に間引いて、色情報をもとに可視化してください。
2つ目
この範囲を上から見た場合どのような感じになりますか?
3つ目
X座標32650で線を引いたとき、X軸と反対方向を見たときにできる断面図を描画してください。
この指示を実現には以下のようなことを行う必要があります。
- LAS形式のデータをnumpyの配列に変換する
- そのままだと重いので、軽量化する
- 各座標に対応するRGBの値を用いてmatplotlibなどで表示する
ChatGPTの回答
それでは、ChatGPTがこの指示をどのように実現したかを簡単に見ていきます。
以下が、会話の履歴です。
LAS形式の3次元点群データをアップロードしましたが、laspyなど必要なライブラリが入っていないので、読み込むことができないようです。そのため、CSV形式に変換した3次元点群データを代わりにアップロードしました。
CSV形式の3次元点群データに対して、以下のような処理をしていることが分かります。
- pandasを用いて読み込み、中身を確認
- X, Y, Zの座標値とRGBの色情報が格納されていることを認識
- pandasの
sample
メソッドを用いて指定の割合のデータをランダムに選択し、点数を減らす(間引き) - matplotlibを用いて3次元の散布図を色付きで描画することで可視化
- X軸、Y軸の情報を用いて色付きで描画することで真上から見た様子を可視化
- 指定した座標の±0.5の範囲の点群を抽出し、Y軸とZ軸の情報を用いて色付きで描画することで断面図を作成
実際にChatGPT内で表示された3次元の散布図(可視化結果)をQGISで表示した内容と比べると以下のようになりました。
▲ 左側がChatGPT、右側がQGISで可視化した結果
また、ChatGPT内で表示された真上から見た様子とQGISで表示した結果を比較すると、以下のような結果となりました。
▲ 左側がChatGPT、右側がQGISで表示した真上から見た様子
最後に、断面図に関してもChatGPT内で表示された結果とQGISでの表示結果を比べると、以下のようになりました。ChatGPTにひねくれた依頼をしてしまったので、左右が反転しています。
▲ 左側がChatGPT、右側がQGISで作成した断面図
QGISとの可視化結果を比べると、3つとも合っているように思えます。
出来そうなこと・出来なさそうなこと
会話の履歴や出力してもらったデータ、他にも行った結果から、出来そうなこと・出来なそうなことは以下だと思われます。
出来そうなこと
- PLATEAUの建物CityGMLは建物フットプリントの表示&出力
- PLATEAUの建物CityGMLからの属性抽出
→ 一部属性のみ - テキスト形式のDSMを2Dおよび3Dで可視化
- CSV形式の3次元点群データを間引いて表示、真上から見た様子の表示、簡易的な断面図の表示
出来なさそうなこと/怪しい
- PLATEAUのCityGMLにおいてmeasuredHeightの値を使用して建物フットプリントを押し出して3Dで表示
- グリッドデータのDSMをGeoTIFFなどのラスタデータに変換
- PLY形式やLAS形式などCSV形式以外の3次元点群データの読み込み
おわりに
PLATEAUのCiytGMLはLOD2が定義されている建物でもフットプリントの表示を行うことができ、下手したら可視化までにかかる時間もQGISより早いかもしれないと思いました。また、3次元点群データでは、断面図の作成まで出来そうとは思っていなかったため、結果が出た時には驚きました。
3Dデータはどうしても容量が重くなるため、アップロードファイルの容量制限やメモリエラーに引っかかる可能性が高いです。ファイルをZIP圧縮してアップロードする、データを間引くなどの工夫が必要そうです。(ChatGPTに限った話ではありませんが)
Discussion