地図に標識がないとき:通達 31/2019 にもとづく制限速度の推定
OpenMapTiles のスキーマには maxspeed タグがありません。無料タイルを使う場合、制限速度のほぼ 100% を推定する必要があります。この記事では、その推定がどこで誤りうるかをご説明します。
2026 年 10 月更新:道路種別による制限速度の推定は、現在は既定でオフになっています。確かなデータがない区間では標識を表示せず、設定の「データがないときは推定する」でオンにできます。また、アプリは現在 OBD-II にも対応しています。
当初の計画はシンプルで、OpenStreetMap の maxspeed タグを読み取って表示するだけのはずでした。ところが、その計画は最初の一歩でつまずきました。
公開タイルには maxspeed が含まれていません
OpenMapTiles スキーマ(OpenFreeMap をはじめ、多くの無料タイル提供元が採用している標準)には、maxspeed フィールドが transportation レイヤーに含まれていません。元の OSM でしっかりタグ付けされている道路でも、その情報はタイルには入りません。データが欠けているのではなく、タイルを小さく保つためにスキーマが意図的に省いているのです。
さらにその奥には、もう一つの問題があります。OSM 上のベトナムの道路には、そもそも maxspeed タグがないことが非常に多いのです。そのため、タイルを自作しても、ほとんどの道路には読み取れる値がありません。
法令から推定する
通達 31/2019/TT-BGTVT は、区域と道路の種類ごとに最高速度を定めています。乗用車と 3.5 t 以下のトラックの場合は次のとおりです。
- 市街地内 — 中央分離帯のある道路、または 2 車線以上の一方通行路では 60 km/h、中央分離帯のない対面通行路、または 1 車線の一方通行路では 50 km/h。
- 市街地外 — 中央分離帯のある道路では 90 km/h、中央分離帯のない対面通行路では 80 km/h。
VietnamSpeedRules はこの表をそのまま実装しています。ただし、これを当てはめるには、地図が明示していない 2 つの情報が必要です。
1 つ目の推定:市街地かどうか
実際の道路では、市街地の範囲は R.420 と R.421 の標識で示されます。しかし OSM には、これらが体系的に登録されているわけではありません。そこでアプリは、タイルの landuse レイヤーから推定しています。住宅地の landuse であれば市街地とみなします。あくまで近似なので、町の境目では誤ることがあります。
2 つ目の推定:道路種別による上限
法令を文字どおりに読むと、市街地外の中央分離帯のない道路では、幅 3 メートルのコンクリート舗装の村道を含め、どこでも 80 km/h が許されます。アプリはそうせず、地図上の道路種別で上限を設けているため、小さな道路では法令の上限より低い制限速度になります。
これは意図的なものです。必要より早い警告は少しわずらわしいだけですが、必要より遅い警告は、肝心なときに役に立ちません。
推定値に必ず「~」が付く理由
制限標識では、推定値には必ず~ 推定と表示されます。運転者は「地図にこの道路は 60 と書かれている」のか「アプリがこの道路を 60 と推定している」のかを見分けられる必要があります。この 2 つは、信頼してよい度合いが違うからです。区別をなくせば、推測を事実のように見せることになってしまいます。
本当の解決策
V1.5 では、maxspeed を含むカスタムプロファイルで、Planetiler を使ってタイルを生成する予定です。OSM 自体にデータがない部分は埋まりませんが、すでにタグ付けされている道路はすべて「推測が必要」から「読み取れる」に変わります。OBD-II は対象外のため、速度警告の精度こそがこのアプリの中核そのものです。