Как сделать карту для автобуса

Добавил пользователь Владимир З.
Обновлено: 05.10.2024


Осенью 2014 года появилась радостная новость о том, что в Воронеже заработал Яндекс.Транспорт, который показывает движение автобусов и троллейбусов. Было очень круто прямо на остановке открыть расписание и узнать, что ваш автобус подойдет через 5 минут.

Новый сервис водители использовали, чтобы следить друг за другом по карте, обгоняя и подрезая конкурентов на дороге. У некоторых начала падать выручка, они стали жаловаться владельцам маршрутов, а те пошли к людям, продающим оборудование с ГЛОНАСС и GPS и отправляющим данные о перемещениях машин в Яндекс. По просьбам хозяев автопарков они информацию отправлять перестали, и автобусы сразу начали исчезать с карты. Сейчас их стало чуть побольше, но это все равно гораздо меньше, чем на самом деле.


Для тех, кому лень читать дальше, предлагаю видео доклада на эту тему:

Для остальных — опишу проект в виде текста.

Где взять данные?

При этом в в Воронеже есть место, где собираются все данные — Центр Организации Дорожного Движения (ЦОДД). У них на сайте есть большое и тяжелое веб-приложение с неотлаженным JavaScript и прочими артефактами, при этом все в нем идет POST-запросами и ничего не кешируется. С помощью самого этого сайта можно запросто положить сервис, который собирает данные о передвижении автобусов.

Там имелась опция, позволяющая ткнуть на карту и узнать, когда придет автобус и каким он будет. При условии, что вы приблизительно попадаете в остановку (± 50 метров). В меню можно было открыть список маршрутов и посмотреть, где именно ездят автобусы, но там была проблема — ездили они странно. Например, по Кольцовской, улице в центре, где особенно не разгонишься, автобус перемещался вперёд и назад со скоростью примерно 200 км/ч.

Почему Python?

Я выбрал Python потому что он классный, батарейки в комплекте, и т. д. А 3.6 потому, что здесь есть форматирование строковых литералов, typing, вот это всё. Давайте посмотрим на то, что я в принципе использовал:

  • Многие жаловались, что вбить точное название остановки со всякими знаками препинания очень тяжело. Тогда я реализовал возможность нечеткого поиска и создал для него первый юнит-тест.
  • Вся система хостится на Heroku. Бесплатно, поскольку у меня нет базы данных — я надеюсь обойтись базой ЦОДДа. О ее использовании я договорился с Центром, когда понял, что данных, которые я забираю через веб-интерфейс, недостаточно.
  • Собственно, хостинг идет через веб-сервер Tornado. Думаю, он знаком каждому, кто сталкивался с веб-запросами в Python.
  • Пакет Pytz понадобился мне, потому что сервер Heroku находится в другом часовом поясе, а данные ко мне поступают без указания временной зоны. Поэтому я сам позаботился о локализации.
  • Для создания бота я использовал рекомендованную библиотеку Python-telegram-bot. Документация здесь вполне адекватная, и вообще библиотека соответствует требованиям minimum viable product. Изначально весь проект представлял собой Telegram-бота, который в ответ на отправку вашего местоположения присылал расписание автобусов.
  • Firebird, бывший Interbase — Open source база данных, с которой, полагаю, многие из вас работали. Конечно, она не такая крутая, как тот же самый PostgreSQL, но для очень большого количества запросов ее достаточно. В нашем случае большего не нужно.
  • Caсhetools — очень простой модуль, который позволяет кешировать вычисления. Речь тут, конечно, не о memecached или кешировании веб-страниц, а о тех случаях, когда вам нужна мемоизация на долгие запросы. Просто берете, добавляете соответствующий декоратор — и всё работает. Кеш имеет разные варианты, я использую TTL-версию, который сохраняет данные на указанное время, потому что я знаю, что данные не будут обновляться чаще, чем через определённые промежутки времени (в моём случае — 30 секунд).

Функционал бота

  • /nextbus имя остановки — ожидаемое время прибытия;
  • /last номера маршрутов через пробел — последние остановки;
  • Отправка местоположения — ожидаемое время прибытия для ближайших трех остановок;
  • Свободный ввод — номера маршрутов и расстояние до автобусов (при отправке местоположения).

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

Функционал сайта

Bеб-сайт я сделал настолько минималистичным, насколько это в принципе возможно. Из сторонних библиотек использовал всего две, для поддержки fetch и promise, потому что старые версии предустановленных браузеров в телефонах не умеют обходиться без них. Если не поддержать эти методы, получится достаточно тяжелая лапша из коллбеков для самих запросов. С fetch все выглядит изящнее.


