QGISプラグイン「GBFS-NOW」をGPT4と一緒に改修したよ

みなさん、こんにちは！

昨年制作したQGISプラグイン**GBFS-NOW**を改修したので記事にしました。

GBFS-NOWは、GISツールとしてメジャーなQGIS上で世界中のGBFS（General Bikeshare Feed Specification）を数クリックで呼び出せるよ…というツールです。

もちろん無償で、QGISの公式プラグインリポジトリに登録済なので、プラグインの導入自体も数クリックで可能です！

昨年の記事（GBFS-NOWの紹介）はこちら

https://qiita.com/hiskoh/items/a2df472b6ad5a21a5c51



# どんな改修をしたか？
今回の改修ポイントは次の3つです。
- ブランド画像を表示
- vehicle_typesを表示
- vehicle_types_capacityを表示

## 改修ポイント
### ブランド画像を表示
ブランド画像があった方がビジュアル的に栄えるので...という制作者のこだわりで、``brand image``のデータを表示できるようにしました。
<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119284/9b368c59-055a-6ed6-4774-a2894f4e9b40.png">

### vehicle_typesを表示
利用可能な車種の種類をユーザーに示すため、``vehicle types``の情報を表示する機能を追加しました。
<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119284/6ff70de2-545c-88c2-e2c8-4524f3aeefd7.png">

### vehicle_types_capacityを表示
各車種の容量情報を提供するため、``vehicle types capacity``のデータを視覚化しました。
<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119284/b8b01e96-c58e-5bf0-4770-1a72aaa06d0d.png">

※上記画像について、OpenStreet株式会社 / 公共交通オープンデータ協議会のGBFSデータを使用（ODbL 1.0）

## 実際のコード
全コード載せると長いので、追加したクラスや関数を抜粋して記載します。
### ブランド画像を表示
``gbfs_now_system_information.py``の中身を一部改修
```py
def create_gbfs_system_info_viewer(self,url):

    #...中略...
    
    #ブランド画像のダウンロード＆表示
    download_image(self,self.brand_image,brand_image_url)

    #...中略...

def download_image(self, target_label, url):
    #画像ダウンロード

def set_image(self, reply, target_label):
    #画像の配置
```
### vehicle_typesを表示

``gbfs_now_vehicle_types.py``を下記の通り新規作成
```py

def create_gbfs_vehicle_types_viewer(self,url):
    #vehivle_types.jsonのデータを取得するコード
    
def clear_gbfs_vehicle_types_viewer(self):
    # モデルのデータをクリアするコード

#車種一覧（TableView）の表データを整形する処理
class TransposedJsonTableModel(QAbstractTableModel):

    def __init__(self, data):
    def rowCount(self, parent=None):
    def columnCount(self, parent=None):
        
    def data(self, index, role):
    # データを整備する処理（iconまたはvehicle_imageの有無で処理分岐発生）

    def headerData(self, section, orientation, role):
    #ヘッダー行を生成する処理（画像有無で要分岐処理）

    def clearData(self):
    # モデルのデータをクリアする処理

    def onDownloadFinished(self, reply):
    # 画像ダウンロード完了時の処理
```
### vehicle_types_capacityを表示

``gbfs_now_system_stations.py``の中身を一部改修

```py
#ステーション情報を表示
def create_gbfs_station_layer(self,url):
       
        #…中略…
    
        feature.append('\n'.join([f"{key}: {value}" for key, value in station['vehicle_type_capacity'].items()]) if 'vehicle_type_capacity' in station else None)
        
　　　　…
```
プラグインの全コードはGithubをご覧ください

https://github.com/hiskoh/GBFS-NOW

# なぜ改修したの？
GBFS（General Bikeshare Feed Specification）は、名前通りだとBikeShare用のデータフォーマットを意味しますが、現在は対応車種を広げており、実際にはキックボードやカーシェアなど、あらゆるモビリティシェアリングサービスに対応したデータフォーマットとなっています。

しかし、GBFS-NOWの初期バージョンでは、これら多様な車種を区別して表示することができていませんでした。例えば、自転車のステーションとカーシェアのステーションを同じように扱ってしまうと、都市交通分析の際に意味合いが大きく異なってしまうにも関わらず…。

今回追加した機能は元々GBFS-NOWに取り入れたいと考えていた機能なのですが、元々企画職あがりの私（非エンジニア）にとっては機能拡充のハードルが高く、当時はこれらの機能を盛り込みを断念していました（単純に技術力不足・根気不足です）。

そんな時、ChatGPTという新たなツールが登場しました…！課金ユーザということもあり、この手を活かさない手はありません。…という訳で、ChatGPT-4の力を借りて、GBFS-NOWの改修に挑戦することにしました。

# どうやって改修したか

まずは、どのクラスを改修するか。さすがに改修点に目星はついていたので、該当コードをChatGPTに投げます。

**元々、オープンソースとして公開しているプラグインなので、何も気にせずGPTにコピペ出来てしまえるのが良いですね！！**

