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

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.
Выберите платформу: Android iOS JavaScript

Maps JavaScript API использует следующие системы координат:

  • Координаты широты и долготы, определяющие местоположение на поверхности Земли. 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 JavaScript API создает область просмотра для заданного центра карты с соответствующим уровнем масштабирования (LatLng) и размера содержащего его элемента DOM, после чего преобразует границы этой области в пиксельные координаты. Затем API логически определяет все фрагменты карты, лежащие в пределах указанных пиксельных границ. Каждый фрагмент обозначается с помощью координат фрагмента, что значительно упрощает отображение карты.

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

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

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

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

Пример

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

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