Собственно, функционал здесь состоит из 4 пунктов:

  1. Прибытие. Можно просто посмотреть остановку. Нажав на кнопку (ее, кстати, может быть, стоит сделать побольше — я подумаю!), вы отправляете свое местоположение, система ищет три ближайшие к вам остановки и показывает информацию по ним. Можно ввести название остановки и получить информацию по ней. Поскольку вам вряд ли нужны все 20–30 автобусов, которые могут приехать к остановке, вы можете отфильтровать их по маршрутам.
  2. Автобусы. На второй странице собрана информация по автобусам. Это связано еще с одной историей, подтолкнувшей меня к этому проекту. В один прекрасный день я забыл в автобусе шапку, позвонил в диспетчерскую, объяснил, где это случилось. Диспетчер предложил мне ловить свой автобус в центре, куда он вернется, развернувшись на конечной. Я вспомнил, что у меня есть логин и пароль от системы Центра организации дорожного движения, но оказалось, что отследить местоположение нужной мне машины я через веб-интерфейс все равно не могу. Шапку я вернул, но с большим трудом.
    Я подумал, что поиск автобуса мог бы быть гораздо проще. Написал номер маршрута, а система показывает тебе машины на линии, их текущее местоположение и время, когда они проходили остановки по пути. И даже если вы знаете номер маршрута, но вы знаете номер автобуса (такое тоже бывает), вы все равно сможете его найти.
  3. Карта. Карта на сайте без анимации. Здесь можно выбирать автобусы из списка или вводить номера вручную, можно их отфильтровать. На карте могут быть показаны до 600 автобусов, хотя уже после 20 найти что-то в центре становится сложно, просто потому, что маршруты все сконцентрированы здесь. Поэтому лучше ограничивать поиск параметрами более жестко.
  4. О проекте. Сейчас у проекта есть сайт, есть Telegram-бот, группы в соцсетях.

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

Разумеется, такие сервисы можно делать и для других городов, более того, в некоторых они уже работают. Многое зависит от местного ЦОДД, кое-где, например, в Санкт-Петербурге есть даже API для разработчиков. Но самое главное — горожане, которые хотят менять свой город к лучшему.

В выходные ездил в СПб, кататся на музейных трамваях и смотреть советскую архитектуру. Карту трамвайных маршрутов я уже помню наизусть, а троллейбусных - ещё нет. Оказалось, что несмотря на развитие современной компьютерной техники и телекоммуникаций нигде нет карты троллейбусных маршрутов пригодной для печати. Я расстроился, и решил нарисовать её сам. Эта картинка занимает всю площадь листа А4, и на ней остаются видны все надписи.

Карта маршрутов Санкт-Петербургского троллейбуса

  • Для подложки можно использовать векторные данные (OSM, vmap0), включать, выключать и перекрашивать слои.
  • Легче использовать растровую подложку с Openstreetmap - не надо вручную её выкачивать и привязывать (но для печати она мало годится, потому что у неё фиксированы масштабы)
  • Работа ведётся не с линиями и точками, а с улицами и конечными, то есть географическими обьектами.
  • Можно точно масштабировать и двигать.
  • Промежуточные наработки (например координаты конечных) сохраняются в переносимом формате (если у вас не упадёт кодировка), и могут быть использованы в других картах.
  • Коллизии надписей считаются автоматически
  • Можно экспортировать в svg вместе с подосновой. Правда пока ещё не придумал зачем, но может для печати больших форматов пригодится.

1. В JOSM плагином mirrored_download выкачивается Санкт-Петербург. Тип обьекта: relation, запрос XAPI: [route=trolleybus]. В редакторе оказывается загруженным список всех релейшенов троллейбусных маршрутов. Скачиваются их участники.

7. Подписи маршрутов и конечных придётся рисовать вручную. Делаем новый линейный слой, сохраняем как шейп. Добавляем таблице данных к этому слою поле "ref", тип - string. Рисуем линии поверх улиц, заносим в ref номера маршрутов. Саму линию нужно сделать прозрачной. Включаем вывод надписей, и наблюдаем как автоматически рассчитывается перекрытие строк.
8. Для конечных станций добавляем точечный слой. К нему поля:
name (string),
ref (string),
caption (string),
posX (real, точность=5),
posY (real, точность=5),
angle (real, точность=5).
9. Добавляем все конечные станции. В name пишем названия, в ref - номера маршрутов.
10. После ввода всех конечных станций идём в калькулятор полей. Указываем: "изменить значение в поле caption", вводим выражение name || ' [' || ref || ']'
11. В настройках слоя конечных станций указываем, что смещение будет браться из полей posX и posY, и поворот из angle. Нам становятся доступными кнопки сдвига и поворота надписи. Поворот без сдвига почему-то не работает. Если после перезагрузки проекта у вас надписи улетают - значит что-то не так с разрядностью или типом данных полей.
12. Настраиваем цвета, толщину линий, размеры шрифта, смещения, и растаскиваем надписи так, что бы они не перекрывались.
13. Экспорт делается через встроенный компоновщик. Нужно заметить, что в окне редактора и после экспорта карта видна с разными масштабами, поэтому тонкую настройку и сдвиг надписей нужно постоянно проверять экспортируя карту в png,
14. В компоновщике можно добавлять картинки в формате svg - тут добавлен логотип лицензии, и пометка для 28 маршрута.

Транспортная карта Владивостока: где купить и как пополнить баланс

Все формы транспортной карты – брелок, браслет и сама карта – имеют уникальный номер. Он необходим владельцам для пополнения баланса – это можно сделать разными способами.

Максимальная сумма пополнения – 5 000 рублей. Также при оплате может быть комиссия в 1 % — это зависит от банка, картой которого вы пополняете баланс.

Транспортная карта Владивостока: где купить и как пополнить баланс

Транспортная карта Владивостока: где купить и как пополнить баланс

Способ № 2. Пополнить через банкомат

Способ № 3. Банковские мобильные приложения

Как уточнила Татьяна Бердникова, сейчас у транспортной карты есть несколько банков-партнеров, в будущем их количество планируется увеличить. Сейчас владельцы транспортной карты и одновременно клиенты Сбербанка и Примсоцбанка могут также пополнить баланс карты с помощью мобильных приложений.

Напомним, во Владивостоке стоимость проезда в общественном транспорте будет дифференцированной. Планируется, что сумма, которую внесет пассажир, будет зависеть от способа оплаты. Ожидается три цены билета: за оплату проезда наличными, банковской картой или транспортной картой (браслетом, брелоком).

Порядок пополнения транспортного приложения ЕСККК

Общее количество приобретаемых поездок в месяц не может превышать 60 поездок. Карту можно пополнить сроком до 3 месяцев. В первом месяце пополнение может быть в любом варианте от 36 до 60 поездок, а в последующие два месяца только по 36 базовых поездок. Пополнение карты при законченном текущем периоде возможно с любой будущей даты, не превышающей 10 дней с момента обращения. Неиспользованные базовые и дополнительные поездки переносятся на следующий месяц и действуют до полного их использования. Максимальное количество накопленных базовых и дополнительных поездок не может превышать по 120 поездок. При внесении суммы Вы получите чеки, выданные терминальным оборудованием и контрольно-кассовой машиной. Хранить чеки необходимо в течение срока, на который произведено пополнение транспортного приложения ЕСККК.

Порядок и стоимость пополнения СК7

Пополнение ЕСККК возможно произвести в любом почтовом отделении Управления Федеральной почтовой связи Красноярского края - филиала ФГУП "Почта России", в пределах территории муниципального образования, на которой введена ЕСККК. Порядок пополнения устанавливается постановлением Правительства Красноярского края.

Транспортная карта

Транспортная карта

Стоимость карты – 100 рублей.

Приобрести транспортную карты можно в филиалах ФГУП "Почта России", в кассах компании ООО "Телекомсервис", кассах АО "Краспригород", киосках "Лига Пресс" и киосках "Розпечать".

Для оплаты проезда карту необходимо пополнить.

Минимальная сумма пополнения карты - 350 рублей.

Максимальная сумма пополнения карты ограничена (в целях Вашей безопасности и недопущения подделки карты) и составляет 10 000 рублей. Разовое пополнение ограниченно суммой 1000 рублей.

Вместе с картой Вы получаете ПРЕИМУЩЕСТВА удобной безналичной системы оплаты проезда на общественном городском автомобильном и электрическом транспорте на территории города Красноярска:

  1. оплачивать по одной карте проезд в автобусе, троллейбусе, трамвае и городской электричке;
  2. удобно и быстро оплачивать проезд, сократив время оплаты до 3 секунд;
  3. отказаться от ношения мелочи и пересчета сдачи;

Пополнять транспортную карту можно в почтовых отделениях, в терминалах "Платежка" и в кассах компании "Телекомсервис".

ТК брелок

В обычном формате с символикой XXIX Всемирной зимней универсиады 2019 года. Стоимость карты – 300 рублей.

Читайте также: