Бесплатный инструмент

RoughRoute — путевые точки на входе, настоящий маршрут на выходе

Офлайн мини-роутер на данных OpenStreetMap. Передайте ему упорядоченные точки маршрута — и получите ломаную, которая идёт по реальным дорогам, без обращений к сети во время работы и за считанные миллисекунды.

Бесплатный и с открытым исходным кодом · Rust · MIT License

Проблема

🧭 Прямая линия — это не дорога

Всему, что имитирует движение — подмене GPS, демо, анимации на карте — нужен путь, который выглядит проеханным, а не прямая линия сквозь дома. Полноценные маршрутизаторы это умеют, но они тяжёлые, и почти всем нужен сервер на другом конце сетевого запроса.

Идея

📦 Достаточно компактный, чтобы встроить

RoughRoute делает одно: на входе точки маршрута, на выходе правдоподобная линия по дорогам. Карта заранее компилируется в компактный файл, который поставляется вместе с приложением, так что во время работы нет ни сервера, ни API-ключа, ни лимитов запросов.

Функции

Что он делает

📴 Никакой сети во время работы

Запросы выполняются по заранее собранному файлу карты прямо на устройстве. Работает в самолёте, в тоннеле и в CI с отключённой сетью.

🧩 Одно ядро, три оболочки

Одно и то же ядро на Rust собирается в WebAssembly для браузера, в нативную библиотеку Android через UniFFI и в консольную утилиту.

⚡ Запросы за единицы миллисекунд

A* по сжатой дорожной сети. Достаточно быстро, чтобы строить маршрут на каждом кадре воспроизведения, а не один раз в начале.

🗜 Файлы карт весом в мегабайты

Схлопывание вершин степени 2 и дельта-сжатие геометрии удерживают рабочий регион в размере, который не жалко положить в приложение или отдать через CDN.

🚗 Автомобиль и пешком

Один файл карты содержит оба профиля через битовые маски доступа, так что регион не нужно собирать и возить дважды.

🔁 Один вход — те же байты

Маршрутизация детерминирована: одни и те же точки и один и тот же файл карты всегда дают одну и ту же линию. Хорошая новость для тестов, которые сравнивают результат.

Как это работает

⚙️ Три шага

  1. Заранее скомпилируйте регион .osm.pbf в компактный файл .graph.
  2. Поставляйте этот файл — вместе с приложением или через CDN.
  3. На устройстве загрузите этот файл и выполняйте запросы локально. В ответ приходят координаты и расстояние.
Попробуйте

⌨️ Из командной строки

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.