本稿では、自治体や交通機関が公開しているバス情報データ(バス情報フォーマット GTFS-JP:静的データ、GTFS-RT:動的データ)を使って、バスの位置を地図上にマッピングする方法を紹介します。

概要

 ここでは、都道府県としては初めてGTFS-JP情報を公開した佐賀県提供のデータを例として用いています。ちょっとしたデータの加工にはpythonを、マッピングにはPlotlyとMapbox、Webアプリとして公開するためのフレームワークとしてStreamlitを用いました。(こんな感じになります。こちら

プログラムを実行すると、佐賀県のWebから最新のGTFSデータをダウンロードし、必要なデータ処理を行って位置情報とバス情報(行き先とか、路線番号とか)地図上に表示します。(佐賀県出身でもなければ佐賀県には行ったことも無いのですが。。) 

標準的なバス情報フォーマット(GTFS-JP、GTFS-RT)

 「標準的なバス情報フォーマット」とは、バス事業者と、経路検索等の情報利用者との情報の受渡しのための共通フォーマットで、国土交通省により2016年から標準化が進められています。公共交通データのデファクトスタンダートであるGTF( General Transit Feed Specification :経路検索サービスや地図サービスへの情報提供を目的としてアメリカで策定された世界標準の公共交通データフォーマット )を元に作られた、交通事業者と開発者の双方に優しいフォーマットです。静的データ「GTFS-JP」と動的データ「GTFSリアルタイム」の2種類のフォーマットを包含しています。GTFS-JPは、停留所、路線、便、時刻表、運賃 等 のデータが圧縮ファイル(ZIP)の形で公開されているデータで、GTFS-RTは、遅延、到着予測、車両位置、運行情報 等が、 Protocol Buffersという、データ構造が規定されたバイナリ形式をベースとしたファイルで提供されています。 詳しくはこちらのサイトを参照してください。

設計仕様や開発手順

ソースコードはこちらです。(2023/9/2更新: pandasのappendが使えなくなったのでconcatを使った記述に変更しました。)

詳細はソースコードを見ていただくとして、どう設計しているかをここで示しますのでソースを読む際の参考にしてください。

データの取得(概要)

地図上にバスのロケーションをマッピングし、バスの情報も添えるためには、現時点で運行しているバスの路線情報が欠かせません。何かしらの事情で運休している路線もあれば、臨時便が走っている場合も想定されるからです。従って、現時点のバスの運行情報全般をGTFS-JPから取得し、バスの車両位置(緯度経度情報です)は、GTFS-RTから得ます。

プログラム実行時に、GTFS提供のWebサイトからGTFS-JPをダウンロードして解凍し必要なデータを取り出します。そして同じくWebサイトからGTFS-RTをダウンロードします。

取得したデータはファイルとしてはローカルに保存せずにデータ処理する仕様とします。

データ取得(詳細)

1.GTFS-JPの取得(運行データの取得)

運行データの入ったZIPファイルを取得します。

http://opendata.sagabus.info/saga-current.zip

ファイルとしてローカルには保存せずに解凍して、中の’trips.txt’を取り出してcsvファイルとして中身を取り出します。

2.GTFS-RTの取得(リアルタイムデータの取得)

現在の車両位置などの情報を含むリアルタムデータを取得します。

‘http://opendata.sagabus.info/vehicle.pb’

運用データと同じようにローカルには保存せずに、中身を取り出します。

データ処理

データはPandasのDataFrame型で扱います。

先のGTFS-JP由来のデータとGPFS-RTのデータをマージします。

Pythonの実行

開発中のおいては、Pythonの実行は、先ずはGoogle laboratoryで少しずつデータ処理の正しさやMapbox(Plotly)による地図描画を試しました。Streamlit無しで実行しています。あれこれ試した後で、PythonのIDE開発環境(ここではPyCharmを用いました。)で仕上げました。

Google laboratoryで試したコードはこちらです。

Mapboxの利用

Mapboxは非常にビジュアルでインタラクティブな地図を無料で提供していますが、より柔軟でかっこいい地図アプリにするにはアカウントを取得してトークンと呼ばれる”キー”を入手する必要があります。今回のようなシンプルな仕様・地図であれば、トークン無しでもMapboxの各種地図を利用できますが、試しにトークンを取得して作成しています。公開しているソースコード上では、”your_token.txt”と書いているところをご自身で取得したトークン(のファイル名)に置き換えることで動作できるようになります。

Mapboxの利用に際しては、リファレンスを参照しながらいろいろ試してみるのが良いです。ここでは、シンプルに、データフレームと、ロケーション情報の入ってる列名を地図クラスのインスタンスに与えるだけを試しています。

そして、IDE開発環境では、Streamlitで実行するために、ほんの少し手を加えます。

Streallitの利用(PythonのIDE開発環境上から)

Streamlitの利用は簡単です。

import streamlit as st

あとは、用意されたメソッドを使うだけです。

st.write(‘Hello world’)

と記述すれば、ブラウザ上で、 Hello worldと表示されます。

Mapboxを利用するは、 plotlyのクラスで作ったインスタンスを以下のように渡すだけで、 plotlyの描画クラスをWebアプリの一部として実行できます。

st.plotly_chart(fig)  – figのところに plotlyのクラスで作ったインスタンスの名前を入れる。

StreallitによるWebアプリの公開

streamlitは、githubに置いたpythonのスクリプトファイルをWEBアプリとして実行してくれます。stremallitでアカウントを取得したら、実行したい pythonのスクリプトファイルの入ったリポジトリをStreamlitに結びつけます。その際に実行したいpythonのスクリプトが動作するために必要な各種ライブラリのバージョンを記したテキストファイル(requirements.txt)も同時にリポジトリに保存しておくことが必須です。例を示します。

実行したいファイルを置いたgithubのリポジトリ(例)

Requirements.txtの中身(例)

Streamlitで実行したい実行したいファイルを置いたgithubのリポジトリをエントリーした後(例) 右から二番目の地球のようアイコンが表示されていれば、実行するURLが発行されていて、それをブラウザに入力すればWEBアプリとして実行可能な状態になっています。

ブラウザにURLを入れると、このようになります。(ブラウザ画面の一部を切り貼りしています。)

少し手を加えただけで、データを可視化できるのは楽しいですね。他にどんなオープンデータがあるのか、どんな活用ができるのか、興味が沸いてきました。