Đi đến nội dung chính

Ghi chép kỹ thuật

Khi bản đồ không có biển báo: suy giới hạn tốc độ theo Thông tư 31/2019

Schema OpenMapTiles không mang tag maxspeed. Với tile miễn phí thì gần như 100% giới hạn tốc độ phải suy ra — và đây là những chỗ suy đoán đó có thể sai.

Kế hoạch ban đầu rất đơn giản: đọc tag maxspeed từ OpenStreetMap và hiển thị. Kế hoạch đó chết ngay ở bước đầu tiên.

Tile công cộng không mang maxspeed

Schema OpenMapTiles — chuẩn mà OpenFreeMap và hầu hết nhà cung cấp tile miễn phí dùng — không có trường maxspeed trong lớp transportation. Kể cả đoạn đường đã được tag đầy đủ trong OSM gốc thì thông tin đó cũng không đi vào tile. Không phải thiếu dữ liệu, mà là schema cố ý bỏ để tile nhẹ.

Cộng thêm một chuyện nữa: đường Việt Nam trong OSM vốn đã thiếu tag maxspeed rất nhiều. Nên ngay cả khi tự build tile mang tag đó, phần lớn đường vẫn không có gì để đọc.

Suy từ luật

Thông tư 31/2019/TT-BGTVT quy định tốc độ tối đa theo khu vực và loại đường. Với nhóm xe con và xe tải đến 3,5 tấn:

  • Trong khu đông dân cư — 60 km/h trên đường đôi hoặc đường một chiều có từ hai làn, 50 km/h trên đường hai chiều hoặc đường một chiều một làn.
  • Ngoài khu đông dân cư — 90 km/h trên đường đôi, 80 km/h trên đường hai chiều.

VietnamSpeedRules cài đúng bảng này. Nhưng để áp dụng được nó, app cần biết hai thứ mà bản đồ không nói thẳng.

Chỗ suy đoán thứ nhất: khu đông dân cư

Ranh giới khu đông dân cư ngoài đường được xác định bằng biển R.420 và R.421. OSM không đánh dấu hai biển này một cách hệ thống. App suy từ lớp landuse của tile — vùng có landuse dân cư thì coi là khu đông dân cư. Đây là một xấp xỉ, và nó sai ở rìa các thị trấn.

Chỗ suy đoán thứ hai: trần theo cấp đường

Đọc đúng chữ của luật thì mọi đường hai chiều ngoài đô thị đều được chạy 80 km/h — kể cả đường làng bê tông rộng ba mét. App không làm vậy: nó kẹp trần theo cấp đường trong bản đồ, nên đường nhỏ sẽ nhận giới hạn thấp hơn mức luật cho phép.

Đây là lựa chọn có chủ đích. Cảnh báo sớm hơn mức cần thì gây khó chịu; cảnh báo muộn hơn mức cần thì vô dụng đúng lúc quan trọng nhất.

Vì sao mọi giá trị suy ra đều có dấu ngã

Trên biển giới hạn, giá trị do app suy ra luôn kèm chữ ~ ước tính. Người lái cần phân biệt được 'bản đồ nói đường này 60' với 'app đoán đường này 60', vì hai câu đó đáng tin ở mức khác nhau. Bỏ dấu phân biệt ấy đi thì app đang trình bày một suy đoán như một sự thật.

Hướng xử lý thật

V1.5 sẽ tự build tile bằng Planetiler với profile riêng có mang maxspeed. Việc đó không lấp được chỗ OSM vốn thiếu dữ liệu, nhưng nó chuyển những đoạn đã có tag từ nhóm 'phải đoán' sang nhóm 'đọc được' — và vì app đã bỏ OBD-II, độ chính xác của cảnh báo tốc độ chính là toàn bộ phần lõi.