Теоретические сведения

При использовании API Яндекс.Карт удобнее всего представлять карту как изображение местности или объекта, каждой точке которого соответствует пара координат.

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

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

Координаты

Положение точки на карте описывается с помощью некоторых координат. Если речь идет о карте земной поверхности, то обычно используют сферические координаты – широту и долготу.

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

Широтой (обычно обозначается φ) называют угол между направлением на точку из центра сферы и фундаментальной плоскостью (плоскостью экватора). Долготой (обычно обозначается θ или λ) называют угол между плоскостью проходящего через точку меридиана и плоскостью нулевого меридиана.

Долготы могут принимать значения от -180 до 180 градусов, широты — от -90 до 90 градусов.

Геодезические системы

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

В настоящий момент абсолютное большинство географических сервисов (включая Яндекс.Карты) используют систему WGS 84, в которой Земля считается эллипсоидом с экваториальным радиусом 6378.137 км и полярным радиусом 6356.752 км.

Проекции

Для того, чтобы карту мира можно было отобразить на плоскость, необходимо каким-то образом построить проекцию изображения. Яндекс.Карты, как и большинство других геоинформационных сервисов, используют проекцию Меркатора.

Обратите внимание: проекция Меркатора искажает форму и размеры объектов; чем ближе объект к полюсу, тем большую площадь на карте он занимает. Например, Гренландия кажется большей, чем Австралия, хотя в реальности Австралия в 3.5 раза больше Гренландии.

В отличие от некоторых других картографических сервисов, Яндекс.Карты используют эллиптическую (согласно WGS 84), а не сферическую проекцию Меркатора. Поэтому карта от Яндекса при наложении не будет совпадать с картами в сферической проекции Меркатора.

Работа с Яндекс.Картами с помощью API возможна в обеих проекциях (см. ymaps.projection.wgs84Mercator и ymaps.projection.sphericalMercator).

Декартовы координаты

Использовать географические координаты не всегда целесообразно. Трудно представить, например, что удобно будет использовать долготу и широту для задания координат точек на схеме офиса. Для этой цели логичнее использовать широко распространенную и привычную декартову (прямоугольную) систему координат. API Яндекс.Карт поддерживает работу в декартовых координатах (см. ymaps.projection.Cartesian).

Пользовательские координаты

API Яндекс.Карт может отображать карты, выполненные в любой проекции, и оперировать любыми координатами. Для этого достаточно задать для карты правила пересчета координат точки в пиксельную систему координат (см. следующий раздел) и обратно. Пользовательская карта может быть склеена по любой из осей и даже по двум осям сразу.

Карта в браузере

В результате проецирования мы получаем отображение географической карты на бесконечную пиксельную плоскость. Карта в браузере показывает небольшую часть этой плоскости (т. н. область картографирования).

Для того, чтобы с картой было удобно работать, вводится понятие коэффициента (уровня) масштабирования. На нулевом уровне весь «мир» отображается на область размером 256х256 пикселей. При увеличении коэффициента масштабирования на единицу размеры «мира» увеличиваются ровно в 2 раза и, следовательно, для уровня масштабирования z составляют 2z+8x2z+8 пикселей.

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

Область показа

API Яндекс.Карт позволяет формировать карты двух видов: интерактивные (посредством JavaScript API) и статические (с помощью Static API). В первом случае генерируется HTML и JavaScript код, предназначенный для отображения карты в прямоугольном контейнере. Во втором — обычное изображение, имеющее прямоугольную форму. Прямоугольная область в окне браузера, содержащая изображение участка местности, называется областью показа карты.

Для размещения интерактивной карты обычно используется элемент div, статической — элемент img. Таким образом, местоположение и размеры области показа карты определяются параметрами этих HTML-элементов.

Область картографирования

Участок местности, отображаемый в области показа, называется областью картографирования. Из определения понятно, что она также имеет прямоугольную форму.

Существует три способа задать область картографирования:

  • Задание границ. Чтобы однозначно задать границы прямоугольника достаточно указать координаты двух его вершин, находящихся на одной диагонали. В API Яндекс.Карт для этого используются координаты левого нижнего и правого верхнего углов.

    Такой способ задания области картографирования используется только в JavaScript API.

  • Задание центра и коэффициента масштабирования. Коэффициент масштабирования определяет количество тайлов, на которое разбито общее изображение местности.
  • Задание центра и протяжённости по долготе и широте. Протяжённость по долготе и широте задаётся в градусах. Такой способ задания области картографирования можно использовать и в Static API, и в JavaScript API.

Тайлы

Для удобного и эффективного показа карты, ее изображение разрезается на квадраты размером 256x256 пикселей — тайлы. При формировании изображения в браузере, API загружает только те тайлы, которые видны в данный момент, что позволяет экономить трафик и эффективно использовать кэширование.

На наименьшем масштабе (коэффициент масштабирования 0) вся территория покрывается одним тайлом.

На следующем масштабе (коэффициент масштабирования 1) вся территория умещается на четырех тайлах.

На еще более подробном масштабе (коэффициент масштабирования 2) всю земную поверхность покрывает сетка из 16 (4х4) тайлов, и так далее.

Таким образом, каждый шаг масштаба разбивает карту на 4N тайлов, где N — коэффициент масштабирования.

Обычно тайлы адресуются так же, как и пиксельные координаты — от левого верхнего угла "мира". Чтобы получить номер тайла, нужно глобальные пиксельные координаты его верхнего левого угла разделить на 256 и округлить в меньшую сторону.

Разбиение карты на участки может пригодиться не только для отображения собственно подложки, но и сервисам, предоставляющим значительные объемы информации. Тайловый подход используется, например, в технологиях кластеризации и слоев активных областей. При этом API Яндекс.Карт поддерживает любые механизмы разбиения плоскости на участки, не обязательно в виде равных квадратов — достаточно задать правила пересчета номеров тайлов в глобальные пиксели и обратно.