Google Maps JavaScript API представляет собой клиентскую библиотеку, позволяющую встраивать интерактивные карты Google непосредственно в веб-страницы. API предоставляет инструменты для отображения карт, работы с маркерами, построения маршрутов, геокодирования адресов, отображения пользовательских данных и взаимодействия с различными сервисами платформы Google Maps.
Перед использованием любого функционала необходимо правильно подключить библиотеку к странице. Именно на этапе подключения выполняется загрузка кода API, инициализация необходимых модулей и авторизация приложения через API-ключ.
Для подключения Google Maps JavaScript API необходимо:
Без API-ключа библиотека работать не будет.
Типичная последовательность действий:
После создания проекта в Google Cloud необходимо перейти в раздел управления API и создать новый ключ доступа.
Пример ключа:
AIzaSyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Реальный ключ всегда уникален и привязывается к конкретному проекту.
Для повышения безопасности рекомендуется ограничить использование ключа по доменам:
https://example.com/*
https://www.example.com/*
Такой подход предотвращает использование ключа сторонними сайтами.
Самый распространённый вариант подключения выполняется через HTML-тег
<script>.
Пример:
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY">
</script>
После загрузки скрипта в браузере становится доступно глобальное пространство имён:
google.maps
Через него осуществляется работа со всеми объектами API.
Например:
console.log(google.maps);
Очень часто требуется выполнить код только после полной загрузки библиотеки.
Для этого используется параметр callback.
Пример:
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
async
defer>
</script>
Функция инициализации:
function initMap() {
console.log("Google Maps загружен");
}
После завершения загрузки библиотеки Google автоматически вызовет
функцию initMap().
Схема работы выглядит следующим образом:
Загрузка страницы
↓
Загрузка Google Maps API
↓
Вызов callback-функции
↓
Создание карты
При подключении внешнего скрипта рекомендуется использовать атрибуты:
async
defer
Полный пример:
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
async
defer>
</script>
Позволяет загружать файл параллельно с построением HTML-документа.
Без него браузер приостанавливает обработку страницы до окончания загрузки скрипта.
Откладывает выполнение скрипта до завершения разбора HTML.
Благодаря этому элементы страницы гарантированно существуют к моменту запуска JavaScript-кода.
Перед инициализацией карты необходимо создать HTML-элемент, в котором она будет отображаться.
Пример:
<div id="map"></div>
Задание размеров:
#map {
width: 100%;
height: 500px;
}
Если высота контейнера не задана, карта отображаться не будет.
Типичная ошибка:
#map {
width: 100%;
}
В этом случае высота равна нулю.
HTML:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<style>
#map {
width: 100%;
height: 500px;
}
</style>
</head>
<body>
<div id="map"></div>
<script>
function initMap() {
const map = new google.maps.Map(
document.getElementById("map"),
{
center: {
lat: 55.7558,
lng: 37.6176
},
zoom: 10
}
);
}
</script>
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
async
defer>
</script>
</body>
</html>
После загрузки страницы будет отображена карта, центрированная на Москве.
Google Maps предоставляет набор вспомогательных модулей.
Для подключения используется параметр libraries.
Пример:
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places">
</script>
Подключение нескольких библиотек:
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places,geometry,drawing">
</script>
Наиболее востребованные библиотеки:
| Библиотека | Назначение |
|---|---|
| places | Поиск мест и автодополнение |
| geometry | Геометрические вычисления |
| drawing | Рисование объектов |
| visualization | Тепловые карты |
| marker | Расширенные маркеры |
Начиная с новых версий API рекомендуется использовать динамическую загрузку модулей.
Подключение:
<script>
(g => {
var h, a, k, p = "The Google Maps JavaScript API",
c = "google",
l = "importLibrary",
q = "__ib__",
m = document,
b = window;
b = b[c] || (b[c] = {});
var d = b.maps || (b.maps = {}),
r = new Set,
e = new URLSearchParams;
const u = () =>
h || (h = new Promise(async (f, n) => {
a = m.createElement("script");
e.set("key", "YOUR_API_KEY");
e.set("v", "weekly");
a.src =
`https://maps.googleapis.com/maps/api/js?` +
e;
d[q] = f;
a.oner ror = () =>
h = n(Error(p + " could not load."));
a.nonce =
m.querySelector("script[nonce]")?.nonce || "";
m.head.append(a);
}));
d[l]
? console.warn(p + " only loads once.")
: d[l] = (f, ...n) =>
r.add(f) && u().then(() => d[l](f, ...n));
})({
key: "YOUR_API_KEY",
v: "weekly"
});
</script>
После подключения нужные модули загружаются по требованию.
Пример:
async function initMap() {
const { Map } =
await google.maps.importLibrary("maps");
const map = new Map(
document.getElementById("map"),
{
center: {
lat: 55.7558,
lng: 37.6176
},
zoom: 12
}
);
}
Преимущества подхода:
Версия API задаётся параметром v.
Пример:
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&v=weekly">
</script>
Доступные варианты:
| Значение | Описание |
|---|---|
| weekly | Последняя стабильная версия |
| beta | Бета-версия |
| alpha | Экспериментальная версия |
| quarterly | Обновление раз в квартал |
Пример использования стабильной версии:
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&v=quarterly">
</script>
Иногда библиотека не загружается из-за:
Пример проверки:
window.gm_authFailure = function () {
console.error("Ошибка авторизации Google Maps");
};
Если авторизация завершится неудачно, будет вызвана функция
gm_authFailure.
После подключения можно убедиться, что библиотека доступна.
Пример:
if (window.google && window.google.maps) {
console.log("API успешно загружен");
}
Или:
console.log(typeof google.maps);
Результат:
object
При работе с современными сборщиками проектов (Webpack, Vite, Parcel) загрузка обычно выполняется после создания интерфейса приложения.
Пример:
async function loadMap() {
const { Map } =
await google.maps.importLibrary("maps");
return new Map(
document.getElementById("map"),
{
center: {
lat: 55.7558,
lng: 37.6176
},
zoom: 8
}
);
}
Такой подход хорошо сочетается с архитектурой SPA-приложений на React, Vue и Angular.
Причина:
#map {
height: 0;
}
Решение:
#map {
height: 500px;
}
Сообщение:
InvalidKeyMapError
Причина:
key=12345
Решение — использовать действительный API Key.
Сообщение:
ApiNotActivatedMapError
Необходимо активировать Google Maps JavaScript API в настройках проекта Google Cloud.
Сообщение:
RefererNotAllowedMapError
Причина:
example.com
не указан в списке разрешённых доменов.
Требуется добавить домен в настройки ключа.
Сообщение:
initMap is not a function
Причина:
callback=initMap
при отсутствии самой функции:
function initMap() {}
Необходимо определить функцию до момента её вызова.
Для современных проектов оптимальной считается следующая конфигурация:
<div id="map"></div>
<script>
async function initMap() {
const { Map } =
await google.maps.importLibrary("maps");
new Map(
document.getElementById("map"),
{
center: {
lat: 55.7558,
lng: 37.6176
},
zoom: 10
}
);
}
</script>
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&loading=async&callback=initMap&v=weekly"
async>
</script>
Такая схема обеспечивает актуальную версию API, асинхронную загрузку библиотеки, корректную инициализацию карты и совместимость с современными возможностями Google Maps JavaScript API.