Координаты на карте и координаты фрагмента

Выберите платформу: Android iOS JavaScript

В Maps SDK для Android используются следующие системы координат:

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

Всемирные координаты

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

Для удобства расчета пиксельных координат (см. ниже) мы предполагаем, что карта с уровнем масштабирования 0 представляет собой один фрагмент базового размера. Затем мы определяем всемирные координаты по отношению к пиксельным координатам на уровне масштабирования 0, используя проекцию для преобразования значений широты и долготы в позиции пикселей на базовом фрагменте. Всемирная координата – это значение с плавающей запятой, измеряемое от исходной точки проекции карты до определенного места. Поскольку это значение с плавающей запятой, оно может быть намного более точным, чем текущее разрешение отображаемой карты. Другими словами, всемирные координаты не зависят от текущего уровня масштабирования.

В Google Картах всемирные координаты измеряются от исходной точки проекции Меркатора (северо-западного угла карты, точки с координатами 180° долготы и приблизительно 85° широты) и возрастают по оси x к востоку (вправо), а по оси y – к югу (вниз). Поскольку базовый фрагмент Google Карт в проекции Меркатора имеет размеры 256 x 256 пикселей, пространство доступных значений всемирных координат находится в области {0-256}, {0-256}.

Обратите внимание, что проекция Меркатора имеет ограниченную ширину по долготе, но бесконечную высоту по широте. Мы "обрезаем" изображение базовой карты, на которой используется проекция Меркатора, приблизительно на уровне +/- 85°, чтобы получить квадратную карту. Это упрощает программную логику для выбора фрагмента. Обратите внимание, что проекция может создать мировые координаты вне допустимого пространства карты, если обрабатываемый фрагмент находится слишком близко к одному из полюсов.

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

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

pixelCoordinate = worldCoordinate * 2zoomLevel

Из этой формулы видно, что на каждом следующем уровне масштабирования изображение увеличивается вдвое как по оси x, так и по оси y. Следовательно, разрешение на каждом следующем уровне масштабирования в четыре раза выше, чем на предыдущем. Например, при уровне масштабирования 1 карта состоит из четырех фрагментов размером 256 x 256 пикселей, образуя пространство пикселей 512 x 512. При уровне масштабирования 19 каждый пиксель x и y можно задать числом в диапазоне от 0 до 256 * 219.

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

Теперь мы можем точно определить каждое местоположение на карте при любом уровне масштабирования. Maps SDK для Android создает область просмотра для заданного центра карты с соответствующим уровнем масштабирования (величина LatLng) и размера содержащего его элемента DOM, после чего преобразует границы этой области в пиксельные координаты. Затем API логически определяет все фрагменты карты, лежащие в пределах указанных пиксельных границ. Каждый фрагмент обозначается с помощью координат фрагмента, что значительно упрощает отображение карты.

Координаты фрагмента

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

Фрагменты в Google Картах нумеруются тем же способом, что и пиксели. В проекции Меркатора, реализованной Google, первый по счету фрагмент всегда находится в северо-западном углу карты. Значения x увеличиваются с запада на восток, а значения y – с севера на юг. Фрагменты индексируются с использованием координат x,y относительно исходной точки. Например, при уровне масштабирования 2 (земная поверхность делится на 16 фрагментов) каждый фрагмент можно обозначить уникальной парой значений x,y:

Карта мира, разделенная на четыре сектора по горизонтали и четыре по вертикали.

Обратите внимание, что, если разделить пиксельные координаты на размер фрагмента (256) и взять целую часть результата, получится координата фрагмента при текущем уровне масштабирования.

Пример

В следующем примере показаны координаты Чикаго (Иллинойс, США) для разных уровней масштабирования – значения широты и долготы, всемирные координаты, пиксельные координаты и координаты фрагмента. Меняя масштаб, можно увидеть значения координат для каждого уровня.

Чтобы узнать, как рассчитывались координаты, посмотрите код.