Подключение осуществляется через загрузку внешнего скрипта с обязательным указанием ключа API и функции обратного вызова инициализации карты.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Google Maps Vanilla JS</title>
<style>
#map {
height: 100vh;
width: 100%;
}
</style>
</head>
<body>
<div id="map"></div>
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
async
defer>
</script>
<script>
function initMap() {
const center = { lat: 55.751244, lng: 37.618423 };
const map = new google.maps.Map(document.getElementById("map"), {
center,
zoom: 10,
});
}
</script>
</body>
</html>
Ключевые особенности загрузки:
async и defer обеспечивают неблокирующую
загрузку скриптаcallback=initMap запускает инициализацию после полной
загрузки APIgoogle.maps становится доступным глобальноОбъект карты создаётся через конструктор
google.maps.Map, который принимает DOM-элемент и объект
настроек.
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 51.5074, lng: -0.1278 },
zoom: 12,
mapTypeId: "roadmap"
});
Основные параметры:
center — координаты центра картыzoom — масштаб отображенияmapTypeId — тип карты (roadmap,
satellite, hybrid, terrain)Поведение карты определяется объектом MapOptions,
который поддерживает сотни параметров: отключение UI, управление
жестами, ограничения перемещения.
Координаты задаются через объект { lat, lng }, однако
API также поддерживает google.maps.LatLng.
const position = new google.maps.LatLng(48.8566, 2.3522);
map.setCenter(position);
Использование LatLng оправдано при сложных вычислениях и
взаимодействии с сервисами API, так как объект содержит методы:
lat()lng()Добавление маркеров осуществляется через
google.maps.Marker.
const marker = new google.maps.Marker({
position: { lat: 55.751244, lng: 37.618423 },
map,
title: "Москва"
});
Расширенные настройки маркеров:
const marker = new google.maps.Marker({
position: { lat: 40.7128, lng: -74.0060 },
map,
draggable: true,
animation: google.maps.Animation.DROP,
icon: "https://example.com/icon.png"
});
Информационные окна используются для отображения HTML-контента.
const infoWindow = new google.maps.InfoWindow({
content: "<div><strong>Точка интереса</strong><br>Описание объекта</div>"
});
marker.addListener("click", () => {
infoWindow.open(map, marker);
});
Особенности:
Система событий построена на методе addListener.
map.addListener("click", (event) => {
console.log(event.latLng.lat(), event.latLng.lng());
});
Часто используемые события:
clickdragzoom_changedidleПример отслеживания изменения центра:
map.addListener("center_changed", () => {
const center = map.getCenter();
console.log(center.toJSON());
});
Геокодирование выполняется через сервис Geocoder.
const geocoder = new google.maps.Geocoder();
geocoder.geocode({ address: "Paris" }, (results, status) => {
if (status === "OK") {
map.setCenter(results[0].geometry.location);
}
});
Обратное геокодирование:
geocoder.geocode({ location: { lat: 48.8566, lng: 2.3522 } }, (results, status) => {
if (status === "OK") {
console.log(results[0].formatted_address);
}
});
Полилинии используются для отображения маршрутов и геометрических линий.
const path = [
{ lat: 55.75, lng: 37.61 },
{ lat: 55.76, lng: 37.62 }
];
const polyline = new google.maps.Polyline({
path,
geodesic: true,
strokeColor: "#FF0000",
strokeOpacity: 1.0,
strokeWeight: 2,
map
});
Полилинии поддерживают:
Полигоны используются для выделения зон.
const polygon = new google.maps.Polygon({
paths: [
{ lat: 55.75, lng: 37.61 },
{ lat: 55.76, lng: 37.62 },
{ lat: 55.74, lng: 37.63 }
],
strokeColor: "#0000FF",
fillColor: "#0000FF",
fillOpacity: 0.3,
map
});
Особенности:
Интерфейс карты может быть полностью переопределён.
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 55.751244, lng: 37.618423 },
zoom: 10,
disableDefaultUI: true,
zoomControl: true
});
Контролы:
Стили применяются через массив JSON-объектов.
const styledMap = new google.maps.Map(document.getElementById("map"), {
center: { lat: 55.751244, lng: 37.618423 },
zoom: 10,
styles: [
{
featureType: "water",
elementType: "geometry",
stylers: [{ color: "#000000" }]
},
{
featureType: "road",
stylers: [{ visibility: "simplified" }]
}
]
});
Стили позволяют:
При большом количестве маркеров применяется кластеризация.
const markers = locations.map((loc) => {
return new google.maps.Marker({
position: loc,
map
});
});
Для оптимизации:
Объект LatLngBounds управляет видимой областью.
const bounds = new google.maps.LatLngBounds();
locations.forEach((loc) => bounds.extend(loc));
map.fitBounds(bounds);
Функциональность:
При архитектуре Vanilla JavaScript важна корректная работа с загрузкой API без фреймворков.
window.initMap = function () {
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 0, lng: 0 },
zoom: 2
});
};
Глобальная регистрация callback необходима, так как API вызывает
функцию из глобального контекста window.
При отсутствии сборщиков и модульных систем проявляются особенности:
google<script>При этом Vanilla-подход сохраняет:
API поддерживает добавление пользовательских слоёв данных.
const dataLayer = new google.maps.Data();
dataLayer.setMap(map);
Возможности:
dataLayer.addGeoJson(geoJsonData);
Сервис маршрутизации строится через DirectionsService и
DirectionsRenderer.
const directionsService = new google.maps.DirectionsService();
const directionsRenderer = new google.maps.DirectionsRenderer();
directionsRenderer.setMap(map);
directionsService.route(
{
origin: "Moscow",
destination: "Saint Petersburg",
travelMode: google.maps.TravelMode.DRIVING
},
(response, status) => {
if (status === "OK") {
directionsRenderer.setDirections(response);
}
}
);
Функциональные элементы: