Maps SDK для iOS использует следующие системы координат:
- Значения широты и долготы, которые однозначно ссылаются на точку мира. (Google использует стандарт World Geodetic System WGS84 .)
- Мировые координаты, которые однозначно ссылаются на точку на карте.
- Координаты пикселей, которые ссылаются на определенный пиксель на карте при определенном уровне масштабирования.
- Координаты плитки, которые ссылаются на определенную плитку на карте при определенном уровне масштабирования.
Мировые координаты
Всякий раз, когда API необходимо преобразовать местоположение в мире в местоположение на карте, он сначала переводит значения широты и долготы в мировые координаты. API использует проекцию Меркатора для выполнения этого преобразования.
Для удобства расчета координат пикселей (см. ниже) мы предполагаем, что карта с уровнем масштабирования 0 представляет собой один тайл базового размера тайла. Затем мы определяем мировые координаты относительно координат пикселей на уровне масштабирования 0, используя проекцию для преобразования широты и долготы в положения пикселей на этом базовом тайле. Эта мировая координата представляет собой значение с плавающей запятой, измеряемое от начала проекции карты до определенного местоположения. Обратите внимание, что поскольку это значение представляет собой значение с плавающей запятой, оно может быть намного точнее, чем текущее разрешение отображаемого изображения карты. Другими словами, мировая координата не зависит от текущего уровня масштабирования.
Мировые координаты в Картах Google измеряются от начала координат проекции Меркатора (северо-западный угол карты на 180 градусах долготы и приблизительно 85 градусов широты) и увеличиваются по x
на восток (справа) и увеличиваются по y
на юг. (вниз). Поскольку основная плитка Mercator Google Maps имеет размер 256 x 256 пикселей, используемое мировое координатное пространство — {0-256}, {0-256}
.
Обратите внимание, что проекция Меркатора имеет конечную ширину по долготе, но бесконечную высоту по широте. Мы обрезаем изображения базовой карты, используя проекцию Меркатора, примерно на +/- 85 градусов, чтобы сделать результирующую форму карты квадратной, что упрощает логику выбора фрагментов. Обратите внимание, что проекция может давать мировые координаты за пределами используемого координатного пространства базовой карты, если, например, вы строите очень близко к полюсам.
Пиксельные координаты
Координаты пикселей относятся к определенному пикселю на карте с определенным уровнем масштабирования, тогда как мировые координаты отражают абсолютные местоположения в данной проекции. Координаты пикселей рассчитываются по следующей формуле:
pixelCoordinate = worldCoordinate * 2zoomLevel
Из приведенного выше уравнения обратите внимание, что каждый увеличивающийся уровень масштабирования в два раза больше в обоих направлениях x
и y
. Таким образом, каждый более высокий уровень масштабирования приводит к разрешению, в четыре раза превышающему предыдущий уровень. Например, при уровне масштабирования 1 карта состоит из 4 тайлов размером 256x256 пикселей, что дает пространство в пикселях от 512x512. При уровне масштабирования 19 на каждый пиксель x
и y
на карте можно ссылаться, используя значение от 0 до 256 * 2 19 .
Поскольку мировые координаты основаны на размере фрагмента карты, целая часть пиксельной координаты идентифицирует точный пиксель в этом месте при текущем уровне масштабирования. Обратите внимание, что для уровня масштабирования 0 координаты пикселей равны мировым координатам.
Теперь у нас есть способ точно обозначить каждое местоположение на карте при каждом уровне масштабирования. Maps SDK для iOS создает область просмотра с учетом центра уровня масштабирования карты (в виде LatLng
) и размера содержащего DOM-элемента и переводит эту ограничивающую рамку в пиксельные координаты. Затем API логически определяет все фрагменты карты, лежащие в заданных границах пикселей. Ссылка на каждый из этих фрагментов карты осуществляется с помощью координат фрагмента , что значительно упрощает отображение изображений карты.
Координаты плитки
API не может загружать все изображения карты одновременно для более высоких уровней масштабирования. Вместо этого API разбивает изображения на каждом уровне масштабирования на набор фрагментов карты, которые логически расположены в порядке, понятном приложению. Когда карта прокручивается до нового местоположения или до нового уровня масштабирования, API определяет, какие фрагменты необходимы, используя координаты пикселей, и преобразует эти значения в набор фрагментов для извлечения. Эти координаты плитки назначаются с использованием схемы, которая позволяет логически легко определить, какая плитка содержит изображение для любой заданной точки.
Плитки в Картах Google нумеруются из того же источника, что и пиксели. Для реализации Google проекции Меркатора исходная плитка всегда находится в северо-западном углу карты, при этом значения x
увеличиваются с запада на восток, а значения y
увеличиваются с севера на юг. Плитки индексируются с использованием координат x,y
от этого источника. Например, на уровне масштабирования 2, когда земля разделена на 16 плиток, на каждую плитку можно ссылаться уникальной парой x,y
:
Обратите внимание, что, разделив координаты пикселя на размер плитки (256) и взяв целые части результата, вы получите в качестве побочного продукта координату плитки при текущем уровне масштабирования.
Пример
В следующем примере отображаются координаты Чикаго, штат Иллинойс: значения широты и долготы, мировые координаты, координаты в пикселях и координаты плитки. Используйте элемент управления масштабированием, чтобы увидеть значения координат при различных уровнях масштабирования.
Чтобы увидеть, как рассчитывались координаты, посмотрите код .