Логистика / маршрутизациясобственный продукт

Georeis

Диспетчеризация доставки и приложение водителя: маршрут по фото путевого листа → оптимизированный план на день.

Скриншот карты маршрута Georeis

Georeis — подробно

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

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

Искусственный интеллект используется в одном конкретном месте — распознавании адресов на фотографии путевого листа с помощью vision-модели. Сам расчёт маршрута — не генеративный ИИ, а классические алгоритмы оптимизации: задача маршрутизации транспорта с ограничением грузоподъёмности и временными окнами доставки, решаемая на собственном графе дорог.

Ключевое архитектурное решение — весь стек маршрутизации (граф дорог, решатель маршрутов, кэш геокодирования) развёрнут на собственной инфраструктуре, а не вызывается через внешние картографические API. Единственный внешний сервис — геокодер для российских адресов, и он используется только как резерв, когда адреса нет в собственной базе.

01

Задача

Диспетчер распределяет заказы вручную, а клиент не всегда понимает, когда именно его ждать. За этой общей формулировкой стоит несколько конкретных операционных проблем.

Список адресов обычно приходит неструктурированным — фотография бумажного бланка, а не готовый файл, и кто-то должен вручную перепечатать 10–20 адресов, прежде чем начать думать о маршруте.

Порядок объезда, выбранный интуитивно, не учитывает реальную дорожную сеть и тем более — временные окна, обещанные клиенту. Стандартная оптимизация «минимизировать время в пути», которую по умолчанию делают роутинг-движки, может дать маршрут, не соответствующий процессу: движок готов сдвинуть время выезда машины, чтобы не копить простой у точки, — но в реальности машина выезжает сразу после погрузки.

Как только в игру вступает больше одной машины, задача усложняется на порядок: нужно решить, кому какие точки достанутся, с учётом грузоподъёмности и текущей загрузки каждой машины. Вручную это делать долго, и с ростом парка процесс не масштабируется. Без пересчитанного расписания диспетчер не может сказать клиенту точное время визита, а без собственной адресной базы каждый новый путевой лист заново прогоняется через внешний геокодер, даже если адрес уже встречался накануне.

02

Решение

Основная цепочка продукта:

Фото/ручной ввод → извлечение и подтверждение адресов → геокодирование → расчёт маршрута → распределение по водителям → выдача маршрута.

Фотография или текст превращается в структурированный список адресов, который проверяет человек, прежде чем список попадёт в расчёт. Каждый адрес сверяется с собственной растущей базой, и только если совпадения нет — уходит запрос во внешний геокодер. Ядро продукта строит порядок объезда точек по реальному графу дорог с учётом временных окон и распределяет точки между водителями, если их больше одного.

Такое разделение держит человека в контуре решений там, где цена ошибки высокая (подтверждение адреса), и полностью автоматизирует то, что алгоритмически проверяемо (расчёт маршрута, распределение нагрузки).

03

Как работает

Приём заказов: фото путевого листа и ручной ввод

Диспетчер создаёт задачу маршрутизации двумя способами — загружает фото путевого листа или вводит адреса текстом. Для фото запускается фоновая обработка: vision-модель распознаёт построчный список адресов и фиксирует номер строки на снимке для каждого адреса, чтобы порядок в интерфейсе совпадал с оригиналом. Оригинал снимка сохраняется и может быть переоткрыт для повторного распознавания. Модель развёрнута локально; внешний платный сервис распознавания оставлен только как резерв на случай сбоя.

Проверка и подтверждение адресов

Прежде чем попасть в расчёт маршрута, все адреса проходят экран ручной сверки: статус по каждой строке, правка текста, фильтр «только расхождения». Автоматическое совпадение засчитывается только при точном совпадении нормализованной строки с уже подтверждённым адресом в базе — никакой нечёткий мэтчинг не влияет на маршрут автоматически. Цена ошибки в логистике высокая, поэтому человек остаётся в контуре принятия решения.

Собственная адресная база и внешний геокодер как резерв

Перед обращением к внешнему геокодеру система сначала ищет точное совпадение в своей базе; результат внешнего запроса сохраняется обратно для повторного использования. База копится с первого дня работы. Чем дольше работает диспетчерская, тем меньше она зависит от внешнего геокодера: повторяющиеся адреса — постоянные клиенты, склады, магазины сети — в логистике встречаются часто и после первого распознавания обрабатываются мгновенно из собственной базы.

