はじめに
バスの現在位置は、Google Mapからでも見られる時代ですが、自分の手でマッピングしてみましょう。pythonにfoliumというWeb地図表示プラグインを用いて表示してみます。
地図のアイコンはクリッカブルで、詳細な情報を表示することも可能です。
実装
realtimebus.py3
from google.transit import gtfs_realtime_pb2
import urllib.request, urllib.error
import folium
import pandas as pd
#GTFS-RTの公開されているURL(宇野バスさん)
url ='http://www3.unobus.co.jp/GTFS/GTFS_RT-VP.bin'
#カラム名の宣言
list_df = pd.DataFrame(columns=['id' , 'vehicle_id', 'trip_id','vehicle_timestamp','longitude','latitude','occupancy_status'])
feed = gtfs_realtime_pb2.FeedMessage()
#データダウンロードとフォーマット変換
with urllib.request.urlopen(url) as res: #データダウンロード
feed.ParseFromString(res.read()) #プロトコルバッファをDeserialize
for entity in feed.entity:
tmp_se = pd.Series( [
entity.id, #車両ID
entity.vehicle.vehicle.id, #車両ナンバー
entity.vehicle.trip.trip_id, #路線番号?
entity.vehicle.timestamp, #車両時刻
entity.vehicle.position.longitude, #車両緯度
entity.vehicle.position.latitude, #車両経度
entity.vehicle.occupancy_status #混雑度
], index=list_df.columns )
list_df = list_df.append( tmp_se, ignore_index=True )
#地図の中心地点を算出
average_pos = list_df.mean()
# 中心座標付近の地図を作成
m = folium.Map(location=[average_pos['latitude'], average_pos['longitude']], zoom_start=11)
# 各バスをプロット(色は青)
list_df.apply(lambda row:
folium.Marker(
location=[row['latitude'], row['longitude']],
popup='<table border="1"><tr><th>occupancy_status</th></tr><tr><td>'
+str(row['occupancy_status'])
+'</td></tr></table>',
icon=folium.Icon(color='blue',icon='bus', prefix='fa')
).add_to(m), axis=1)
m
結果
ダウンロードされたリアルタイム位置情報が地図上にプロットされました
実行したタイミングは22時半過ぎてますが、まだバス動いているのですね。。。