Maps SDK для iOS использует следующие системы координат:
- Значения широты и долготы, однозначно ссылающиеся на точку мира. (Google использует стандарт Всемирной геодезической системы 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) и взяв целые части результата, вы получите в качестве побочного продукта координату плитки на текущем уровне масштабирования.
Пример
В следующем примере отображаются координаты Чикаго, штат Иллинойс: значения широты и долготы, мировые координаты, координаты в пикселях и координаты плитки. Используйте элемент управления масштабированием, чтобы увидеть значения координат на различных уровнях масштабирования.
Чтобы увидеть, как были рассчитаны координаты, просмотрите код .