🏙️

地理空間情報×ChatGPT Code Interpreter 3Dデータ編

2023/07/29に公開

はじめに

この記事では、ChatGPT Code Interpreterを用いて地理空間情報の中でも3Dデータに対する処理がどこまで出来そうかを調査していきます。
記事を書こうと思った経緯や2Dのベクタデータに対する調査はこちらの記事に書いています。

調査

調査の概要

以下の3つの内容をChatGPTに依頼して調査していきます。

  1. Project PLATEAUにて配布されているCityGML形式データの可視化
  2. 兵庫県が公開しているDSMデータの可視化
  3. 静岡県が公開している3次元点群データの可視化

1. CityGMLデータの解析

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内で表示された建物フットプリントは以下のようになりました。
ChatGPTにおける可視化結果

出力されたGeoJSONファイルをQGISで表示してみると、上の画像と同じ建物フットプリントを出力してくれていることが分かります。
ChatGPTの出力結果をQGISで表示した様子

また、QGISのレイヤプロパティで元のCityGMLと属性を比較してみると、一部しか抽出できていないことが分かります。
レイヤプロパティで属性を比較した結果
▲ 左側がQGISでCityGMLを表示したとき、右側がChatGPT出力結果の属性

おまけ
追加で建物フットプリントを計測高さの値を用いて押し出して3次元表示を依頼してみました。1つの建物に対してはうまく出来てそうなものの、すべての建物に対しては上手に表示してくれませんでした。


▲ 1つの建物に対する結果


▲ 全ての建物に対する結果

2. DSMデータの可視化

テキスト形式のDSMデータをアップロードし、このデータの可視化を頼んでみます。
使用したデータ

指示した内容
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が発生し、処理が停止

このままでは埒が明かないので、座標値に対して高さをそのまま描画するように頼んでみます。

座標値に対して高さをそのまま描画してみてください。

すると、ラスタ化は出来ていませんが、たくさんポイントがあるためそれらしいものを描画してくれました。

DSMの2次元可視化結果

QGISを用いてDSMデータをGeoTIFF形式に変換して作成した画像(下図)と比べると合っているように思えます。
QGISを用いて可視化したDSMデータ

また、この画像を3次元で表示するように頼んでみると以下のようになりました。

DSMの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で表示した内容と比べると以下のようになりました。
3次元点群データの可視化結果の比較
▲ 左側が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