## ChatGPTとのやりとり
ChatGPTは時に外れた回答もしますが、そのやり取りがまた面白かったです。質問の仕方を変えたり、異なるアプローチを試したりするうちに、徐々に期待通りに機能が動くようになっていきます。もちろん、GPTが全く的外れな回答をした時は自分で似たようなコードを探したりと完全にGPT頼りとはいきませんが、程よく頼れるアシスタントとしては超絶優秀です。

## 行き詰ったとき
GUIが期待通りに動作しない状況に何度も直面しました。例えば、「ここに画像を表示させたいのに、あ～、それじゃない、そこじゃない！」といった具合です。

そんな時、非常に役立ったのが画像を使ったコミュニケーションでした。QGISのスクリーンショットと共に、どのような挙動を望んでいるのかをコードと一緒にChatGPT-4に投げかける方法です。これにより、やりたいことをより明確に伝えることができました。
<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119284/bd6f7fbc-11fb-8ad2-6d05-10b7868232a0.png">
（…中略…）
<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119284/a04c6726-f598-205e-1754-dd43e49cd723.png">

ChatGPT、伝え方が多少雑でも（日本語が少し曖昧でも）必要な情報が伝わるのが良いですね。

そして**画像を見せてコーディングのアドバイスを返してくれるの超便利～！！**

少々苦戦することもあったので工数はかかりましたが、思っていたよりは簡単に改修ができました。

## 感じたこと

### ChatGPT凄い
AIがコーディングをサポートする時代がまさかこんなに早く来るとは…。ChatGPTの登場により、プログラミングの敷居が大きく下がったことを実感しました。もちろん、AIが出した回答が適切かどうかの判断は最終的には人間が行う必要がありますし、質問の仕方も人間に委ねられています。使い手にも一定の技能や理解を求められている訳ですが、コーディングはその成否がはっきりと返ってくるため非常に扱いやすかったです。

### ChatGPT 画像も読み取ってくれる
画像を使って質問し、それに対してコードで回答を得ることができるのは、非常に有難いです。視覚的な情報を交えることで、より具体的なコミュニケーションができました。

### 非同期処理は大事
唐突に書いちゃいましたが、画像をダウンロードする際、最初は全画像を順番に取得しに行くコードを組んでいました。ただ車種が多いサービスだと車種に比例して処理が重くなることから、非同期処理の重要性を学びました。これは普段開発をされている方から見ると私の無知を曝け出しているだけかと思いますが、まさか十種類以上車種があるサービスがあるとは思わんやん…非同期処理って大事ですね。

### 車種の公開状況は各サービスまちまち
　車種フィールドは必須項目ではないため、公開していないサービス事業者も多数いらっしゃいました。一方で車種が10を超えるサービスもあり、各サービスの車種情報の有無や車種数を調べるだけでも面白い考察ができそう…と感じました。

（また、各社のデータを取り込むうちにフィールドに仕様とは異なるデータを登録しているGBFSが意外と複数あることに気付いてしまいました...）

# 今後の展望
GBFS-NOWの改修については、ひとまず目標としていた機能の追加を完了しました。しかし、GBFSのver3が間もなく正式リリースされることを考慮すると、今後も改修作業は欠かせないと考えています。また、現時点でGBFS-NOWはGBFSの全情報をカバーしているわけではないため、今後必要に応じて機能追加が必要かと思います。

全てのGBFS情報をGISツール上で表示する必要はないとはいえ、「分析上どのデータが重要か」を見極めて改修をしたいので、実際の使用例がもしあれば、発信していただけると嬉しいです。

また、現在のコードは「GPTの力を借りて動いた」ことからも、リファクタリングの余地が大いにありると感じています。もしGBFS-NOWの改修に興味を持ってくださる方がいらっしゃれば、ぜひ協力をお願いしたいです。一緒にツールを作り上げていきましょう！


## おわりに
このプロジェクトを通じて、ChatGPT-4の力を借りることで、「やりたいけれどできない」と思っていたことが、「頑張ればできるかもしれない」という希望に変わりました。同じように「GBFS-NOW」がGBFSデータに興味を持つ人々のハードルを下げる手助けとなれば嬉しいと考えています。GBFSに気軽に触れてもらうための一つのきっかけになることを願っています。

先月にはドコモ・バイクシェアが全国のGBFSデータを公開しました。

https://ckan.odpt.org/dataset/c_bikeshare_gbfs-d-nationwide-bikeshare

他のシェアモビリティ事業者さんもGBFSの波に乗ってくれることを期待したいです。
また、今回の車種対応をしましたが、実際に日本でも来年からHELLO CYCLING（弊社システム）に新車種、**特例特定小型原動機付自転車** が投入予定となっています。弊社含む各社、車種情報も積極的に公開してもらえると嬉しいと感じました！

https://www.city.chiba.jp/sogoseisaku/miraitoshi/tokku/tokuteikogatagendoukitsukijitensya.html

日本のGBFSおよびシェアモビリティシーンがより盛り上がることを期待しつつ、年の瀬を迎えようと思います。この記事をお読みいただき、ありがとうございました。