В основе работы с географическими данными в Google Maps JavaScript
API лежит понятие координатной точки, определяемой широтой и долготой. В
API используются два основных способа представления таких данных: объект
google.maps.LatLng и литеральный формат
{ lat: number, lng: number }.
LatLng представляет собой класс с методами для
вычислений, сравнения и преобразований:
const point = new google.maps.LatLng(55.751244, 37.618423);
Литеральный формат используется чаще при передаче данных и конфигурации:
const point = { lat: 55.751244, lng: 37.618423 };
Оба варианта взаимозаменяемы во многих методах API, однако
LatLng предоставляет дополнительные возможности, включая
методы lat(), lng(), equals() и
toString().
Работа с точками начинается с создания экземпляра карты, где задаётся центр и масштаб:
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 55.751244, lng: 37.618423 },
zoom: 10,
});
Географические точки в визуальном слое чаще всего представлены через маркеры:
new google.maps.Marker({
position: { lat: 55.751244, lng: 37.618423 },
map: map,
title: "Москва"
});
Каждый маркер связан с конкретной координатой и автоматически проецируется на карту с учётом текущего масштаба и проекции Mercator.
Маркер является основной абстракцией для отображения географической точки. Он связывает координаты с визуальным элементом DOM-слоя карты.
Базовая структура маркера:
const marker = new google.maps.Marker({
position: { lat: 59.9311, lng: 30.3609 },
map,
label: "A"
});
Маркер поддерживает изменение позиции в реальном времени:
marker.setPosition({ lat: 59.935, lng: 30.325 });
Получение текущих координат:
const position = marker.getPosition();
const lat = position.lat();
const lng = position.lng();
Каждая точка, представленная маркером, может участвовать в событийной модели API. События позволяют отслеживать взаимодействие с конкретными координатами.
marker.addListener("click", () => {
console.log(marker.getPosition().toString());
});
Дополнительные события включают:
dragend — завершение перемещения точкиmouseover — наведение курсораrightclick — контекстное взаимодействиеПример обработки изменения координат после перетаскивания:
marker.addListener("dragend", () => {
const pos = marker.getPosition();
console.log(pos.lat(), pos.lng());
});
Google Maps JavaScript API использует проекцию Mercator, в которой географические координаты преобразуются в пиксельные значения на тайловой сетке.
При увеличении масштаба одна и та же точка сохраняет свои координаты, но её экранное положение изменяется.
Внутреннее преобразование выполняется через
Projection:
const projection = map.getProjection();
const point = projection.fromLatLngToPoint(
new google.maps.LatLng(55.751244, 37.618423)
);
Эта операция используется при разработке кастомных слоёв и визуализаций.
Географические данные часто представлены наборами координат, например для маршрутов, зон или кластеризации.
const points = [
{ lat: 55.751244, lng: 37.618423 },
{ lat: 59.9311, lng: 30.3609 },
{ lat: 56.8389, lng: 60.6057 }
];
points.forEach(p => {
new google.maps.Marker({
position: p,
map
});
});
Такая модель используется для массового отображения объектов.
Для управления набором точек применяется класс
LatLngBounds, описывающий прямоугольную область на
карте.
const bounds = new google.maps.LatLngBounds();
points.forEach(p => bounds.extend(p));
map.fitBounds(bounds);
Метод fitBounds автоматически подбирает масштаб и центр,
чтобы все точки были видимы.
Географические точки часто сохраняются в JSON-структурах. Литеральный формат предпочтителен из-за простоты сериализации:
const serialized = JSON.stringify({ lat: 55.751244, lng: 37.618423 });
const parsed = JSON.parse(serialized);
При использовании LatLng требуется преобразование:
const latLng = marker.getPosition();
const data = {
lat: latLng.lat(),
lng: latLng.lng()
};
Широта и долгота представляют собой числа с плавающей точкой, что приводит к незначительным погрешностям при сравнении.
Прямое сравнение координат недопустимо:
// некорректный подход
if (a.lat === b.lat && a.lng === b.lng) {}
Корректный подход включает допустимую погрешность:
const isEqual =
Math.abs(a.lat - b.lat) < 0.000001 &&
Math.abs(a.lng - b.lng) < 0.000001;
Метод equals() в LatLng учитывает
внутреннюю нормализацию значений.
Положение объектов может изменяться в реальном времени, что особенно важно для трекинга и интерактивных систем.
function updateMarker(marker, lat, lng) {
marker.setPosition({ lat, lng });
}
При частых обновлениях важно минимизировать пересоздание объектов, используя повторное присваивание позиции.
Географические точки могут использоваться не только в маркерах, но и в кастомных оверлеях. При этом координаты преобразуются в экранные пиксели для точного позиционирования элементов:
class CustomOverlay extends google.maps.OverlayView {
draw() {
const projection = this.getProjection();
const position = projection.fromLatLngToDivPixel(
new google.maps.LatLng(55.751244, 37.618423)
);
}
}
Такая модель применяется при создании сложных визуализаций поверх карты.
При обработке кликов по карте координаты точки извлекаются из события:
map.addListener("click", (event) => {
const lat = event.latLng.lat();
const lng = event.latLng.lng();
});
Таким образом, каждая точка может быть динамически создана на основе взаимодействия с картой.
При увеличении количества географических объектов производительность становится критическим фактором. Используются следующие подходы:
Механизм кластеризации позволяет объединять близко расположенные точки в один визуальный элемент, снижая нагрузку на рендеринг.
Расстояния между координатами вычисляются через сферическую
геометрию. API предоставляет утилиты в библиотеке
geometry:
const distance = google.maps.geometry.spherical.computeDistanceBetween(
new google.maps.LatLng(55.751244, 37.618423),
new google.maps.LatLng(59.9311, 30.3609)
);
Полученное значение выражается в метрах и учитывает кривизну Земли.
Точки часто выступают узлами маршрутов, соединяемых линиями:
const path = [
{ lat: 55.751244, lng: 37.618423 },
{ lat: 59.9311, lng: 30.3609 }
];
new google.maps.Polyline({
path,
map,
strokeWeight: 2
});
Такая структура объединяет географические координаты в непрерывную линию, сохраняя их исходную семантику как отдельных точек.