GTFS-JPとバスアプリ開発の記録 〜地域交通データを活かすiOSアプリづくり〜
地方のバスをもっと便利に使いたい。そんな思いから、GTFS-JP形式の公共交通データを活用して、自分でiOSアプリを開発してみました。この記事では、GTFS-JPの概要と、実際にアプリでどう活用したのかを紹介します。
✍️ まとめ
GTFS-JPを理解して扱えるようになると、地域交通データを使ったアプリ開発の幅が一気に広がります。
オープンデータの恩恵を最大限に活かしながら、使いやすいUIをSwiftUIで形にしていくのはとても楽しい体験でした。
今後も、ローカル交通 × テクノロジー の可能性を探っていきたいと思います。
iOSアプリ【ばすみる】を気になった方はダウンロードしてみてください!
🚌 GTFS-JPとは?
GTFS(General Transit Feed Specification)は、Googleが策定した公共交通データのフォーマットです。
日本では独自拡張の GTFS-JP(Japan) が普及しており、バス・鉄道・フェリーなどの運行情報を共通形式で扱えます。
GTFS-JPでは以下のようなCSVファイル群で構成されます:
| ファイル名 | 内容 |
|---|---|
agency.txt |
事業者情報 |
routes.txt |
路線情報 |
trips.txt |
便(trip)単位の運行情報 |
stop_times.txt |
停留所ごとの到着・出発時刻 |
stops.txt |
停留所の位置情報(緯度・経度) |
calendar.txt |
運行カレンダー |
translations.txt |
多言語対応情報(任意) |
地方自治体や交通事業者がオープンデータとして公開していることも多く、これを利用することでリアルな時刻表アプリや経路検索アプリが開発可能になります。
💡 なぜ自作アプリを作ろうと思ったか
一つのバス路線内に複数のバスが混在し、幾つもの時刻表を横断して確認することが手間なこともあり、複数のバス路線の時刻表を一括で確認できるアプリが欲しかったのがきっかけでした。
既存のアプリは特定の事業者専用だったり、広告が多かったりして不便に感じていたため、
「自分で作れば必要な機能だけに絞れる」と思い、SwiftUIで試作を始めました。
📱 アプリの概要
このアプリでは、GTFS-JP形式のデータをSupabaseに取り込み、ユーザーが簡単に次のバス時刻や運行状況を確認できるようにしています。
主な機能
- 停留所ごとの時刻表表示
- 次に到着する便のカウントダウン表示
- 路線ごとのフィルタリング
- 過去便の自動非表示

⚙️ 技術構成
| 技術 | 用途 |
|---|---|
| SwiftUI | UI構築 |
| Supabase | データベース・API |
| GTFS-JP CSV | バス運行データ |
| GitHub Actions | 自動ビルド・デプロイ |
| TestFlight | 外部テスト配信 |
Supabaseでのデータ管理
GTFS-JPのCSVをそのままテーブル化し、SELECTを用いて必要な便情報を取得します。
SQLで柔軟にフィルタリングできるので、ローカルキャッシュを一切持たずに運用可能です。
SELECT * FROM stop_times st
INNER JOIN stops s ON st.stop_id = s.stop_id
WHERE trip_id = '1212002_平日_0828'
ORDER BY stop_sequence;
🧭 開発中に学んだこと
GTFS-JPを実際に扱ってみて感じたのは、仕様の詳細度が高いということ。
今回は使用しませんでしたが、GTFSが提案するテーブル以外にも日本独自仕様のテーブルも存在します。それらも様々な情報を保持しています。
特にstop_times.txtとcalendar.txtの紐付けは最初のハードルで、
曜日や祝日運行パターンを正しく処理しないと実際の時刻とズレてしまいます。
🧩 今後の展望
- リアルタイムバスロケーション情報(GTFS-RT)対応
- 地図表示の改善(MapKit統合)
- Widget対応
- Apple Watch版の検討
- Supabaseのパフォーマンス向上

また、将来的には複数自治体のデータを統合して検索可能な形に拡張したいと考えています。
Discussion