鹿児島市電の電停には、次の電車の接近を知らせる「電車接近表示器」がありました。2026年3月、システムの老朽化で表示が止まりました。部品の製造がすでに終わっており、復旧は断念。撤去されることになりました(鹿児島市交通局「電車接近表示器」の運用停止について)。
電停に立って、いつ来るか分からない電車を待つ。スマホで公式サイトの時刻表を開き、いまの時刻と見比べて、頭の中で「あと何分」を計算する。できなくはありません。でも、毎日のことです。欲しい情報は時刻表の全体ではなく、「次の電車があと何分で来るか」、それだけなのに。
だったら、電停を選ぶだけで「あと何分」が出る道具を作ればいい。それが市電なうの始まりでした。
リアルタイムではない、という正直
作るうえで最初に突き当たったのは、市電のリアルタイムの位置情報は公開されていない、という事実です。だから市電なうが表示するのは、時刻表をもとにした予定時刻です。
これを隠さないことにしました。画面にも「時刻表ベースの予定時刻」と明記しています。そのうえで、遅れているかどうかは、その場にいる人がいちばんよく知っている——そう考えて「まだ来ていない」ボタンを付けました。定刻を過ぎても電車が来ないとき、誰かがワンタップで報告すると、同じ電停で待っている人だけでなく、これからその電停から乗ろうとしている人にも共有されます。家を出る前に「遅れているらしい」と分かるだけで、動き方は変わります。
バスは、自分でも分からなかった
市電なうを作ったあと、同じ仕組みをバスに広げたのが市バスなうです。
理由は単純で、市電はよく乗るので電停の場所も系統も頭に入っていますが、バスのことは自分でもよく分からなかったからです。バス停がどこにあるのか。同じ名前のバス停でも乗り場はどこか。どの系統に乗ればいいのか。よく知らない路線に乗るときのハードルは、市電の比ではありません。
自分が分からないものこそ、道具の出番です。鹿児島市が公開しているオープンデータの時刻表をもとに、停留所を選ぶだけで次のバスの発車時刻が分かるようにしました。現在地から近い停留所を探す機能を付けたのも、「そもそもバス停がどこか分からない」自分のためでもあります。
市電には無く、市バスにはある
そして、2つ作ってみて、いちばん違ったのがデータの出どころでした。
市バスなうを作るとき、鹿児島市営バスの時刻表はGTFS-JPという公共交通の標準形式のオープンデータとして公開されているものを使えました。ところが同じ鹿児島市が運行する市電には、2026年現在、時刻表のオープンデータがありません。市電なうの時刻表は、公式サイトの情報をもとに自分で整備しています。
| 市電なう | 市バスなう | |
|---|---|---|
| データの出どころ | 公式サイトのHTMLの表を、自分で書き起こす | 鹿児島市が公開するGTFS-JP |
| 対象 | 1系統・2系統の全電停 | 停留所789・系統60 |
| データ量 | 電停ごとの発車時刻(平日・土曜・日祝の3種) | 便2,026・時刻データ53,721行 |
| 更新の検知 | 版を示す情報が無いので、できない | 配布ファイルの更新を検知できる |
| 更新のしかた | 月初のアクセスを起点に、自動で取り直す | 月1回、更新を検知して取り込み直す |
市電の時刻表ページは、「谷山行き/鹿児島駅前行き」×「平日・土曜・日祝」の6列が並んだ表です。ここから電停ごとの発車時刻を起こしています。
やっかいなのは、その表に区間便や直通便の注釈が混ざっていることでした。この電車は途中までしか行かない、この電車は直通する——といった情報が、発車時刻とは別の行として付いています。
ここで一度、静かな誤りを作りました。ダイヤ改正でその区間便が無くなったとき、古い注釈だけがデータに残り続けたのです。そうすると、たまたま同じ時刻に発車するようになった普通の電車を、区間便として案内してしまう。時刻は合っているので、画面を見ても間違いに気づけません。
いまは、時刻表を取り直すたびに注釈をいったん全部消してから入れ直しています。ただし、一部の電停で取得に失敗したときは削除を出さず、追記だけにしています。消したまま入れ直せなくなるほうが、古い注釈が残るより厄介だからです。
オープンデータがあっても、足りないものがある
では市バスのほうは楽だったかというと、そうでもありませんでした。
鹿児島中央駅のような大きな拠点には、バスののりばが何本もあります。「東7のりば」のような番号です。初めて乗る人にとっては、系統より先に知りたい情報だと思います。
ところが、GTFSにはのりばの番号が入っていません。データの中には「子停留所」という形で実際ののりばに相当する地点が入っているのですが、番号そのものは持っていない。しかも市バスなうは当初、この子停留所をビルドのときに親の停留所へ丸めて捨てていました。まず、それを保持するように直しました。
番号のほうは、交通局が公開している中央駅のバスのりば案内のページで一つずつ確認して、手で対応付けました。
そして、広げるのをやめました。市内には複数ののりばを持つ拠点が190件あります。でも、実在の番号を裏付けられる公式のページが確認できたのは、鹿児島中央駅だけでした。天文館も高見馬場も、専用ののりば案内ページがありません。地図から推測して番号を振ることはできますが、のりばの案内が間違っていたら、乗り遅れます。裏付けの取れないところへは広げないことにしました。
のりばの場所は、写真を借りてくるのではなく、GTFSに入っている子停留所の緯度経度を使って地図にピンを打つ形にしました。データにあるものだけで作れて、出典もはっきりします。
同じ機能でも、データが違うと作り方が変わる
「まだ来ていない」の報告には、後から気づいた弱点がありました。報告した電停でしか、遅延の表示が出なかったのです。
でも考えてみると、手前の電停で電車が遅れているなら、その先の電停で待っている人にも関係があります。同じ電車が、これから自分のところへ来るのですから。
そこで、手前の報告を下流にも届けることにしました。ここで、2つのサービスの差がはっきり出ます。
市バスは、便ごとに一意な識別子を持っています。GTFSに「どの運行パターンの、何本目の便の、何番目の停留所か」が入っているので、手前の報告が自分の待っている便と同じものかどうかを断定できます。
市電には、それがありません。あるのは時刻表だけです。だから「この電停をこの時刻に出た電車は、次の電停をこの時刻に出るはず」という連鎖をたどって、たぶん同じ便だろう、と推定するしかない。
同じ機能なのに、片方は断定、もう片方は推定になりました。オープンデータがあるかないかは、データを取り込む手間の話だと思っていたのですが、実際には画面に出る情報の確からしさまで変えてしまう。作ってみるまで分かりませんでした。
だから、表示の強さも分けています。自分の電停での報告は「遅延の可能性あり」、手前の電停から届いた報告は「◯◯電停付近で遅延報告あり」。文言も、目立ち方も変えました。確からしさの違うものを同じ強さで出すと、どちらも過大に信頼されてしまうからです。
報告の有効期限は5分にしてあります。これは当初、ただの掃除のための設定でした。ところが下流へ届けるようにしてみると、この5分がちょうどいい減衰として働くことに気づきました。電車が進むにつれて報告は自然に期限切れになり、届く範囲が近い数電停に収まる。遠く離れた電停まで「遅延報告あり」が出続けることがありません。
数え方を間違えて、報告が積み上がっていた
この報告の機能では、もうひとつ間違えました。
何人が報告したかを数えているのですが、その数え方の鍵を「電停・方向・系統・発車時刻」の組み合わせにしていました。ここに日付が入っていません。
結果どうなるか。昨日の8時03分の電車に3人が報告していると、今日の8時03分の電車に最初の1人が報告した瞬間、カウントが4から始まります。誰も報告していない電車が、いきなり「4人が報告」になる。
いまは「前の記録がもう期限切れなら、1から数え直す」ようにしました。これで、同じ日のうちに報告が一度途切れて5分以上あいたあと再開したケースも、同時に直りました。
ついでに、もうひとつ地味な直しをしています。報告を受け取ったあと、期限切れの古い行を掃除しているのですが、これを応答を返す前に待たないようにしました。掃除の途中でエラーが出ると、報告自体はもう保存されているのにサーバーがエラーを返してしまい、利用者の画面からは報告が消えてしまうからです。片づけの失敗を、本来の仕事の失敗にしてはいけません。
電停で見る、という前提
この2つのサービスは、電停やバス停に立ったまま、片手で見る道具です。それを前提にすると、地味な部分がいくつか要りました。
ひとつは文字サイズです。小・中・大・特大から選べるようにしてあります。屋外の明るいところで、待ちながら片手で見る画面なので、標準の大きさが誰にでも合うとは限りません。
ところが特大にすると、長い停留所名が「…」で切れてしまいました。名前が読めなければ、そもそも道具になりません。いまは、収まらないときだけ文字を段階的に縮めて1行に収めるようにしています。
その実装でも、ひとつ踏みました。幅が測れていないうちに縮め始めてしまったのです。画面の準備が終わる前は、要素の幅がゼロとして返ってきます。すると「まったく収まっていない」と判断して最小まで縮む。しかも縮める理由になった値はその後変わらないので、幅が確定しても元に戻りません。実際に、幅1248pxの画面で46pxの文字が13pxまで縮んだままになっていました。いまは幅が測れるまで縮めないようにしています。
ダークモードにも対応していますが、「まだ来ていない」ボタンやQRコードのように視認性が最優先のものは、あえて明るいまま固定しています。全部を暗くするのが目的ではないので。
アプリを新しい版に自動で入れ替える処理で、無限にリロードを繰り返すバグを作ったことがあります。新旧の版を見分ける値に、比較のたびに現在時刻を使ってしまっていました。当然、比べるたびに違う値になります。画面に戻るたび「新しい版が来た」と誤検知してリロードし、リロードした先でまた誤検知する。
ビルドのときに一度だけ決まる値へ直して解消しました。時刻を識別子に使うと、こういう壊れ方をします。
電停ごとのページを作って、やめた
もう一つ、やってみてやめたことがあります。
検索から見つけてもらおうと、電停ごと・停留所ごとの静的なページを作りました。市バスなうのほうは271件あります。「郡元電停の時刻表」のようなページが並んでいれば、検索から入ってくる人がいるだろう、と考えました。
実際に作ってみて、手が止まりました。発車案内はアプリの画面で見られます。だとすると、その静的なページ自体が持てる中身は、時刻表の写しでしかない。そのページにしかない情報が無いのです。
ページ数だけは増えるので、検索の対象としては大きく見えます。でも中身は薄く、そのぶん保守は増える。ダイヤ改正のたびに271件の生成が正しいか気にすることになります。効果と手間が釣り合っていないと判断して、廃止しました。
同じ理由で、共有リンクもアプリに直接入る形のままにしてあります。静的ページを経由させればリンクのプレビューは豊かになりますが、受け取った相手に一手間増えます。それより、共有するときの文面を充実させてQRコードを付けるほうが、使う人の役に立つと考えました。
作ったものを捨てるのは、作るより勇気が要ります。それでも、薄いページを増やして数を稼ぐより、道具そのものを良くするほうが筋がいいと思っています。
電停の案内板を、ポケットの中に
市電なう・市バスなうは、鹿児島市交通局とは関係のない非公式のサービスです。公式の運行情報の代わりにはなれません。それでも、電停やバス停で過ごす「いつ来るか分からない時間」を、少しでも短くできればと思って作りました。
鹿児島市電にも、車両の位置を確認できる仕組みはあります。ただ、電停に立って「次はあと何分か」だけを知りたいときには、私にはもう少し軽く使えるものが欲しく感じられました。市電なうが時刻表ベースの表示にとどまっているのも、そこを補うことを先に考えたからです。時刻表がオープンデータとして公開されれば、こういう小さな道具はもっと作りやすくなります。そちらも進んでいってほしいと、個人的には思っています。
なくなった電光掲示板は戻ってきませんが、その代わりくらいは、ポケットの中に置いておける。そんな道具です。