RoughRoute — путевые точки на входе, настоящий маршрут на выходе
Офлайн мини-роутер на данных OpenStreetMap. Передайте ему упорядоченные точки маршрута — и получите ломаную, которая идёт по реальным дорогам, без обращений к сети во время работы и за считанные миллисекунды.
Бесплатный и с открытым исходным кодом · Rust · MIT License
🧭 Прямая линия — это не дорога
Всему, что имитирует движение — подмене GPS, демо, анимации на карте — нужен путь, который выглядит проеханным, а не прямая линия сквозь дома. Полноценные маршрутизаторы это умеют, но они тяжёлые, и почти всем нужен сервер на другом конце сетевого запроса.
📦 Достаточно компактный, чтобы встроить
RoughRoute делает одно: на входе точки маршрута, на выходе правдоподобная линия по дорогам. Карта заранее компилируется в компактный файл, который поставляется вместе с приложением, так что во время работы нет ни сервера, ни API-ключа, ни лимитов запросов.
Что он делает
📴 Никакой сети во время работы
Запросы выполняются по заранее собранному файлу карты прямо на устройстве. Работает в самолёте, в тоннеле и в CI с отключённой сетью.
🧩 Одно ядро, три оболочки
Одно и то же ядро на Rust собирается в WebAssembly для браузера, в нативную библиотеку Android через UniFFI и в консольную утилиту.
⚡ Запросы за единицы миллисекунд
A* по сжатой дорожной сети. Достаточно быстро, чтобы строить маршрут на каждом кадре воспроизведения, а не один раз в начале.
🗜 Файлы карт весом в мегабайты
Схлопывание вершин степени 2 и дельта-сжатие геометрии удерживают рабочий регион в размере, который не жалко положить в приложение или отдать через CDN.
🚗 Автомобиль и пешком
Один файл карты содержит оба профиля через битовые маски доступа, так что регион не нужно собирать и возить дважды.
🔁 Один вход — те же байты
Маршрутизация детерминирована: одни и те же точки и один и тот же файл карты всегда дают одну и ту же линию. Хорошая новость для тестов, которые сравнивают результат.
⚙️ Три шага
- Заранее скомпилируйте регион .osm.pbf в компактный файл .graph.
- Поставляйте этот файл — вместе с приложением или через CDN.
- На устройстве загрузите этот файл и выполняйте запросы локально. В ответ приходят координаты и расстояние.
⌨️ Из командной строки
roughroute build region.osm.pbf -o region.graph
roughroute route region.graph \
--profile car \
--via 40.7128,-74.0060 \
--via 40.7580,-73.9855 \
--format geojson
Или из браузера, через WebAssembly:
const router = new WasmRouter(graphBytes);
const { coords, distance } = router.route(waypoints, "car");
⚖️ Чего он намеренно не делает
RoughRoute меняет точность на размер и скорость. Он игнорирует односторонние улицы, запреты поворотов и расчёт по скоростям, а если путь не найден — возвращает прямой отрезок вместо отказа. Для воспроизведения, демо и офлайн-запасного варианта это правильный размен, а для пошаговой навигации — неправильный: там нужен полноценный маршрутизатор.
Лицензия MIT. Данные карт — от участников OpenStreetMap, под лицензией ODbL.