В системе Google Maps JavaScript API координаты не ограничиваются привычной парой широта/долгота. Для корректного отображения карты используется несколько уровней представления: географические координаты, мировая система координат (world coordinates), пиксельная система (pixel coordinates) и тайловая разметка (tile coordinates). Преобразование между этими системами является базовой операцией при работе с кастомными слоями, оверлеями и интерактивными элементами.
Географическая система координат опирается на эллипсоид WGS84, где точка задаётся значениями широты и долготы:
Однако для отрисовки карты напрямую эти значения не используются. Они проходят несколько этапов преобразования.
Карты в Google Maps JavaScript API используют проекцию Web Mercator. Она переводит сферические координаты в плоскую систему, удобную для рендеринга на экране.
Преобразование широты в координату Y выполняется через логарифмическую функцию:
Математически:
где φ — широта в радианах.
Эта модель обеспечивает:
Мировые координаты — это промежуточный слой между географическими координатами и пикселями.
Внутри системы Google Maps JavaScript API вся поверхность карты проецируется на квадрат фиксированного размера при zoom = 0:
Каждое увеличение zoom удваивает масштаб:
Таким образом, координата точки вычисляется как:
где scale = 2^zoom.
Пиксельная система используется для позиционирования элементов на экране относительно контейнера карты.
В Google Maps JavaScript API пиксели делятся на два типа:
Глобальные пиксели вычисляются из world coordinates:
Локальные пиксели:
Эта разница критична при работе с кастомными overlay.
Для работы с координатами используется объект Projection, доступный
через OverlayView.
Основные методы:
Преобразует географические координаты в мировые координаты.
const projection = overlay.getProjection();
const point = projection.fromLatLngToPoint(
new google.maps.LatLng(55.751244, 37.618423)
);
Результат:
Эти значения зависят от текущего zoom и масштаба карты.
Обратное преобразование:
const latLng = projection.fromPointToLatLng(
new google.maps.Point(200, 300)
);
Используется при:
Ключевая особенность системы координат заключается в экспоненциальном росте детализации.
Фактически:
Это влияет на все преобразования:
Карта разбивается на квадратные тайлы размером 256×256 пикселей.
Формулы:
Эта система используется для:
Внутри Google Maps JavaScript API тайлы подгружаются динамически в зависимости от области видимости.
При создании кастомных слоёв используется наследование от
OverlayView.
Типичный цикл преобразования:
Пример логики позиционирования:
draw() {
const projection = this.getProjection();
const position = projection.fromLatLngToPoint(this.latlng);
const scale = Math.pow(2, this.map.getZoom());
const pixel = new google.maps.Point(
position.x * scale,
position.y * scale
);
const offset = this.map.getDiv().getBoundingClientRect();
this.div.style.left = (pixel.x - offset.left) + "px";
this.div.style.top = (pixel.y - offset.top) + "px";
}
Любое изменение центра карты приводит к пересчёту всех пиксельных координат относительно нового origin.
Алгоритм:
Это позволяет:
При взаимодействии с картой координаты курсора доступны в двух формах:
map.addListener("click", (event) => {
console.log(event.latLng.lat());
console.log(event.latLng.lng());
});
Внутренне происходит:
При высоких zoom уровнях возможны небольшие расхождения между координатами из-за:
В Google Maps JavaScript API это компенсируется внутренними оптимизациями рендеринга и кеширования.
В ряде случаев требуется ввод собственной системы координат:
Тогда используется цепочка:
Это позволяет интегрировать любые визуальные модели поверх базовой карты без потери синхронизации с географией.