地理空間情報×ChatGPT Code Interpreter ベクタデータ編
はじめに
7月からChatGPT Plusのユーザ向けに「Code Interpreter」というプラグインが使えるようになりました。
このプラグインを使用すると、ユーザがプロンプトに書いた要望を実現するPythonコードの生成をしてくれるだけでなく、Pythonコードを実行したり、ファイルをアップロードしてそれに対して処理を行ってくれます。アップロードしたファイルの分析や資料作成、グラフを描画するなど様々な活用例を紹介している方が既にいらっしゃるので、詳しくはそちらを確認いただければと思います。
色々な活用例の記事はあるものの、地理空間情報というニッチな分野においてどのようなことが出来そうか記事を書いている方が見つからなかったので、色々試してみました。
この記事では、地理空間情報の中でもベクタデータに対する処理がどこまで出来そうかを調査していきます。3Dデータに対する調査はこちらの記事に書いています。
調査
調査の概要
国土数値情報から以下のデータを用いて、東京都港区における公共交通空白地域の可視化をChatGPTに頼んでみます。
使用したデータ
公共交通空白地域の定義
東京都港区が公開している資料より、以下の通りとしました。
- 鉄道駅から半径500m以上、バス停留所から半径200m以上離れた地域
公共交通の利用圏域は、駅勢圏は半径500m、バス停圏は半径200mとして設定しています(図
2-13 公共交通の利用圏域)。
引用元: 港区総合交通戦略(平成29年9月)P.17
指示した内容
アップロードしたファイルには日本の鉄道駅、バス停留所およびある自治体の境界データが含まれています。
この自治体では以下の条件を公共交通空白地域と定義しています。
- 鉄道駅から半径500m以上離れた地域
- バス停留所から半径200m以上離れた地域
この地域を可視化してください。
この指示を実現には以下のようなことを行う必要があります。
- アップロードしたデータのうち、どのデータが行政区域データ、鉄道駅データ、バス停留所データに当たるかを理解する
- 行政区域データ、鉄道駅データ、バス停留所データを読み込む
- 鉄道駅から半径500mの範囲、バス停留所から半径200mの範囲を作成する
- 鉄道駅データとバス停留所データは港区以外も含むので、行政区域データの範囲で切り取る
- 行政区域データから上で作成した範囲(公共交通の利用圏域)でない部分を抽出する
- データを描画する
ChatGPTの回答
それでは、ChatGPTがこの指示に対してどのような処理をしたかを簡単にみていきます。
以下が、会話の履歴です。
上の回答を見ると以下のような処理をしていることが分かります。
- 鉄道駅データはポイントのデータではないので、GeoPandasの
representative_point
メソッドを用いて代表点を取得 - 全てのデータの座標系をEPSG:2451にそろえる
- 指定された範囲で鉄道駅データおよびバス停留所データをバッファ
- Code Interpreterにて
clip
メソッドが使用できないので、intersection
メソッドを用いてバッファしたデータから東京都港区の範囲を抽出 - 東京都港区の範囲とバッファしたデータの差分をとり、公共交通空白地域を可視化
実際にChatGPT内で表示された公共交通空白地域は以下のようになりました。
ChatGPTが出力したGeoJSONファイルをQGISで表示してみると、上の画像と同じ範囲を出力してくれていることが分かります。
また、実際にQGIS上で同様の処理を行ったときと比べると若干結果が異なります。
これはGeoPandasとQGISにおいて、代表点を算出する方法が少し異なるため発生していると考えられます。
出来そうなこと・出来なさそうなこと
会話の履歴や出力してもらったデータ、他にも行った結果から、出来そうなこと・出来なそうなことは以下だと思われます。
出来そうなこと
- データの読み込み
- matplotlibを用いたデータの表示
- GeoJSON形式での出力
- 異なる座標系への変換
- 属性の参照
- rtreeやpygeosを用いない(Spatial indexを使用しない)空間演算
出来なさそうなこと/怪しい
- ESRI Shapefile形式での出力
→ 拡張子がshp
のファイルのみを出力したり、prj
のファイルが抜けていたりする - rtreeやpygeosを用いる(Spatial indexを使用する)空間演算
おわりに
clip
メソッドが使えないことをエラーメッセージから判断し、行政区域データの範囲で切り取るのではなく交差するデータを抽出するという代替策を自動で実行しているのがすごいなと思いました。
Discussion