停止・減速・再加速のロスを秒換算し、日本全国の実道路からロングライド向けルートを探索する静的Webアプリです。アカウント、DB、実行時バックエンドは使いません。
道路データはGitに含まれないため、初回起動前にデータ生成が必須です。Node.jsに加えてRustツールチェーンが必要です。
npm install
npm run data:build
npm run devnpm run data:buildは約3.75GiBの未圧縮探索データを生成・検証した後、Brotli圧縮してpublic/data/へ約1.3GiBで保存します。生成中は未圧縮版と圧縮版が一時的に共存するため、十分な空き容量を確保してください。初回は約4.8GBのOSM PBFと国土地理院DEMも取得します。PBFとDEMは.cache/へ保存され、2回目以降は再利用されます。
すでにpublic/data/manifest.jsonと各.rcg.br・.rcs.brが生成済みの場合は、データ生成を省略できます。既存の未圧縮.rcg・.rcsだけを変換する場合はnpm run data:compressを実行します。この処理は圧縮成功後に未圧縮ファイルを削除します。
本番相当の確認:
npm run test
npm run check
npm run build
npm run previewdist/だけで動作します。普段npm run devだけを使う場合はdist/は不要で、削除しても次回のnpm run buildで再生成できます。
- MapLibreによる地図操作。連続クリックは最初を始点、最後を終点、その間を経由地点として扱う
- OpenStreetMap Nominatimによる日本語の住所・施設名検索。検索結果を選ぶと地図を移動し、ルート地点へ追加
- 地点間の+で挿入区間を選び、地図クリックで経由地点を追加。地点の個別削除にも対応
- Web Worker内の実道路A*探索
- 全国ルートは概要グラフで通過地方を決め、地方詳細グラフで区間ごとに再探索。接続できない地方境界だけ概要グラフへフォールバック
- 佐多岬→宗谷岬を含む日本全国の連続探索と自転車対応フェリー
- 新青森→新函館北斗の輪行・北海道新幹線リンク(57分+調整可能な乗換ロス)
- 九州から本州方面へ抜ける長距離探索では「関門海峡経由」と「臼杵→八幡浜フェリー経由」を別候補として表示
- 実走GPXで補正した信号停止確率・待ち・減速再加速、赤到着時の横断成功を含む信号右折モデル。大通り側は停止確率を0.15下げ、同等・路地側は同率
- 同じOSM道路を直進する交差点内45m以内の連続信号を、実質的な1信号グループとして評価(途中分岐は別交差点)
- サイクリングロード(OSM
highway=cycleway)を歩道相当の3km/hで評価する走行オプション - 信号左折、無信号右左折、T字路突き当たりを分けた実走ベースの交差点ロス
- 都市部の無信号幹線道路横断、幹線道路への右折合流、信号付きY字路の右斜め分岐を個別に評価
- 一時停止、狭路、路面、獲得標高100m単位の上り、九十九折り下りの秒換算
surface未登録の道路ではtracktype=grade1〜5から舗装・未舗装区分を補完- 未舗装速度をgrade2とgrade3以下の2区分で設定(既定16km/h・10km/h)
- 登坂ロスは道路の実効速度に反比例して補正し、低速の未舗装路では同じ獲得標高でも大きく評価
- 半径500m内の道路判断ノードが24個以上の区間を市街地と推定し、道路クラス別の相対速度を適用
footwayとpedestrianは収録し、自転車通行が明示された歩道は基準巡航速度の60%、それ以外とbicycle=dismountは押し歩き3km/hで評価(bicycle=no/privateは除外)highway=pathでsurface・tracktypeとも不明な道は、走行可能な路面と仮定せず押し歩き3km/hで評価highway=trackでsurface・tracktypeとも不明な道は、grade3以下と推定して荒れた未舗装路の設定速度で評価- OSMのトンネル区間では地表DEMが山体を拾うため、トンネル固有の標高がない限り上りを加算しない
- フェリー速度・乗降ロス、新幹線所要時間・輪行乗換ロスの数値調整
- フェリー1航路の距離上限(既定80km)。臼杵→八幡浜級を残し、高松→神戸や志布志→大阪を除外
ferry-status.jsonによる休止・廃止航路の強制除外(八戸・室蘭、宮古・室蘭を収録)- 全係数の数値入力とブラウザ内保存
- 保存済み係数を現行既定値へ戻すリセットボタン
- ロス最小候補と距離寄り比較候補
- 自転車走行距離を主表示し、総移動距離・フェリー距離・新幹線距離、時間、獲得標高、ロス内訳も表示
- 標高付きGPX 1.1ダウンロード
- Service Workerによるバージョン別ローカルキャッシュ
public/data/manifest.jsonに全国概要グラフと8地方の詳細グラフがあります。各エントリは範囲、バイト数、SHA-256を持ちます。
- 論理サイズ: 4,027,296,258 bytes(約3.75GiB、展開後)
- 保存サイズ: Brotli圧縮された18ファイルで1,383,876,482 bytes(約1.29GiB)
- 全国概要: 展開後は探索グラフ約483MiB+形状サイドカー約602MiB、保存・転送時は合計約378MiB
- 標高: 国土地理院DEM z10をビルド時に埋め込み
- 道路: OpenStreetMap PBFをビルド時に変換
- 道路形状: 探索ノード間のOSM中間形状点とDEM標高を
.rcsサイドカーへ格納し、.rcs.brとして保存
長距離で全国概要、同一地方内で詳細グラフを選択します。npm run dev、npm run preview、Firebase Hostingはいずれも.brへContent-Encoding: brを付け、ブラウザが透過的に展開します。初回取得後のキャッシュはブラウザの保存容量に収まる場合だけ使われ、容量不足でも探索自体は継続します。
地方PBFの実収録範囲はマニフェストの矩形範囲と完全には一致しません。指定点から地方グラフへのスナップが5kmを超えた場合は、誤った遠距離スナップを避けるため全国概要グラフへ自動的に切り替えます。
npm run data:buildこのコマンドは次を順番に実行します。
- Geofabrikから日本全国・8地方のOSM PBFを取得
- Rustビルダーをreleaseビルド
- 全国概要グラフと8地方の詳細グラフを生成
- 国土地理院DEMを埋め込み
- OSM右左折制限を抽出
- 運休フェリー設定をコピー
- SHA-256付きマニフェストを生成
- 生成データ容量を検査
.rcg・.rcsをBrotli圧縮し、圧縮成功後に未圧縮版を削除
public/data/はすべて生成物で、Git管理対象外です。運休航路の正本はconfig/ferry-status.jsonとしてGit管理します。PBFは.cache/osm/、DEMは.cache/gsi-dem-z10/へ保存され、2回目以降は再利用されます。初回は約4.8GBのPBFダウンロードが必要です。
2026-08-19に、PBFとDEMがすべてローカルキャッシュ済みの状態でnpm run data:build全体を計測した結果です。
- 実時間: 838.94秒(13分59秒)
- CPU: Apple M1
- メモリ: 16GB
- OS: macOS 26.5.2(Darwin 25.5.0、arm64)
- 圧縮前出力: 9探索グラフ+9形状サイドカー、合計4,027,296,258 bytes(約3.75GiB)。現在のパイプラインでは、この後Brotli圧縮して約1.29GiBで保存
初回はこれに約4.8GBのOSM PBFダウンロードとDEMタイル取得が加わります。取得時間は回線速度と配布元の応答に依存するため、上の13分59秒には含めていません。
ビルダーは自転車通行可能な道路、一方通行、信号、一時停止、道路幅、車線、路面、トンネル、進入・退出方位、ヘアピンを固定長探索バイナリへ変換します。交差点間のOSM中間形状点は探索ノードにせず、標高プロファイル付きの形状サイドカーへ分離します。地図表示とGPXは形状点を展開し、上りロスと獲得標高はDEMのピクセル揺れを抑える2km幅の距離平滑化後の累積上昇から計算します。
scripts/verify-route.tsはブラウザと同じパーサー・A*で佐多岬→宗谷岬を検証します。scripts/e2e.mjsはChromeで本番ビルドを開き、探索結果とGPXダウンロードを確認します。
実走GPXによる信号・右左折・無信号交差点の検証条件と結果はdocs/ride-parameter-validation.mdに記録しています。
npx vite-node scripts/verify-route.ts
node scripts/e2e.mjsE2E実行時は別ターミナルでnpm run previewを起動してください。
本番データも.rcg.br・.rcs.brのままdist/data/へコピーされます。firebase.jsonはこれらにContent-Encoding: brとapplication/octet-streamを設定し、内容ハッシュ付きURLを1年間キャッシュします。
npm run build
firebase deploynpm run buildはpublic/data/をdist/data/へコピーするため、ビルド中は約1.3GiB余分に使用します。デプロイ後、ローカルで本番ビルドを使わない場合はdist/を削除できます。