Архитектура Leaflet построена вокруг слоёв (layers), где базовая карта чаще всего подключается через тайловые серверы. Подключение сторонних картографических провайдеров сводится к подмене источника тайлов, сохранению системы координат Web Mercator и корректной обработке уровней масштабирования.
Работа с внешними картографическими платформами требует понимания разницы между:
Google Maps относится ко второй категории, что создаёт ограничения при прямом использовании внутри Leaflet.
Google Maps API не предоставляет прямого доступа к тайловым слоям в
формате, совместимом с L.TileLayer. Основные
ограничения:
По этой причине прямое подключение через стандартный слой Leaflet технически и юридически некорректно.
Интеграция возможна через создание синхронизированного контейнера, где Google Maps выступает как фон, а Leaflet — как слой управления геометрией.
Пример архитектуры:
google.maps.Mapconst gmap = new google.maps.Map(document.getElementById("gmap"), {
center: { lat: 55.75, lng: 37.62 },
zoom: 10,
disableDefaultUI: true
});
const map = L.map("leaflet", {
center: [55.75, 37.62],
zoom: 10
});
map.on("move", () => {
const center = map.getCenter();
gmap.setCenter({ lat: center.lat, lng: center.lng });
gmap.setZoom(map.getZoom());
});
Такой подход используется при необходимости сохранить функциональность Google-рендера и добавить гибкость Leaflet.
В экосистеме Leaflet существуют сторонние плагины, эмулирующие tile
layer Google Maps через API-запросы. Один из распространённых подходов —
googleMutant.
Он создаёт слой, который визуально повторяет Google Maps, но управляется Leaflet.
const map = L.map("map").setView([55.75, 37.62], 10);
L.gridLayer.googleMutant({
type: "roadmap"
}).addTo(map);
Поддерживаемые режимы:
При использовании Google Maps требуется обязательная авторизация через API key.
Ключ:
Пример подключения API:
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"></script>
Важно учитывать:
И Leaflet, и Google Maps используют Web Mercator (EPSG:3857), что упрощает взаимодействие, но не устраняет различия:
При синхронизации необходимо учитывать:
LatLng ↔︎ PixelЧасто используется схема, где Google Maps полностью скрыт под Leaflet-оверлеями.
Компоненты:
#gmap {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
#leaflet {
position: absolute;
top: 0;
left: 0;
background: transparent;
}
Leaflet обеспечивает работу с:
Пример добавления слоя поверх Google Maps:
L.marker([55.75, 37.62]).addTo(map);
L.polygon([
[55.76, 37.60],
[55.76, 37.64],
[55.74, 37.64]
]).addTo(map);
Эти элементы не зависят от источника базовой карты.
Совмещение Google Maps и Leaflet приводит к увеличению нагрузки:
Оптимизация включает:
requestAnimationFrame для
синхронизацииВместо использования Google Maps внутри Leaflet часто применяются альтернативные tile-провайдеры:
Leaflet изначально лучше адаптирован к tile-based архитектуре, поэтому интеграция сторонних API обычно реализуется через слой абстракции, а не через прямую интеграцию движков.
События Leaflet:
movezoomclickdragСобытия Google Maps:
bounds_changedcenter_changedzoom_changedПри синхронизации требуется ручное связывание:
map.on("moveend", () => {
const c = map.getCenter();
gmap.setCenter({ lat: c.lat, lng: c.lng });
});
Проблема циклических обновлений решается флагами блокировки:
let syncing = false;
map.on("move", () => {
if (syncing) return;
syncing = true;
gmap.setCenter(map.getCenter());
syncing = false;
});