Поэтому в прошлом году мы создали сервис, который превращает информацию о движении автобусов в обычный текстовый формат, вполне доступный для любого среднестатистического телефона или смартфона. Под катом я расскажу про основные этапы разработки.
Мечта
Всё начинается с мечты. Многие (и я в том числе) хотели бы не тратить свое время на остановках, выглядывая свой любимый автобус. Особенно в 30-градусный мороз. Особенно когда два из пяти автобусов на маршруте внезапно (!!) сломались.
Как было бы хорошо в такой момент глянуть на телефоне, где едет твой автобус. Может быть, не стоит ждать, и проще проехать с пересадкой? Или, наоборот, не запрыгивать в первый попавшийся автобус, а чуть-чуть подождать, но уехать на том, который проедет как нужно. Или (высший пилотаж) спланировать выход из дома так, чтобы совсем не стоять на остановке.
План действий
Конечно, в нашем городе есть карта, по которой катаются автобусы в режиме реального времени. Но попытки открыть ее в моем (довольно стареньком) смартфоне окончились ничем — он ее не тянет. Тогда в голову пришла разумная мысль — а что, если превратить данные с карты в обычный текст? Примерно вот так:
б. Солнечный -> 1-й микрорайон
Х 537 ЕУ: КЗКТ ->— Гастроном Воскресенье
1-й микрорайон -> б. Солнечный
Х 446 КЕ: АТС №6 >—- 5-й микрорайон
на конечных
Х 442 КЕ: 1-й микрорайон конечная
Ведь всё, что нам, по сути, нужно знать — направление движения автобусов, между какими остановками каждый находится, и, пожалуй, еще пригодится госномер. Оказывается, не так уж и много информации — потянет любой телефон. Естественно, немаловажным фактором является и объем мобильного трафика — в данном случае он тоже минимален.
Таким образом, нам нужен сервис, который бы умел превращать положение автобусов на карте в текст.
Алгоритмы
Для разработки алгоритма, естественно, нам нужны исходные данные: остановки (координаты, названия) и сами маршруты (координаты всех отрезков). Были сделаны связи остановок с маршрутами, отрезков с направлениями движения и т.д. Всё положили в таблицы MySQL.
В бета-версии алгоритм был самый простой: берем геоточку, соответствующую автобусу, находим sql-запросом, к какому из отрезков маршрута она ближе всего. Далее по отрезку восстанавливаем остановки, между которыми едет автобус, и направление его движения. Идея хороша, но практика показала, что она работает только для кубических автобусов в вакууме. В реальности автобусы начинают «перепрыгивать» с одного направления на противоположное, и обратное. Связано это, как нетрудно догадаться, с реальным дорожным движением — объезды, перекрестки, развороты и тому подобное.
Спустя примерно месяц алгоритм был доработан. Мы заметили, что gps-трекеры, помимо координат, отдают еще и текущее направление движения (азимут). Грубо говоря, азимут — это угол между направлением на север и стрелкой, характеризующей расположение автобуса. Если добавить эту информацию в наш первый алгоритм, то уже получится намного лучше. Действительно, даже с учетом всех «вихляний» автобуса, его азимут не может меняться более чем на 50-60 градусов от реального направления движения. Теперь мы можем достаточно точно определять, откуда и куда едет каждый автобус.
Определение азимута автобуса:
Проверяем точность
Естественно, мы не могли не проверить точность нашего алгоритма. Вообще говоря, для идеальной проверки нам пришлось бы ездить в автобусах, и тут же смотреть на телефоне, правильно или нет определяется направление. Поэтому мы пошли несколько косвенным путем.
Предположим, что два человека через небольшой промежуток времени сделали по одному запросу на один и тот же маршрут. Очевидно, что за такой малый промежуток ни один автобус не успеет изменить направление на противоположное (исключаем те, которые стоят на конечных). Если же наш алгоритм покажет, что у какого-то из автобусов вдруг сменилось направление — значит, это ошибка вычисления.
Исходя из такой логики мы сделали скрипт, который прошелся по всем накопленным данным. Были взяты пары данных, отстоящие друг от друга не более чем на 2 минуты. На разных маршрутах таких пар получилось от трехсот до нескольких тысяч. Рассчитанная точность (число ошибок / общее число пар) получилась довольно хорошая — 94-98%. Как видно, алгоритм иногда всё-таки сбоит, но для текущего уровня вполне достаточно. К тому же мы рекомендуем пользователям делать по 2-3 запроса, чтобы исключить такие аномалии.
Интерфейс
В плане интерфейса рекомендации довольно типовые. Спустя какое-то время, мы перевели всё на twitter botstrap, чтобы было читабельно на любых устройствах — от самых простых телефонов до мощных планшетов.
Номер маршрута вбивается прямо в адресную строку, либо можно выбрать ссылку на странице, где указаны все маршруты подряд (кому-то удобнее так). На самой странице только кнопки обновления. Ничего лишнего.
Интерфейс (просмотр на десктопе):
Кроме того, функционирует ICQ-бот, который выдает аналогичные ответы. Достаточно отправить ему номер интересующего маршрута.
Статистика
В настоящее время посещаемость сервиса 100-150 человек в сутки, каждый из которых делает 6-8 запросов. Возможно, кому-то эти цифры покажутся невелики, но достигнуты они безо всяких вложений на рекламу. К тому же, многие моменты всё еще требуют «доводки напильником», чтобы сервис был максимально полезен людям. На первое место мы ставим качество, а не посещаемость.
План развития
О самом вкусном напоследок…
Сейчас «мобильные автобусы» легли в основу диплома, который делает у нас один из студентов. Суть диплома довольно интересна: по информации о движении автобусов вычислять возникающие в городе пробки, а исходя из пробок — давать рекомендации, на каком из маршрутов лучше всего добираться из точки А в точку Б. Мне кажется, в нынешнее время это крайне актуально, причем не только пассажирам, но и автомобилистам, и всем тем, кто сильно зависит от дорожной обстановки (такси, развозка продуктов питания, служебный транспорт и т.д.). Ближе к маю посмотрим, что у нас получится — постараемся отписаться на хабре.
Утренние пробки в Кургане (данные 14 февраля):
Ну и, разумеется, мы открыты для обсуждения, если вы хотите внедрить что-то подобное в своем городе. Хватит уже тратить свое время на остановках, давайте лучше тратить его на что-нибудь более полезное! 🙂
P.S. Часто задаваемый вопрос
— Почему бы не сделать андроид-приложение?
— Сделать приложение — можно, но это вторично. Основная задача, которую мы решаем: научиться преобразовывать геоданные в текстовый формат. Как только мы научимся так делать, формат вывода информация уже станет делом техники. Можно через браузер, можно через бота ICQ, можно через джаббер, можно через приложение…
ссылка на оригинал статьи http://habrahabr.ru/post/171409/
Добавить комментарий