Расчёт маршрута с учётом дорог и временных окон

Ядро продукта работает в двух режимах. «По расстоянию» — короткий маршрут без учёта временных окон, их нарушения только подсвечиваются. «По времени» — требует точку старта, учитывает временные окна клиентов и реальное ожидание машины на месте, если она приехала раньше разрешённого времени.

Расчёт устроен в два этапа, потому что стандартный решатель задачи маршрутизации оптимизирует длительность маршрута и может трактовать время выезда как сдвигаемую переменную — а в реальности машина не может выехать позже, она выезжает сразу после погрузки. Сначала решатель даёт базовый порядок объезда, затем собственный алгоритм пересчитывает вариант от фиксированного времени выезда, честно считая ожидание и нарушение окна, и ищет улучшающие перестановки точек. Варианты сравниваются не единой формулой, а порядком приоритетов: жёсткое окно важнее простоя, простой важнее времени в пути, время в пути важнее километража — осознанный отказ от «курса обмена километров на минуты ожидания», которого не существует в реальной работе диспетчера. На тестовых маршрутах такой пересчёт заметно устранял простои, вызванные сдвигом времени выезда; это результат на тестовых данных, не измеренный эффект на реальных клиентах.

Распределение заказов между несколькими водителями

На странице распределения диспетчер видит пул заказов и список водителей и одной кнопкой из нескольких алгоритмов получает превью распределения — с метриками по весу, объёму, пробегу и времени — прежде чем что-либо сохранится. Точку можно вручную перекинуть другому водителю кликом на карте, задать общую точку отгрузки, включить обязательный возврат на склад.

Разные алгоритмы решают разные приоритеты: минимум суммарного времени в пути (решатель работает сразу для всех водителей и машин), распределение по районам (географическая кластеризация без учёта дорожного графа), выравнивание нагрузки поровну по пробегу или по весу (та же кластеризация плюс перебалансировка точек между водителями). Диспетчер получает объяснимый вариант, а не «чёрный ящик», и правит только то, что не подходит.

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

Приложение водителя как связанный продукт

Каждый построенный маршрут выдаётся в отдельное приложение водителя — список точек, карта, ручной реордер, открытие маршрута во внешних картографических приложениях. Это отдельный продукт со своим интерфейсом, но общим backend с диспетчерской частью — фронтенды специально не сцеплены друг с другом, чтобы развиваться независимо.

04

Ключевые особенности

Человек подтверждает адреса перед расчётом маршрута — автоматическое распознавание лишь черновик, ни один маршрут не строится по неподтверждённому адресу.

Собственная адресная база растёт с каждым использованием — повторяющиеся адреса после первого распознавания обрабатываются мгновенно, без платного геокодера.

Приоритет «окно важнее километров» — написанная логика, а не настройка стороннего API, что в облачном роутинг-сервисе третьей стороны настроить было бы невозможно.

Несколько алгоритмов распределения вместо одного чёрного ящика — диспетчер выбирает приоритет (пробег, район, равномерная загрузка) и видит превью с метриками до применения.

Грузоподъёмность и мультирейс учитываются автоматически — если заказы не помещаются в одну машину, система сама делит их на последовательные рейсы.

Данные клиентов не покидают собственную инфраструктуру — адреса, маршруты и фото путевых листов хранятся на собственном сервере, за исключением резервного обращения к внешнему геокодеру.

05

Техническая реализация

Мультирейс реализован через несколько последовательных маршрутных слотов с одним депо на одного физического водителя — стандартный решатель не поддерживает нативно сценарий «съездил, вернулся, поехал снова» в рамках одной машины, поэтому это смоделировано на уровне продукта и показывается диспетчеру как «Рейс 1», «Рейс 2» для того же водителя.

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

Backend и связанные сервисы — дорожный граф, решатель маршрутизации, база данных и хранилище фотографий — развёрнуты на собственной инфраструктуре, а не вызываются через облачные API картографических провайдеров. Это одновременно вопрос соответствия требованиям к обработке персональных данных (адреса и маршруты не покидают периметр без необходимости) и вопрос контроля над логикой — приоритет «окно важнее километров» на стороннем облачном сервисе не настраивается, а на собственном стеке это написанная и проверяемая функция.

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

