Как устроены Яндекс.Карты. Лекция Владимира Зайцева в Яндексе
Яндекс.Карты – это высоконагруженный картографический портал, который работает с огромными объемами данных. В своей лекции Владимир Зайцев рассказывает старшеклассникам – студентам Малого ШАДа – о том, как создавать и поддерживать такие ресурсы, и о технологиях, которые для этого используются. А также на примерах объясняет, какие можно разрабатывать инструменты и проводить исследования на базе полученных данных.
Спутниковые снимки и карта
Конечно же, все начинается с карты. Представим, что мы рассказываем своему приятелю, как добраться до вашей дачи. Ну и нарисовали небольшую карту, по которой он сможет пройти от электрички до вашего дома. Он по этой доге прошел и записал GPS-трек. Если вы потом попробуете наложить этот трек на карту, ничего хорошего из этого не выйдет, они просто не будут совпадать. Как же составить такую карту, которая соответствовала бы реальному GPS-треку? Например, мы при помощи лазерного дальномера с разных точек отмерять расстояния до различных точек на местности, а при помощи компаса вычисляем азимуты. При должной аккуратности измерений, у нас уже есть некоторый шанс, что после наложения у нас получится достаточно точная карта, которая будет совпадать с GPS-треком.
Но если применять этот метод для составления более масштабных карт, процесс окажется слишком длительным и трудоемким. Поэтому сегодня для этих целей применяются более технологичные решения. Например спутниковая фотосъемка. Спутники летают над Землей на высоте 200-500 километров и делают фотоснимки при помощи вот таких объективов:
Спутник вращается вокруг Земли, а наша планета вращается вокруг своей оси, поэтому если спроецировать траекторию спутника на ее поверхность, получится синусоида. При этом траектория спутника при каждом обороте будет немного смещаться, так что через некоторое количество облетов можно будет заснять всю поверхность Земли.
Но есть две проблемы. Во-первых пролеты над какими-то территориями обязательно придутся на ночное время. А ночные спутниковые снимки представляют исключительно эстетическую ценность, для картографии они бессмысленны. Это обязательно нужно учитывать, и снимать только освещенные части, что может потребовать большего количества пролетов. Вторая проблема – это облачность. Если часть города при съемке закрывают облака, то нам потребуется при следующем пролете спутника над ним снимать эту часть заново. Но если в следущий раз спутник полетит над этим городом в другое время, тени будут направлены в совершенно другую сторону. И если мы совместим два снимка, у нас будет ощущение диссонанса. Поэтому такие спутники летают по солнечно-синхронной орбите, рассчитанной таким образом, чтобы каждый пролет спутника над определенной местностью приходился на одно и то же локальное время.
Итак мы произвели фотосъемку, склеили фотографии, получили одно большое полотно в высоком разрешении. Но съемка производилась с какой-то одной точки, так что некоторые углы у нас будут искажаться. Чтобы скомпенсировать искажения нужно всю картинку перепроецировать. Сделать так, будто каждая фотография была сделана именно над этой точкой.
Есть и еще одна проблема спутниковой съемки. Мы ведь хотим получить цветные фотографии, но при проходе через атмосферу световые лучи разного спектра преломляются по-разному. Поэтому цветной снимок высокого разрешения из космоса сделать не получается. Делается по два снимка. Один – черно-белый, высокого разрешения, а второй меньшего разрешения, но цветной. Затем цветной снимок растягивают и накладывают как текстуру на черно-белый. Это становится заметно, когда в кадр попадают быстродвижущиеся объекты, например, самолеты.
Итак, мы произвели съемку, цветокоррекцию и почие необходимые манипуляции, уложили все эти терабайты данных в хранилища, сделали на их основе карты. Но почему бы не отдать пользователям и сами спутниковые снимки. Ведь посмотреть на них тоже полезно и интересно. На Яндекс.Картах эта функция появилась в 2004 году. Интернет тогда был помедленнее, чем сейчас, и передавать большие данных было не так просто. Поэтому большие картинки разбили на тайлы, умещающиеся ровно в один пользовательский экран.
Но вернемся к самим картам. Допустим, мы смогли разметить на снимках дороги, дома, подписать адреса. В итоге у нас получится вот такая картинка:
Теперь нам эту карту нужно раскрасить. Если мы раскрасим кварталы, дома, дороги и водоемы в разные цвета, получится у нас вот что:
Уже не так плохо, но мы-то хотим добиться совсем другого результата:
На самом деле, перед нами стоит сразу несколько задач. Во-первых, выделить из всего многообразия объектов самые значимые, и в зависимости от масштаба добавлять или убирать менее значимые. Кроме того, есть много пользователей с искажениями зрительного восприятия: примерно десять процентов мужчин страдают такими заболеваниями. И это тоже нужно принимать во внимание. На картинке ниже можно посмотреть, как видят карту люди страдающие дальтонизмом:
Как видно, карта остается вполне читаемой, так как цветовая палитра специально подобрана таким образом, чтобы цвета не сливались при наиболее часто встречающихся искажениях зрительного восприятия.
Еще один момент, который нужно учитывать при выборе цветовой палитры заключается в том, что карты часто печатают на черно-белых принтерах, и монохромная карта тоже должна оставаться читаемой:
Народная карта
Пробки
Подробно о том, как работают Яндекс.Пробки уже рассказывал в своей лекции Леонид Медников, ну а общее представление можно составить из этой картинки:
Досмотрев лекцию до конца, вы узнаете, как устроены не менее интересные компоненты Яндекс.Карт: маршрутизация, Панорамы и API.
На каких языках программирования пишут в Яндексе
«Когда-то давно, семь с лишним лет назад, я пришёл на собеседование в Яндекс. Собеседовали по С++, взяли.
Первый день. Самокатная, шумная столовая кислотных расцветок, обед. Суп из пластмассовых прямоугольных параллелепипедов.
— Хочешь писать на С++? — спрашивают меня.
— Нет, — говорю, — не хочу.
— Ну ок, учи Perl.
С тех пор я пишу на Perl и нежно его люблю».
Такую историю рассказал нам разработчик Яндекса, когда мы готовили эту публикацию и проводили опрос. Мы спрашивали у наших разработчиков, на чём они пишут, чтобы выяснить — какие языки программирования в Яндексе самые популярные. В опросе приняли участие больше половины разработчиков компании, расклад получился такой:
Многие разработчики используют в работе несколько языков, поэтому мы просили их выбрать один — тот, на котором они пишут больше всего. В лидерах оказались пять языков: C++, JavaScript, Java, Python и Perl. Все эти языки разные, и каждый лучше решает свою задачу. Поэтому они по-разному используются в Яндексе.
C++ — классический язык для больших и сложных систем, где критически важна производительность. На нём обычно пишутся самые важные, базовые компоненты приложений. Например, на C++ написано ядро поиска Яндекса, Браузер и Карты.
На JavaScript в основном пишут интерактивные элементы сайтов, такие как анимация или браузерные игры. Этот язык очень широко используется в браузерах для написания интерфейсов — того, с чем напрямую взаимодействуют пользователи. На JavaScript написаны веб-интерфейсы всех сервисов Яндекса.
Java — это универсальный язык, на котором можно написать любое приложение, будь то игра Flappy Bird или веб-сервер, обрабатывающий миллионы запросов в минуту. Несмотря на название имеет мало общего с JavaScript. Разработка на нём пойдёт быстрее, чем на C++, однако программа может получиться чуть медленнее. Особенности Java позволяют создавать программы, которые работают практически на любом устройстве — от телефона до микроволновки. На Java у нас написаны, например, Маркет и Музыка.
Python — это дружелюбный к программисту язык с простым синтаксисом. С него хорошо начинать изучение программирования. У нас Python широко используется в системном администрировании, но подходит для решения почти любых задач, кроме обработки больших объёмов данных. На Python многое делать проще и быстрее, чем на C++, но программа будет не такой производительной. Это разумный выбор, когда производительность не очень важна или задачу нужно сделать быстро. На Python написана серверная часть Диска, а ещё он используется в Директе, внутренних сервисах и многих других проектах.
Perl был создан для обработки текстов — например, для извлечения фактов из текста. Талисман языка — верблюд, лишённый изящества, но выносливый и эффективный, — точно отражает его особенности. Это лаконичный, но непростой язык, который, однако, хорошо решает свою задачу. В Яндексе его используют, например, для анализа данных в баннерной системе и в разработке серверной части некоторых сервисов — например, Директа.
С точки зрения задачи выбор языка — это поиск равновесия между эффективностью программы, квалификацией программиста и временем, потраченным на работу. Конечно, в реальности всё немного сложнее, поэтому иногда и случаются истории вроде той, с которой мы начали. «Шёл на вакансию C++, взяли на Perl, пишу на Python, а люблю Scala», — такое тоже бывает.
С точки зрения разработчика, выбор языка — это вопрос предпочтений. Кому-то действительно нравится сам язык, кому-то — задачи, которые он решает. Например, одни предпочитают фундаментальные задачи и пишут базу поиска на C++, а другие любят делать то, что видно пользователям, и пишут интерфейсы на JavaScript. Третьи пишут на каком-то языке просто потому, что знают его досконально. А некоторые, наоборот, готовы пробовать новое и участвуют в разных проектах.
Яндекс делают более шести тысяч человек, из них четверть — это разработчики. По большому счёту неважно, на каком языке пишет человек. Если он профессионал, для него всегда найдётся подходящая задача. Прямо сейчас у нас открыто 90 вакансий для разработчиков в десяти городах. Хотите попробовать свои силы — добро пожаловать (вакансии в берлинском офисе можно посмотреть здесь).
Мой (нано)опыт с Yandex.Maps API или зачем нужна инструкция
Introduction
Я андроид разработчик и.
Мне довелось допиливать небольшой проект(
500h), в котором на старте было принято решение использовать Yandex.Maps API, потому что зачем для Москвы использовать гугл карты, если есть наши. Сейчас расскажу, как все прошло.
Я не проводил глубоких подкапотных исследований и никаких секретов не открою. Но, если вам, как и мне, надо очень быстро (вчера) начать использовать в вашем проекте карты, надеюсь, помогу сэкономить немного времени.
Если лень читать или сразу нужен вывод, отправляю в последнее “Действие 4: Это конец / TL;DR”
Действие 0: Определения
Начнем с определений: что, зачем, почему.
Задача: отобразить карту Москвы, пинами указать конкретные места, уметь построить маршрут от текущего положения до конкретной точки (или до нескольких).
Технология: Yandex.Maps API. Ссылки на документацию[1] ниже.
Итого: прочитайте документацию, реализуйте фичи.
Все выглядит просто, что может пойти не так.
Действие 1: Поиск
Прежде чем изучить документацию, её надо найти. Искать яндекс, конечно же, будем в гугле — найдем [2] или [2].ru [3]. Мы — девелоперы, видим кнопку “для девелоперов” — жмем. Огромная иконка “Maps API” выглядит как то, что нам нужно! (It’s a trap!)
В “. /maps” [4] нас ждут только бесконечный поиск, разочарование и страдания. Которые к нужной документации меня так и не привели.
Возвращаемся на шаг назад, листаем вниз и находим MapKit [5] — нам сюда. Навигация тут довольно грустная, поэтому вот важные ссылки — android samples [6] и Documentation [7] (возможно, иногда получится найти тут что-то полезное).
Действие 2: Поехали
Находим Getting started и приступаем. В начале все просто.
На “Step 3. Set up the library” возникают вопросы. Вью и фабрику нужно обязательно стартовать и останавливать отдельно, иначе, как нам сообщают, ничего не будет работать. Почему? А что будет, если что-то стартану, а что-то нет, или стартану что-то позже? А если несколько вьюх, то для каждого надо фабрику, или это синглтон?
Возможно, это всего лишь QuickStart и дальше мы найдем подробное описание! (нет)
Давайте смотреть, что есть по документации. А все, ничего больше нет. Есть только сгенерированная документация с комментариями типа:
Ладно, на гитхабе есть еще проект с примерами использования [8]. Внутри каждого класса активити есть комментарии о том, что он делает и зачем нужен (после документации это просто подарок судьбы). Есть несколько сценариев: создание кастомного слоя карты, построение маршрута для автомобиля, работа с объектами на карте и некоторые другие.
Выглядит ли апи мощным? Да.
Понятно ли как им пользоваться в случаях, чуть более сложных, чем примеры? Нет.(
Как это понять? ¯_(ツ)_/¯ Нырять с головой в код, по итогу исследований продавать книжку о том, что нашел.
Действие 3: Разрабатываем
Задача 1: отобразить карту
Сложностей не встретил, все есть в гайде.
Задача 2: отобразить пины
Нам нужен “MapObjectsActivity.java», то, что мы ищем, называется Placemarks. Смотрим в код, чтобы понять, что с ними делать.
Задача 3: построить маршрут
Наш друг тут — “MasstransitRoutingActivity.java”. Маршрут можно попросить разный: только на машине, только пешком, и так и сяк; наверняка можно еще учесть метро и другие разные штуки, но я недонырнул.
Дополнительная задача: позиционирование прямое и обратное. Надо же еще уметь определять местоположение. Прямое геокодирование — определять координаты по названию, обратное — определять название по координатам.
Для решения этой задачи придется вернуться в поиск — и найти документацию для js [9]. Она кажется гораздо более подробной и объемной (я завидую). Нам необходим “HTTP geocoding request” [10] — тут довольно понятно написано, что это и как его использовать. Дело за реализацией http запросов-ответов на мобилках.
Действие 4: Это конец / TL;DR
Общие итоги:
Яндекс карты классные. Как ими пользоваться — непонятно.
Хорошая документация, чтобы “потрогать” сервис. Ужасная документация, чтобы что-то с ним сделать. Структура ссылок — “Хрен найдешь”, качество находки — “Вот колесо, оно катится. А далее вы сами легко сможете изобрести машину, ракету, подводную лодку”.
Основные моменты:
Как отобразить карту в проекте? Ссылка [7], тут всё просто.
Как добавить пин на карту? Ключевые слова Placemark, MapObjects. Искать в samples.
Как построить маршрут? Ключевое слово MasstransitRouting. Искать в samples.
Как сделать что-то еще? Искать в samples. Если там нет, то у вас проблемы.











