Константин Чирихин
программист из команды Algo Kit
Дима Шварц
продакт транспорта

Маршруты для пешеходов

Пересмотрели алгоритмы построения маршрутов для пешеходов и стали по-настоящему учитывать тротуары. Расскажем, как строятся пешеходные маршруты и почему досадных ошибок с лишними зигзагами и выходом на проезжую часть больше не будет.
Пешеходные маршруты появились в 2ГИС в далёком 2016 году. Восемь с лишним лет — достаточный срок для фичи, чтобы оценить её и вспомнить, как она обрела нынешний вид.
Как всё начиналось
Ранние версии пешей маршрутизации в 2ГИС были достаточно примитивными: линии маршрутов проходили прямиком по проезжим частям, пешеходные переходы и запреты на переход дорог отсутствовали. Кроме того, не существовало какого-либо механизма, который влиял бы на предпочтительность тех или иных маршрутов (иными словами, штрафов — снижения привлекательности маршрутов из-за наличия в них переходов дорог, проходов по лестницам и так далее). Часто это приводило к нелогичным и неудобным маршрутам.

Например, навигатор мог предложить идти в обход на сотни метров, хотя рядом был переход.
Когда-то давно 2ГИС мог построить такой маршрут — без учёта зебры прямо около точки А
Такой маршрут не сильно хорошо выглядел бы даже до появления реалистичных дорог, но с ними стало ещё хуже.
В 2016 году появился новый подход к построению маршрутов, на тот момент изменивший ситуацию. Алгоритм научился корректно определять «переходимость» улиц и учитывать пешеходные переходы, появилась система штрафов, а чтобы визуально линия маршрута проходила не по проезжей части, алгоритм стал смещать её в сторону с помощью алгоритма раздвижки. Так получалось имитировать движение пешехода не по дороге, а сбоку от неё, как бы по тротуару.
Раздвижка — наш внутренний алгоритм, который рисует пешеходный маршрут смещенным относительно проезжей части. Запомните этот термин — о нём ещё будет позже. По сути, раздвижка допускала, что рядом с дорогой можно пройти по тротуару. Конечно, фактически это не всегда было так.
С реалистичными дорогами маршрут с раздвижкой выглядит не так уж и хорошо: смещение оказывается недостаточным, поэтому визуально линия маршрута всё равно проходит по проезжей части. А если построить более длинный маршрут вдоль улицы, это становится ещё заметнее.
И другие проблемы
Раздвижка не всегда корректно работала и в случае сложных геометрий дорог: появлялись странные петли и изломы на линии маршрута. А в некоторых местах навигатор мог построить маршрут прямо поверх препятствий или очень странно переводить через дорогу.
Старый алгоритм строит очень странный маршрут через улицу Восход в Новосибирске
Более того, алгоритм раздвижки не знал, есть ли тротуар на самом деле и где он находится. В любом случае он одинаково сдвигал линию маршрута вбок от дороги. А ведь на улицах тротуары могут быть разной ширины, а на некоторых либо отсутствовать, либо находиться только на одной стороне. Это могло приводить к неудобным маршрутам, не соответствующим реальной обстановке: навигатор отображает «тротуар» с помощью раздвижки, но фактически нужно идти по обочине, в то время как с другой стороны улицы тротуар на самом деле есть.
Построенный маршрут в Петропавловске-Камчатском выглядит так, будто проходит по тротуару, хотя на местности с правой стороны улицы тротуара нет
Были проблемы и с генерацией инструкций для ведения по маршруту. Из-за технических ограничений инструкции создаются до раздвижки — генератор фактически работает не с тем маршрутом, который будет предложен пользователю на экране. Кроме того, он не всегда может определить переход дороги вне пешеходного перехода, что приводило к неточным инструкциям: вместо «перейдите улицу» можно услышать что-то вроде «пройдите 10 метров вперед и поверните налево».
Выход — честные тротуары
Стало ясно, что старый алгоритм перестал отвечать современным требованиям к навигатору.

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

С настоящими тротуарами маршруты начинают выглядеть гораздо естественнее: линии маршрутов проходят именно там, где расположен тротуар, а не вдоль дорог в произвольных местах.
Скриншот слева: тротуары прорисованы в данных, и маршруты учитывают наличие зелёных насаждений между проезжей частью. Раздвижка этого учесть не могла. Скриншот справа: линия маршрута не заходит на проезжую часть, несмотря на широкое дорожное полотно
Несмотря на очевидные улучшения, одного добавления тротуаров в данные оказалось недостаточно для получения качественных маршрутов. Изменения должны были затронуть и пешеходные переходы. Старый алгоритм сам заранее «разрезал» автомобильные дороги зебрами в тех местах, где стоят дорожные знаки [sign]. При этом у алгоритма была свобода немного сдвигать знаки от тех позиций, в которых они расположены в данных, если ему это нужно. Это принципиальные особенности алгоритма — без них он не мог учитывать пешеходные переходы. Отсюда возникали проблемы: алгоритм переводил через дорогу в месте «разреза», которое выбирал сам, и оно всегда отличалось от места стыка тротуара с проезжей частью в данных.

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

Лишние петли и изгибы в линиях маршрутов исчезают:
Двигайте сладеры, чтобы сравнить, насколько «ровнее» стали маршруты около пешеходных переходов. Новая версия — справа в каждой паре
А вот тот самый проблемный переход через Восход в Новосибирске — после всех изменений линия маршрута стала естественной и правильной.
Что дальше
Переход на тротуары идёт постепенно. В центрах Москвы и Санкт-Петербурга они уже появились, частично тротуары есть в Новосибирске и других городах.

Там, где тротуаров ещё нет, продолжает работать раздвижка, но уже с новыми пешеходными переходами, поэтому даже там исчезли изломы и петли, сами траектории движения пешеходов стали аккуратнее. А там, где тротуары добавлены, линия маршрута учитывает ещё и реальное расположение пешеходных зон.

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

А уже сделанные доработки позволяют получать максимально точные и реалистичные пешие маршруты, а также служат фундаментом для дальнейших улучшений.
Photo by Jacob
Photo by Kolya
Photo by Oliver
Photo by Leo
Нажимая кнопку «Комментировать», вы принимаете условие Лицензионного соглашения и даёте ООО «ДубльГИС» согласие на обработку персональных данных на условиях и в целях, определённых «Политикой конфиденциальности».