こんにちは、白川秋です。
熊本の観光×公共交通アプリ「くまモビ」、今週も開発全開でした。バージョンでいうと v0.31.0 から v0.37.0 まで。プッシュ通知にオフライン地図、ビジュアルスタンプ帳、新スポット追加、そして高速バスのGTFSを自作して人吉方面のルート検索を開通させるところまで、1週間の作業を全部まとめてお届けします。
この記事のポイント
- 季節で背景が変わる「ビジュアルスタンプ帳」がついに実装
- 観光スポットを14件追加、ルフィ像・ゾロ像の写真は県から掲載許可をいただきました
- 高速なんぷう号のGTFSを自作して、人吉方面への経路検索が可能に
プッシュ通知とオフライン地図が完成(v0.31〜0.32)
まず週の前半は、実装ロードマップの残り物件を片付けました。
プッシュ通知は Firebase Cloud Messaging で実装。くまモビは日本語・英語・繁体字中国語・タイ語の4言語対応なので、通知も言語別のトピック(kumamobi_news_{ja|en|zh_tw|th})に分けて配信します。ここでハマったのが「言語を切り替えたユーザーに通知が2通届く」問題。古い言語のトピック購読が残ってしまうのが原因だったので、起動のたびに対象以外のトピックを全部解除する自己修復型の同期処理を入れて解決しました。あと、アプリを開いている最中はOSが通知を出してくれない仕様だったので、アプリ内バナー(PushBanner)も自作しています。
オフライン地図は MapLibre の OfflineManager を使ったダウンロード機能です。実測で熊本市内エリアが約27MB、県域が約44MB。旅行前にWi-Fiで落としておけば、山間部で電波が怪しくても地図が表示されます。MapLibre v11 でAPIがごっそり変わっていて(名前も引数の形式も別物)、公式の型定義ファイルを直接読んで正解を探すという泥臭い作業になりました。
このほか、利用状況を集計する分析ダッシュボード(Chart.jsのHTMLレポートを吐くNode.jsスクリプト)を作り、チケット・通知・クーポン統計に対応したプライバシーポリシーの改訂も済ませています。
写真まわり:ルフィ像・ゾロ像の掲載許可をいただきました
観光スポットのサムネイル整備も大きく進みました。Wikimedia Commonsから今週だけで30件以上の写真を追加しています(CC BYなどのライセンス表記はアプリ内のクレジット一覧に自動反映)。
そして個人的に嬉しかったのがこれ。熊本県の観光振興課さんから、ルフィ像とゾロ像の写真の使用許可をメールでいただきました。「クレジット表記は不要です」とのことだったので、その旨をライセンス管理ファイルに記録した上で掲載しています。ワンピース像はくまモビの目玉スポットなので、公式に写真を載せられるのは大きいです。
ちなみにWikimediaからの一括ダウンロードは、アクセスが集中するとHTTP 429(リクエスト過多)で弾かれます。ダウンロード済みはスキップ、失敗したら5秒→10秒→20秒と間隔を空けてリトライ、それでもダメなら解像度を落としたサムネイルAPIに切り替える、という行儀のいいスクリプトに育てました。
徒歩ルート描画の総点検(v0.33系)
「スポットまでの徒歩ルートの線がおかしい」問題を根っこから調査しました。開けてみたら原因は1つじゃなく、5層くらいのミルフィーユでした。
- 座標が未確認のままのスポットが26件あり、最大で3.4kmズレていた
- ルート形状を生成するスクリプトが、途中から追加したスポットを正規表現の書き方のせいで丸ごと拾えていなかった
- 「はみ出た線を刈る」後処理が、橋やお堀を迂回する正しい遠回りまで刈っていた
- 徒歩形状の生成範囲(800m)より、経路検索の探索範囲(5km)のほうが広く、範囲外がごっそり直線フォールバックに
- 降車地点と徒歩線の始点の間に隙間があった(他のレグにはあるステッチ処理が徒歩レグだけ抜けていた)
一つずつ診断スクリプトで潰していき、キャッシュキーに座標を含める設計にしてあったおかげで、座標を直せば古いキャッシュが自動で無効化される仕組みも効いてくれました。地味な週でしたが、線がスッと正しく引かれると気持ちいいです。
ビジュアルスタンプ帳が誕生(v0.34〜)
今週の目玉その1。これまでのスタンプラリーを、「帳面をめくって集める」ビジュアルスタンプ帳に作り替えました。
- 季節で背景が変わります。春夏秋冬、月に応じて自動切り替え
- ジャンルごとに9ページ構成。ページ内はS字カーブのドットパスに沿ってスタンプ枠が並びます
- 最初は空っぽのページが、スタンプを集めるたびにスポットの写真で埋まっていく
あわせてスポットの分類を「genre(表示用ジャンル)」で整理し直しました。ここで大事にしたのが、解錠ロジックを司る category は絶対に触らないという掟です。スタンプの分母やクーポンの解放条件は category で決まっているので、見た目のジャンル分け(神社・自然・買い物など)は新設した genre フィールドだけで行い、既存ユーザーの進捗に一切影響しない設計にしています。地図のピン色やカテゴリフィルタも genre 基準に統一しました。
観光スポット14件追加と、経路検索の底上げ(v0.36〜0.37)
目玉その2。阿蘇・山鹿・八代など、熊本市外の観光地を中心に14スポットを一気に追加しました。山鹿市の彦嶽宮(暗闇で光るお守りで話題の神社です)も入っています。
ところが追加してみると、「近くにバス停はあるのに経路が出ない」スポットがちらほら。診断スクリプトを書いて調べたところ、最寄り停留所が路線網の孤立した島に属しているのが原因でした。そこで、検索結果がゼロだったときは対象停留所を5km・12停まで広げて再検索するリトライを実装。これで万田坑や彦嶽宮への経路が出るようになりました。
それでも残ったのが人吉エリア。既存の6事業者のGTFSには熊本市〜人吉を結ぶデータがそもそも存在しません。ならば作るしかない、ということで──
高速なんぷう号のGTFSを自作しました
今週いちばんの力技です。熊本と人吉を結ぶ高速バス「高速なんぷう号」の時刻表を公式サイトから取得・解析し、GTFSフィードを丸ごと自作するスクリプトを書きました。西部車庫〜人吉間の12停留所ぶんの時刻データを生成して、既存の6フィードに7つ目として合流させています。
これでMOZOCA(人吉鉄道ミュージアム)など、これまで「近くに停留所はあるのに繋がらなかった」人吉方面のスポットにも道が通ります。オープンデータが無いなら自分で整備する。地域アプリの個人開発、こういうところが一番面白いです。
細かい改善もいろいろ
- 地図のカテゴリチップ:リストが閉じた状態で選択中のチップをタップしたら、選択解除ではなくリストを開き直すように(経路検索から戻ったときの「あれ、リスト消えた」対策)
- 効果音の初期化処理にあった競合を修正(端末が重いときにウォームアップ音が「ポン」と鳴ってしまうことがありました)
- クローズドテスト用にスタンプ取得の判定半径を拡大(遠方のテスターさんも動作確認できるように)
- お知らせの同日投稿が逆順に並ぶ不具合を修正
まとめ:今週の成果
| 分類 | 内容 |
|---|---|
| 新機能 | ビジュアルスタンプ帳(季節背景・9ジャンル)、プッシュ通知、オフライン地図、分析ダッシュボード |
| コンテンツ | 観光スポット14件追加、サムネイル30件以上、ルフィ像・ゾロ像の公式写真掲載 |
| データ整備 | 高速なんぷう号GTFS自作、座標修正、徒歩ルート描画の総点検 |
| 改善・修正 | 経路検索の拡大リトライ、通知の重複解消、効果音・UIの細かな修正 |
クローズドテストは順調に進行中で、正式リリースに向けて着々と足場が固まってきました。テスターとしてご協力いただいている皆さん、いつも本当にありがとうございます。来週も引き続き開発を進めていきますので、応援よろしくお願いします!
▶ くまモビの最新情報はこのブログとXでお知らせします
▶ ご意見・不具合報告はXのDMまたはニコ生でお気軽にどうぞ

