Google Maps JavaScript API
Позиционирование маркера в Google Maps JavaScript API строится вокруг
системы географических координат, основанной на широте и долготе. Каждая
точка на карте представляется объектом LatLng, который
инкапсулирует числовые значения:
lat) — вертикальная координатаlng) — горизонтальная координатаconst position = { lat: 48.0196, lng: 66.9237 };
Эти значения являются базовой единицей для всех операций позиционирования маркеров, независимо от масштаба карты или уровня зума.
Маркер создаётся через объект google.maps.Marker,
которому передаётся ссылка на карту и координаты:
const marker = new google.maps.Marker({
position: { lat: 48.0196, lng: 66.9237 },
map: map,
title: "Центральная точка"
});
Ключевое свойство position определяет начальное
размещение маркера. После инициализации маркер автоматически
отображается на карте и привязывается к географической системе
координат.
Позиция маркера не является статичной. Она может быть изменена в
любой момент через метод setPosition:
marker.setPosition({ lat: 51.1694, lng: 71.4491 });
Изменение происходит мгновенно, без необходимости пересоздавать объект. Это важно для динамических сценариев: отслеживание объектов, обновление данных в реальном времени, анимация перемещения.
Положение маркера и центр карты — независимые сущности, но часто используются совместно. Центр карты задаётся через:
map.setCenter({ lat: 48.0196, lng: 66.9237 });
Маркер может оставаться фиксированным, даже если карта перемещается. Однако в интерфейсных сценариях часто применяется синхронизация:
map.setCenter(marker.getPosition());
Это позволяет «привязать» визуальный фокус карты к маркеру.
Маркер может быть сделан интерактивным с помощью свойства
draggable:
const marker = new google.maps.Marker({
position: { lat: 48.0196, lng: 66.9237 },
map: map,
draggable: true
});
После включения перетаскивания пользователь может изменять координаты
вручную. Для отслеживания изменений используется событие
dragend:
marker.addListener("dragend", () => {
const pos = marker.getPosition();
console.log(pos.lat(), pos.lng());
});
Это основной механизм получения пользовательских координат без дополнительных UI-элементов.
Для сценариев отслеживания объектов используется регулярное обновление координат:
setInterval(() => {
const newPos = {
lat: marker.getPosition().lat() + 0.001,
lng: marker.getPosition().lng() + 0.001
};
marker.setPosition(newPos);
}, 1000);
Такая модель применяется в системах мониторинга транспорта, логистики и трекинга пользователей.
Google Maps JavaScript API предоставляет набор событий, связанных с маркером. Для позиционирования наиболее важны:
dragstart — начало перемещенияdrag — процесс перемещенияdragend — завершение перемещенияmarker.addListener("drag", () => {
const p = marker.getPosition();
});
Частое использование события drag требует оптимизации,
так как оно может вызываться десятки раз в секунду.
При работе с ограниченными областями используется объект
LatLngBounds. Он задаёт допустимые границы перемещения:
const bounds = new google.maps.LatLngBounds(
{ lat: 47.0, lng: 65.0 },
{ lat: 50.0, lng: 70.0 }
);
Далее координаты маркера можно проверять вручную:
if (bounds.contains(marker.getPosition())) {
console.log("Внутри области");
}
Карта использует проекцию, позволяющую переводить экранные координаты в географические:
const projection = map.getProjection();
Через OverlayView можно получить доступ к методам
конвертации:
const overlay = new google.maps.OverlayView();
overlay.on Add = function () {
const proj = this.getProjection();
};
Это используется для точного размещения маркеров по клику:
map.addListener("click", (e) => {
marker.setPosition(e.latLng);
});
При работе с массивами объектов каждый маркер имеет независимую позицию:
const markers = locations.map(loc => {
return new google.maps.Marker({
position: loc,
map: map
});
});
Обновление позиции отдельного элемента:
markers[0].setPosition({ lat: 49.0, lng: 68.0 });
Такая структура применяется в системах визуализации точек интереса и аналитических панелях.
При массовом обновлении маркеров важно минимизировать перерисовки:
if (marker.getPosition().lat() !== newLat) {
marker.setPosition({ lat: newLat, lng: newLng });
}
Плавное изменение позиции достигается интерполяцией координат:
function animateMarker(marker, start, end, steps) {
let i = 0;
const interval = setInterval(() => {
const lat = start.lat + (end.lat - start.lat) * (i / steps);
const lng = start.lng + (end.lng - start.lng) * (i / steps);
marker.setPosition({ lat, lng });
i++;
if (i > steps) clearInterval(interval);
}, 20);
}
Такая техника создаёт визуально непрерывное перемещение объекта по карте.
Маркер может реагировать на ввод координат из внешних источников:
inputLat.addEventListener("change", updateMarker);
inputLng.addEventListener("change", updateMarker);
function updateMarker() {
marker.setPosition({
lat: parseFloat(inputLat.value),
lng: parseFloat(inputLng.value)
});
}
Это используется в формах геокодирования и административных панелях.
API браузера позволяет получать текущие координаты устройства:
navigator.geolocation.getCurrentPosition((pos) => {
marker.setPosition({
lat: pos.coords.latitude,
lng: pos.coords.longitude
});
});
В сочетании с картой это создаёт динамическую привязку маркера к реальному местоположению пользователя.
Позиция маркера тесно связана с его отображением. Скрытие не влияет на координаты:
marker.setMap(null);
Возврат на карту сохраняет последнюю позицию:
marker.setMap(map);
Это позволяет временно отключать визуализацию без потери данных о положении.
Карта использует проекцию Mercator, что приводит к нелинейному отображению расстояний. Это влияет на визуальную интерпретацию перемещения маркера:
Позиция маркера остаётся математически точной, но визуально зависит от текущего масштаба и центра карты.