Текущее ограничение: авторизация построена на общем токене доступа, а не персональной учётной записи каждого диспетчера или водителя — это защита от случайного стороннего доступа, но не полноценная модель разграничения прав. Персональная авторизация — запланированный этап.

06

Технологический стек

Решатель задачи маршрутизации (VRP/TSP/CVRP/VRPTW) — построение порядка объезда точек с учётом грузоподъёмности и временных окон, self-hosted.

Дорожный граф и матрицы расстояний — расчёт времени и расстояния между точками по реальной сети дорог, self-hosted, на собственном OSM-графе.

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

FastAPI + Pydantic — API-слой backend.

SQLAlchemy + PostgreSQL + PostGIS — хранение адресов, маршрутов, организаций и водителей, включая геопространственные данные.

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

Объектное хранилище — хранение оригиналов загруженных фотографий путевых листов.

Внешний геокодер — нормализация российских адресов, вызывается только как резерв.

Next.js / React — два отдельных фронтенда: диспетчерская панель и приложение водителя, на общем backend.

Docker Compose — контейнеризация и деплой на собственную инфраструктуру.

07

Что получилось

Диспетчеру больше не нужно перепечатывать список из 10–20 адресов с фотографии — только проверить и при необходимости поправить то, что распознала модель.

Маршрут строится с учётом реальной дорожной сети и жёстких временных окон клиентов, с явным приоритетом «окно важнее километров», а не компромиссной формулой, скрытой внутри стороннего сервиса.

Распределение заказов между несколькими водителями делается одним из нескольких алгоритмов с превью результата, а не назначением точек вручную одну за другой.

Собственная адресная база растёт с каждым днём работы и снижает зависимость от внешнего платного геокодера на повторяющихся адресах.

Данные клиентов — адреса, маршруты, фотографии путевых листов — хранятся на собственной инфраструктуре и не передаются во внешние сервисы, кроме резервного обращения к геокодеру.

Числовых метрик экономии времени или денег на реальных клиентах пока нет: продукт проверялся на демонстрационной организации и внутренних тестовых данных, а не в масштабном промышленном внедрении.

08

Где можно использовать

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

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

Компании, для которых важно соблюдение временных окон доставки, а не только минимизация общего пробега.

Бизнесы, которым принципиально, чтобы адреса клиентов и маршруты не передавались во внешние облачные картографические сервисы, и организации, которые хотят снизить объём ручного ввода данных за счёт распознавания адресов по фотографии.

Похожая задача с доставкой или выездными службами?

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

Обсудить похожую задачубесплатно · 25–30 минут
Другие проекты

Ещё в портфолио

KILLOOS

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

Подробнее →

Vizgen

Визуальный редактор для работы с контентом: генерация карточек товара, визуализация и апскейл — доставляется через REST API.

Подробнее →

Geo101

Приложение для активных путешественников: GPX-маршруты и офлайн-навигация для трейла, эндуро и пешего туризма.

Подробнее →

Kitchen 3D Planner

Планировщик кухни для мебельных компаний: подбор модулей, фасадов и техники по размерам помещения, с 3D-сборкой на выходе.

Подробнее →

Driver.Georeis

Приложение для водителей Georeis: распознаёт адреса с фото путевого листа, сверяет по адресной базе и строит порядок объезда с расчётом времени прибытия.

Подробнее →

OpenSEO

Генерация SEO-статей по заданной структуре — с очеловечиванием стиля и независимой валидацией результата перед публикацией.

Подробнее →

DeviceHub

Единый сервис метрик для физических устройств на столе: тянет данные сразу из нескольких продуктов и отдаёт готовые экраны без перепрошивки.

Подробнее →

Rilso

Рабочее место для упаковки рилсов: из сырого видео — превью, транскрипт, вшитые субтитры, обложка, текст публикации, хэштеги и архив на экспорт.

Подробнее →

Лабсервер

Собственный GPU-сервер для тестирования моделей, подбора параметров и сборки MVP в закрытом контуре — без выхода данных наружу.

Подробнее →