Значки в 2гис что значат
Информационная карточка
Щелчок по любому объекту карты открывает информационную карточку. Карточки могут быть разными в зависимости от выбранного объекта: здание, улица, район, остановочный пункт, место на карте, достопримечательности.
Здание
Информационная карточка здания состоит из двух основных закладок:
Улица
В информационной карточке отображается название улицы. При использовании функции Показать дома на улице программа выбирает такой масштаб, при котором будут видны все дома на выбранной улице. При этом цвет домов меняется на желтый.
Щелчок в улицу вызывает выделение всех ее участков на карте.
Район
Для выбора района щелкните в пустое место на карте. В информационной карточке отображается только название района. Границы выделенного района будут подсвечены красным цветом.
Остановочный пункт (платформа)
В информационной карточке отображается название остановки и ссылки для показа маршрутов городского общественного транспорта, проходящих через данный остановочный пункт или все остановочные пункты данной остановки (см. раздел Поиск проезда).
При выборе конкретного остановочного пункта можно узнать, какой именно вид городского общественного транспорта проходит через него. Для этого выберите Маршруты этого остановочного пункта. В справочнике программы будут отражены маршруты и тип транспорта, останавливающегося на данной платформе.
Чтобы посмотреть все маршруты выбранной остановки, щелкните по ссылке Маршруты этой остановки. В справочнике программы будет отображен весь транспорт, проходящий по остановочным пунктам с этим названием, то есть список всех маршрутов выбранной остановки: автобусы, трамваи, троллейбусы, маршрутные такси, метро.
На примере отмечена одна остановка, состоящая из 5 остановочных пунктов. Эти пункты имеют одно и то же название остановки.
Работа с информационными карточками
Информационную карточку на карте можно перемещать и менять ее размер для оптимального отображения на карте.
Можно открыть одновременно несколько информационных карточек. Для этого необходимо щелкнуть по значку «Закрепить» . Закрепленные таким образом карточки сохранятся открытыми при щелчке на новый объект.
Графика и типографика нового 2ГИС
Не так давно мы представили новый 2ГИС — возможно, вы смотрели трансляцию с пресс-конференции или читали наш пост здесь. Много было рассказано о новых функциях, но почти ничего — об изменившемся дизайне. Настало время ликвидировать этот пробел.
2ГИС состоит из двух равнозначных частей. Первая — трёхмерные карты городов. Вторая — справочники фирм, мест, транспорта, стремительно обрастающие данными.
Работая над новым 2ГИС, мы искали не только удобные и эргономичные интерфейсные решения, но и уникальный графический язык карты и справочника: запоминающийся, комфортный и цельный. Мы хотим рассказать вам про ключевые элементы графики новой версии.
За полтора года дизайн карты 2ГИС прошёл долгий путь — появились новые цвета, трёхмерные здания и 3D-модели достопримечательностей. В новой версии нам нужно было обратить внимание на данные, показанные на карте. А особенно на маркеры организаций — важные идентификаторы в картографических сервисах. У каждого из них свой, запоминающийся маркер, являющийся своего рода визитной карточкой.
Тут есть нюанс — найти уникальную графику во множестве, плотно занятом интересными решениями, довольно сложно.
Кроме этого, мы предъявляли ещё одно требование к форме маркера. Нам была важна преемственность формы в карточке, которая открывается при клике по этому маркеру. Эксперименты продолжились.
Экспериментируя с множеством форм, мы нашли решение, которое дальше помогло нам в выборе пластики ключевых элементов дизайна нового 2ГИС.
Следующим шагом был поиск темперамента справочника.
Справочник — это большое количество текста. Поэтому шрифт справочника — один из основных идентификаторов, работающих на узнаваемость и характер справочника.
Мы приступили к сбору требований, понимая, что шрифт должен соответствовать высокому ритму использования продуктов 2ГИС. Поэтому нужно ориентироваться на хорошую распознаваемость знаков, быстрое чтение и экономию экранного пространства, ведь шрифт будет работать в длинных названиях объектов справочника, в панельке шириной в ⅓ экрана.
Требование ёмкости строки в длинных названиях нас быстро вывело к суженным, конденсным шрифтам.
На стороне пользователя на сайтах и сервисах с кастомными шрифтами существует задержка при открытии страницы. Мы хотели её контролировать и добиться быстрого отклика у пользователей. Поэтому количество шрифта на странице необходимо было дозировать. А это значит, что выбранному шрифту будут аккомпанировать шрифты из стандартного системного набора, которые точно показываются быстро. В качестве системных мы выбрали Helvetica и Arial. Такой выбор накладывал ограничение на конструкцию знаков нашего кандидата. Это должен быть закрытый гротеск. Так сформировалось итоговое множество шрифтов — закрытые конденсные гротески:
Поскольку 2ГИС преимущественно русскоязычный сервис, мы пригляделись к шрифтам с кириллицей.
Всё это время мы параллельно работали над освежением бренда 2ГИС и заметили на шрифтовом рынке студию, разрабатывающую шрифт с близкими нам формами.
Swiss Typefaces — швейцарская словолитня, возглавляемая Йаном Пати, работала над шрифтовой семьёй Suisse. Графика этого шрифта была нам близка. Несмотря на то, что в их публикациях на тот момент не фигурировал конденсный шрифт, мы связались со студией. Вселенная нас подслушивала, оказалось, что Йан работает над конденсом к своему Suisse BP Int’l и заинтересован в пополнении шрифтовой семьи кириллицей. Мы договорились о сотрудничестве.
Студия, совместно с Алексеем Ваняшиным, разработала кириллицу и подготовила кастомное начертание с нужной нам шириной штриха.
Итогом сотрудничества стала замечательная пара Suisse BP Int’l Condensed и Condensed Bold.
В этом шрифте авторам удалось сделать комплименты традиционной Helvetica и освежить её пластику грациозными ходами.
В Suisse строчные и прописные буквы имеют меньшее скругление, что помогает задать ритм заголовкам и немного поджать трекинг без появления чёрных пятен в словах. В строчных символах входы плеч и полуовалов в вертикальные штрихи более контрастны, что тоже сказывается на ритме чтения и различимости знаков. Ширина штриха настраивалась индивидуально под использование в справочнике.
2ГИС — универсальный справочник, но мы стараемся сделать так, чтобы пользователь любого города чувствовал себя привычно. Например, карты для некоторых городов настраиваются индивидуально. Мы пошли дальше и решили разработать систему графических идентификаторов городов. Казалось бы, что может быть проще — перерисовал все гербы и вставил в интерфейс. Ох, нет же: отсутствие универсальных правил и чистых решений в геральдике городов сильно затрудняло нам задачу. Поэтому в основу идентификаторов легли самые внятные образы городских геральдик или ключевые архитектурные, культурные, промышленные объекты.
12 функций 2ГИС, о которых вы могли не знать
Функция доступна пока только в мобильном приложении.
Теперь все события на дорогах показывают на карте. Есть постоянные камеры контроля скорости, официальные перекрытия, а ещё сообщения от пользователей о ДТП, перекрытых дорогах, пробках, внезапной камере, экипаже ДПС. Фишка: к сообщениям можно добавлять фото — получается более информативно.
Сообщения могут добавлять авторизованные пользователи, анонимные и сам 2ГИС, а добавлять фото только авторизованные и 2ГИС. Остальные могут подтверждать и опровергать информацию, писать заметки типа «куплю машину ближе к началу пробки», лайкать и дизлайкать.
Ключевые функции 2ГИС: найти что-то и выбрать. Рано или поздно мы сталкиваемся с ситуацией, когда нужно сравнить несколько мест и найти, где отметить день рождения, где взять самый дешёвый паркет или купить редкую запчасть. Можно, конечно, записывать каждое найденное место на листочек или вести заметки в телефоне, но удобнее собрать нужные компании в подборку сразу в приложении.
Теперь в «Избранном» в 2ГИС можно создать подборку с комментариями, а когда она перестанет быть нужной, удалить всю разом. Чтобы не путаться, в каждой карточке компании в «Избранном» указано, в какие подборки она уже добавлена. Логиниться для составления подборки не нужно.
Обычный алгоритм заказа такси в незнакомое место выглядит так: «найти адрес на карте— закрыть приложение — открыть приложение такси — не забыть адрес и вписать его —заказать». Может, мы — снобы, но даже такие действия занимают много времени.
В 2ГИС, когда вы прокладываете маршрут, сразу показывают стоимость поездки на такси (в Хабаровске пока только «Максим») и предлагают перейти в приложение диспетчерской службы для заказа. Поля при этом заполняются автоматически. Ждём, когда появится больше таксопарков, чтобы можно было сравнивать цены и выбирать оптимальный вариант.
Иногда на заправку мы заезжаем не только за бензином, но и забежать в туалет, купить по пути кофе и пропылесосить салон. На каждой станции при этом есть не всё, часть из них вообще подразумевает только самообслуживание.
Чтобы не держать всё в голове, в поисковой выдаче по запросу «Заправочные станции» теперь можно посмотреть, где какой бензин льют, есть ли на заправке магазин, заправщик, подкачка колёс, кафе и туалет. При этом необязательно кликать на каждую, часть информации показывают прямо в списке.
Поисковая выдача подстраивается под ваш запрос. Например, если будете искать банкоматы, в списке сразу покажут, какие из них принимают наличные, гостиницы — количество звёзд и стоимость номеров.
Бывает ещё, что вы помните, что в конкретном доме была фирма, но название в голову не приходит. Раньше приходилось листать список организаций, в котором не было ни сортировки по алфавиту, ни фильтрации. Летом 2ГИС запустил в онлайн-версии поиск по организациям в здании. Теперь найти что-то в бизнес-центре или ТЦ стало проще. Кликаете на «Организации в здании», открывается список компаний и появляется строка «Найти в здании». Можно искать по названию («Лупоглаз» в «Макси Молл»), ключевому слову или рубрике («Поесть» в ТЦ «На Пушкина»).
Ещё одна фича, которая поможет найти нужное место даже, если вы не знаете точное название или вам важно, чтобы оно отвечало ряду требований.
Поисковый запрос можно детализировать. Нажмите на строку поиска, выберите нужную категорию: «Поесть», «Аптеки», «Продукты» и т. д. В правом верхнем углу появится кнопка «Фильтры» с иконкой с бегунками.
В зависимости от категории вы получите список возможных критериев и легко найдёте:
Удобными планами этажей многие большие здания и торговые центры до сих пор не обзавелись, поэтому туалеты, банкоматы, конкретные офисы и магазины приходится искать методом проб и ошибок и путём вытягивания информации из охранников.
В 2ГИС работает специальный сервис «Этажи». На каждом этаже торговых центров обозначены магазины, кафе, банкоматы, лифты и другие инфраструктурные объекты. Это заметно упрощает навигацию и выглядит круто. Сейчас эта функция работает у «Магазинов Радости», «НК Сити», «Южного парка», «Дома быта», «Макси Молла», «На Пушкина» и «Дома Одежды».
Ещё одно нововведение года. В правом верхнем углу карты теперь отображается кружок с цифрой — это оценка состояния на дорогах города. Программа анализирует ситуацию и выставляет балл от 1 до 5, больше пробок — больше цифра.
Если нажмёте на эту кнопку, на дорогах появятся цвета, означающие скорость движения транспортного потока: красный — всё плохо, жёлтый — движется, но медленно, зелёный — можно свободно ехать. Работает эта функция только с подключением к интернету.
Предыдущий пункт будет полезен и водителям, и пешеходам, и тем, кто едет на такси. В 2ГИС данные о пробках также помогают навигатору. Он рекомендует оптимальный маршрут с наименьшим количеством заторов.
Навигатор работает в приложении, настраивается: можно включить голосовые команды, активировать ночной режим и сделать так, чтобы он не загонял вас на дорогу с гравием. Навигатор также показывает шлагбаумы во дворах, поэтому вы не заедете в тупик.
Разные версии для разных устройств
Для чего вы используете 2ГИС? Кому-то нужно по работе обзвонить все компании, производящие печати, другому — забронировать стол в ресторане на вечер, третьему — не заблудиться в городе.
У справочника на разных платформах может отличаться функционал, например, в программе и онлайн-версии есть линейка, которая покажет расстояние между двумя произвольными точками на карте, и отмечены места с панорамами. Приложение интегрировано с другими сервисами, например, такси. В каждой конкретной ситуации удобно пользоваться ПК, браузерной версией или приложением.
В последнее время люди больше сидят в интернете с телефонов, поэтому мобильная версия справочника развивается быстрее остальных.
Допустим, вы знаете адрес заведения или нужного офиса, но место находится в большом здании с несколькими подъездами. В какой конкретно ломиться, к какому ближе парковаться, — непонятно.
В справочнике можно найти нужный вход в практически любую организацию. Введите в поиске её название, перейдите на страничку компании, а затем жмите на кнопку «Вход» (она находится на панели под режимом работы) — стрелка на карте покажет расположение нужной вам двери.
Эта штука в Хабаровске ещё совсем новая, и не все компании готовы её активно использовать, но в 2ГИС верят, что это временное явление.
Работают сообщения так. Допустим, вам нужно узнать цену на один и тот же товар в разных магазинах, а зависать на телефоне, слушая роботов-автоответчиков, нет желания и времени. Вы можете выбрать нужную компанию, нажать на иконку «Сообщения» на карточке — откроется чат, дальше задавайте нужные вопросы — получайте ответы.
Пока компании отвечают не так быстро, потому что ещё не привыкли к новинке. Функционал мессенджера работает в онлайн-версии и мобильном приложении.
Знаки свыше: как мы избавили картографов от лишней работы и красных глаз
2ГИС гордится точностью данных. Каждый рабочий день в каждом городе наши специалисты обходят целые районы, чтобы зафиксировать на карте все изменения — новые дома, дороги и даже тропинки. А ещё они собирают и наносят на неё дорожные знаки, помогая правильно строить автомобильные и пешие маршруты. В этой статье я расскажу, как мы решили помочь картографам и начали собирать дорожные знаки автоматически.
Что такое Fiji и зачем в нём знаки
Fiji — картографический редактор, который мы разрабатываем для наших ГИС-специалистов. Это классическое клиент-серверное приложение. На хабре уже есть несколько статей, в которых мы рассказываем про Fiji:
Как собирали знаки раньше
В Fiji есть специальный режим работы для сбора и актуализации знаков. В этом режиме картограф может открыть видео, записанное видеорегистратором. В отдельном окне отображается само видео, а на карте отображается его трек. Маркером показана текущая позиция.
Поверх видео нанесена сетка — она позволяет определять расстояние до знака. Как только знак становится размером с ячейку, картограф делает паузу и создаёт знак. Мы в этот момент знаем текущую позицию и расстояние до знака, поэтому сдвигаем его вперёд и притягиваем к звену. Звено в нашей терминологии — это схематичное изображение участка дороги. У каждого знака есть свой числовой код, его картограф вносит в специальное поле.
Если же знак у нас уже внесён, то мы подгружаем его в редактор знаков. Картограф сверяется с видео и, если нужно, вносит изменения с помощью тех же самых числовых кодов. Либо, если знак правильный, отмечает его как актуализированный.
Конечно же, такой способ требует от картографа просмотреть каждое видео — а потом ещё и потратить время на внесение каждого знака. К тому же, позиция знака на карте определяется неточно: мы просто отступаем от текущей позиции на расстояние, которое определяется сеткой, а потом притягиваем получившуюся точку к ближайшей дороге. В результате знаки могут создаваться не совсем там (или даже совсем не там), где надо. А значит, картограф должен его ещё и переместить в правильное место, что тоже расходует его время. Вдобавок, на видео может вообще не быть знаков, но картограф всё равно вынужден его просмотреть. Конечно, программа позволяет увеличивать скорость видео, но временные затраты в любом случае будут больше нуля. Поэтому мы решили этот процесс автоматизировать.
Как собираем теперь
Нам по-прежнему нужны видео с регистраторов. Но теперь, вместо того, чтобы отсматривать каждое, картограф просто выбирает нужные файлы и жмёт кнопку «Загрузить». После этого он может заниматься другими делами — видео обработается и на карте появятся дорожные знаки. Разные сомнительные случаи будут специально отмечены. Поэтому всё, что остаётся картографу — пройтись по этим случаям и исправить их.
Архитектура
Для того, чтобы получить из видео объекты нужных классов с нужными атрибутами, мы написали несколько сервисов.
Первым идёт VideoPreprocessingService — именно туда загружается видеофайл. Сервис отправляет файл в хранилище, делает об этом запись себе в БД и создаёт задачи на его обработку. Нужно вырезать из видео кадры с определённой частотой, подобрать для них GPS-точки из трека, отправить результат работы на Frames Processing service.
Первые две задачи выполняет не сам сервис, а Worker. Сделано это для того, чтобы можно было легко менять количество этих самых воркеров. Увеличивая тем самым производительность, если есть такая потребность.
FrameProcessingService сохраняет себе все полученные кадры и точки. А ещё он выгружает кадры в очередь. Её читает сервис, который написали наши коллеги — специалисты по Machine Learning. Он распознаёт дорожные знаки. Само собой, FrameProcessingService читает и ответы от этого сервиса — это коды знаков, если они есть на кадре, и прямоугольники, в которые вписан этот знак. Зная размер прямоугольника, мы понимаем расстояние до знака. А когда все кадры из видео обработались — он отправляет их на наш карт-сервер.
Карт-сервер — самая важная часть системы. От него клиенты получают все данные, которые у нас хранятся (кроме тайлов). Он же эти данные сохраняет и выполняет всю бизнес-логику.
Общее описание
Наши картографические данные — это геообъекты. Геообъект — это геометрия (то есть расположение объекта в пространстве) и набор атрибутов. Их мы храним в БД и ими оперируем. Но от FrameProcessingService мы получаем только код знака, координаты точки, из которой распознали знак, сам кадр и маску знака на этом кадре. А значит нам нужно превратить этот набор данных в геообъект. Каждый геообъект принадлежит к какому-то классу. Каждый вид дорожных знаков — это отдельный класс. Его мы без проблем можем получить из кода знака. Ещё из кода знака мы можем получить специфичные для этого класса атрибуты. Например нам пришёл код 3_24_60. 3_24 — говорит, что это ограничение скорости (знак 3.24 в ПДД). Для этих знаков должно быть указано значение ограничения. Его нам сообщает третья часть кода — здесь это будет 60 км/ч.
Итак, класс геообъекта определён, специфичные для него атрибуты тоже. Казалось бы, уже можно создать геообъект. Но пока ещё рано. Во-первых, каждый знак имеет атрибут «Направление», который говорит, в каком направлении действует знак. Во-вторых, у нас всё ещё нет геометрии для этого геообъекта. У нас есть точка, из которой мы знак увидели. А значит, сам знак находится на каком-то удалении от нас. Кроме того, его геометрия влияет на значение атрибута «Направление».
Здесь сделаем небольшое отступление. Конечно же, у нас есть дорожная сеть. Она состоит из отдельных звеньев. Каждое звено — это линия. На первой части рисунка у нас как раз нарисовано два звена. Стрелками показано направление, в котором они были отрисованы, т.е. левое рисовали снизу вверх, а правое — сверху вниз.
Каждое звено несёт информацию о том, в каком направлении по нему можно двигаться. Направление движения — это отдельный атрибут, оно не равно направлению отрисовки. Этот атрибут говорит нам о том, в каком направлении можно двигаться по звену, относительно направления отрисовки. На второй части рисунка оба звена имеют одинаковое значение этого атрибута, а на третьем рисунке — противоположные значения.
Как это связано со знаками? Итак, мы двигаемся по звеньям снизу вверх, и видим какой-то знак. Так вот, на левом звене знак будет иметь направление «Только прямо», на правом — «Только обратно», т.е. такие же, как и звенья на третьем рисунке. Здесь всё получилось просто, но это потому, что звенья у нас односторонние. В реальности же очень большое количество звеньев являются двусторонними, т.е. их направление имеет значение «В обе стороны». А знак всегда направлен в какую-то одну сторону, и нам нужно понимать — в какую.
Map matching
Прежде чем начать расставлять знаки на карте, нам нужно понять, по каким дорогам мы вообще проехали, когда записывали видео. Данных GPS для этого недостаточно: он часто ошибается на десятки метров. К тому же карты — это всё-таки схемы и тоже могут не совпадать с реальной местностью. Например, на широких многополосных дорогах.
Это позволит решить сразу ряд проблем:
Алгоритм
Сам алгоритм, который мы использовали, довольно простой. На Хабре уже есть статья с его описанием. В общих чертах он звучит так: у нас есть выбранная дорога, берём ближайшую к её концу GPS-точку из трека. И относительно этой точки оцениваем дороги, стыкующиеся с нашей — то есть оцениваем, насколько вероятно, что наша точка относится именно к этой дороге. Каждая дорога получает очки, выбирается та, у которой очков больше. Повторяем до тех пор, пока трек не кончится.
В процессе работы мы внесли в алгоритм несколько дополнений. Алгоритм никак не учитывал направления на дорожных звеньях, поэтому первое, что мы сделали — начали их учитывать: теперь, если звено одностороннее, мы понимаем, с каким направлением мы должны по нему двигаться. И если это направление не совпадает с направлением звена — мы это звено отбрасываем.
Изначально нам казалось, что этого будет достаточно, и первые тесты это подтверждали. Но потом мы начали проверять видео, записанные в жилых кварталах, и всё оказалось не так радужно. Дело в том, что у нас очень высокая точность данных, в том числе и по дорогам. Соответственно, у нас отрисованы все внутриквартальные проезды, вплоть до мельчайших деталей. С другой стороны — как я уже говорил, GPS может быть не очень точным или даже очень неточным. А если ехать по дороге, вокруг которой высокие здания, то точки в треке могут уехать довольно сильно. Бывало, что точки съезжали в сторону более чем на 20 метров. В результате получается, что многие точки находятся близко к тем дорогам, по которым мы не ехали. Итогом усадки таких треков была вот такая картина:
Здравый смысл подсказал нам, что на таких дорогах знаков мало, а потому собирать их там особого смысла нет. Следовательно, скорее всего, в большинстве случаев автомобиль двигался по основным улицам. Поэтому для внутриквартальных проездов мы ввели штраф. Под штрафом мы понимаем уменьшение количества очков у дороги. В итоге проблема с внутриквартальными проездами была решена — они не выбирались, когда мы по ним не ехали, а когда по ним реально ехали, то даже несмотря на штраф, они оказываются наилучшим вариантом и тогда мы их выбираем.
После этого результаты стали уже совсем хороши. И нам казалось, что с мапматчингом покончено. Но беда пришла, откуда не ждали. Совершенно внезапно оказалось, что есть случаи, когда от дороги ответвляется другая дорога, причём делает это очень плавно. А усугубилось всё тем, что ответвившаяся дорога может ещё и идти параллельно с нашей, по крайней мере, какое-то время. При этом, напоминаю, GPS-трек практически никогда не находится поверх звеньев, по которым мы ехали, он немного смещён в какую-то сторону от него. Ну и конечно же, благодаря этому всему, алгоритм стал цеплять эти ответвления. Из-за чего в лучшем случае мы получали несколько звеньев, по которым на самом деле не ехали. А в худшем — усаживали трек совсем неправильно.
Поэтому мы придумали делать дополнительную оценку дороги. Берём предыдущую и следующую точки GPS-трека относительно точки, из которой мы выбрали звено. И смотрим, чтобы азимут в этих точках не слишком сильно отличался от азимута движения по этому звену. Если же отличается сильно — штрафуем это звено.
В итоге получили результат, который нас устраивает, хотя иногда по-прежнему встречаются мелкие ошибки (иногда может быть выбрано лишнее звено, по которому мы не ехали). Но они довольно редки, а потому не критичны для нас.
Расстановка знаков
Теперь мы имеем набор дорожных звеньев, по которым мы проехали, и набор кадров со знаками. А также информацию о том, какой знак на этом кадре, из какой точки трека получен этот кадр и маска знака (прямоугольник, описывающий знак на этом кадре). А значит можно расставить эти знаки на карте.
Первым делом надо получить дополнительную информацию, которая нам поможет поставить знак в нужное место:
Поэтому, прежде чем двигаться дальше, надо убедиться, что мы не ошиблись. Либо, если ошиблись, заменить дорогу на верную и получить проекцию на неё. Для этого возьмём дороги, которые соединяются с нашей дорогой и оценим их по расстоянию и азимуту. В результате получим дорогу, которая лучше всего подходит для данной точки и построим проекцию на неё.
Теперь, когда наша GPS-точка притянута к дороге, можно вычислить местоположение знака относительно неё. Для этого строим вектор из этой точки длиной равной расстоянию до знака в направлении совпадающим с азимутом знака. После этого пробуем притянуть знак к одной из дорог, на которые был усажен наш трек. При этом учитываем направления дорог и направление знака, которое вычисляем для каждой дороги через азимут знака.
На этом этапе может получится так, подходящей дороги не нашлось. Например из-за того, что знак будет иметь направление, которое на данных дорогах недопустимо (т.е. они являются односторонними). В таком случае, этот знак находится на какой-то соседней дороге, по которой мы не проезжали, а значит мы просто не будем его создавать.
Теперь у нас есть координата знака, притянутого к дороге, осталось проверить, что он поставлен адекватно, ведь иногда мы можем ошибиться. Для этого проверим, что знак не слишком далеко от исходной GPS-точки, сравнив это расстояние, с расстоянием до знака, полученным через кадр, с некоторым допущением. Также проверим, что знак не оказался позади GPS-точки. Если валидации пройдены успешно — мы получили координаты знака на дороге и его направление, а значит у нашего геообъекта есть геометрия и все необходимые атрибуты. Можно переходить к его сохранению.
Мерж знаков
На самом деле, к сохранению переходить по-прежнему рано. Дело в том, что каждый знак видно с нескольких кадров, за исключением каких-то особенных случаев, когда на части кадров знак оказывается скрыт за каким-либо препятствием, например за грузовиком.
С каждого из этих кадров мы получили геообъект для знака, у них одинаковые атрибуты и они расположены примерно в одной точке. Это значит, что нам нужно оставить только один из них. Кроме того, если этот знак не новый, то он уже у нас есть в БД, а значит нужно пометить его, что он актуализирован, а не создавать новый геообъект.
Для этого мы выполняем мерж новых геообъектов между собой и с существующими.
Первым делом мы получаем все знаки, которые у нас уже созданы, на звеньях, по которым мы проехали. К ним добавляем все знаки, которые мы нараспознавали с кадров.
Что нам требуется с ними сделать: нужно понять по их классам, атрибутам и геометриям, что какой-то набор этих геообъектов — это один и тот же знак. Если в этом наборе есть уже существующий геообъект — оставить только его и отметить, что он был актуализирован. Если в наборе только новые геообъекты — оставить только один из них.
Делаем мы это в четыре шага:
Конечно же, может получится так, что у нас есть какой-то знак, а с видео мы его не распознали. В таком случае этот знак не будет актуализирован. К сожалению, мы не можем быть уверены, что на местности этого знака тоже больше нет, т.к. он мог быть просто закрыт каким-то препятствием во время записи видео. Поэтому мы не удаляем этот знак сразу же, а помечаем его как отсутствующий на видео. Если этот знак будет виден на каком-то другом видео, то мы просто уберём с него эту метку и актуализируем. Если же он так и не окажется виден — картограф должен будет разобраться с этим знаком. И удалить его, если его действительно больше нет.
Ближайшие планы
Знаки с боковых дорог
На видео попадают знаки не только с тех дорог, по которым мы едем, но и с боковых дорог: это могут быть дороги, которые пересекают нашу, или которые примыкают к нашей. Или наоборот — дороги, которые ответвляются от нашей. Это даже могут быть дороги, которые находятся параллельно с нашей. Отличать знаки, которые стоят на этих дорогах, от знаков, которые нам нужны, очень трудно. Ведь часто они находятся близко к нашей дороге.
Для решения проблемы планируем использовать ряд семантических правил при постановке знака на звено. Например, ограничение скорости 5км/ч вряд ли будет стоят на магистрали, зато очень вероятно оно будет стоять на въезде на АЗС.
Трекинг знаков
Иногда мы недомерживаем знаки, а иногда наоборот — мержим знаки, которые мержить не надо. Поэтому планируем сделать трекинг знаков по кадрам — чтобы узнавать один и тот же знак на разных кадрах ещё до того, как мы превратим их в геообъекты. И использовать это знание при мерже.
Заключение
Текущая версия — это, по сути, бета. Поэтому она неидеальна. Есть проблемы, которые мы собираемся решать в ближайшее время. Есть проблемы, которые пока непонятно как решить. А есть такие, которые вообще вряд ли получится решить с помощью алгоритмов. Например, GPS-треки могут быть очень плохого качества. Или видео, где изображение и трек рассинхронизированы — и это можно понять, только посмотрев его. В общем, задача оказалась гораздо сложнее, чем мы изначально рассчитывали.
Перед нами огромное поле для решения различных проблем. А значит, будем решать. Ну и конечно, рассказывать, если наткнёмся на что-то интересное.