GTFS Realtime やーる（TripUpdate）

# はじめに
熊本のGTFSリアルタイムが公開されたので、Pythonで取得してみましょう。
こういう便利なものが作れちゃいます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">最寄りのバス停にバスがあと何分で着くかだけを表示するものなんだけど、1番よく使う<a href="https://twitter.com/hashtag/%E7%86%8A%E6%9C%AC?src=hash&amp;ref_src=twsrc%5Etfw">#熊本</a> <a href="https://twitter.com/hashtag/MaaS?src=hash&amp;ref_src=twsrc%5Etfw">#MaaS</a> <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://twitter.com/hashtag/GTFS?src=hash&amp;ref_src=twsrc%5Etfw">#GTFS</a> <a href="https://t.co/pjmSrhtCe0">pic.twitter.com/pjmSrhtCe0</a></p>&mdash; がちもとさん@メタバース熊本 (@sotongshi) <a href="https://twitter.com/sotongshi/status/1471274080100040705?ref_src=twsrc%5Etfw">December 16, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 開発環境
- Windows PC
- Python 3.6
- gtfs-realtime-bindings

# 実装
1．[gtfs-realtime-bindings](https://github.com/MobilityData/gtfs-realtime-bindings/blob/master/python/README.md)をインストールします

~~~cmd
pip install gtfs-realtime-bindings
~~~

2．熊本の産交バスのTripUpdate（ルートの最新情報）を取得してみましょう

~~~gtfs-realtime-sample.py
from google.transit import gtfs_realtime_pb2
import requests

feed = gtfs_realtime_pb2.FeedMessage()
response = requests.get('https://km.bus-vision.jp/realtime/sankobus_trip_update.bin')
feed.ParseFromString(response.content)
for entity in feed.entity:
  if entity.HasField('trip_update'):
    print(entity.trip_update)
~~~

3．次のような結果が返ってきます

~~~json
stop_time_update {
  stop_sequence: 36
  arrival {
    delay: 429
    time: 1639723749
    uncertainty: 300
  }
  departure {
    delay: 429
    time: 1639723749
    uncertainty: 300
  }
  stop_id: "100441_1"
}
vehicle {
  id: "347"
  label: "1201"
}
~~~

4．ダウンロードしたTripUpdateファイル(.bin)から読み込む場合

~~~gtfs-realtime-sample.py
from google.transit import gtfs_realtime_pb2
import requests

feed = gtfs_realtime_pb2.FeedMessage()
with open("sankobus_trip_update.bin", 'rb') as f:
    content = f.read()
    
feed.ParseFromString(content)
for entity in feed.entity:
  if entity.HasField('trip_update'):
    print(entity.trip_update)
~~~

~~~json
stop_time_update {
  stop_sequence: 36
  arrival {
    delay: 369
    time: 1639723689
    uncertainty: 300
  }
  departure {
    delay: 369
    time: 1639723689
    uncertainty: 300
  }
  stop_id: "100441_1"
}
vehicle {
  id: "347"
  label: "1201"
}
~~~

お疲れ様でした。

# GTFSリアルタイムを公開している都道府県リスト

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">GTFSリアルタイムを公開している都道府県リスト<br>北海道、群馬、富山、愛知、三重、和歌山、岡山、広島、佐賀、そして熊本みたいですね<a href="https://t.co/aFkLWek0ky">https://t.co/aFkLWek0ky</a><a href="https://twitter.com/hashtag/%E7%86%8A%E6%9C%AC?src=hash&amp;ref_src=twsrc%5Etfw">#熊本</a> <a href="https://twitter.com/hashtag/MaaS?src=hash&amp;ref_src=twsrc%5Etfw">#MaaS</a> <a href="https://twitter.com/hashtag/GTFS?src=hash&amp;ref_src=twsrc%5Etfw">#GTFS</a></p>&mdash; がちもとさん@メタバース熊本 (@sotongshi) <a href="https://twitter.com/sotongshi/status/1471657090045612038?ref_src=twsrc%5Etfw">December 17, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 熊本のGTFS Realtime

| | |
|:--|:--|
|産交バス（TripUpdate）|https://km.bus-vision.jp/realtime/sankobus_trip_update.bin|
|産交バス（VehiclePosition）|https://km.bus-vision.jp/realtime/sankobus_vpos_update.bin|
|熊本電鉄バス（TripUpdate）|https://km.bus-vision.jp/realtime/dentetsu_trip_update.bin|
|熊本電鉄バス（VehiclePosition）|https://km.bus-vision.jp/realtime/dentetsu_vpos_update.bin|
|熊本バス（TripUpdate）|https://km.bus-vision.jp/realtime/kumabus_trip_update.bin|
|熊本バス（VehiclePosition）|https://km.bus-vision.jp/realtime/kumabus_vpos_update.bin|
|熊本都市バス（TripUpdate）|https://km.bus-vision.jp/realtime/toshibus_trip_update.bin|
|熊本都市バス（VehiclePosition）|https://km.bus-vision.jp/realtime/toshibus_vpos_update.bin|

**※15秒おきに更新されますが、過度なアクセスは行わないようにしてください。**

# 参考文献

https://km.bus-vision.jp/kumamoto/view/opendataKuma.html

https://qiita.com/kohei-ota/items/104dac4afec818217921

https://speakerdeck.com/satoshirobatofujimoto/pythondehazimerugtfs

https://qiita.com/SatoshiGachiFujimoto/items/33b7e23b232b3bfecda6