Leaflet — это лёгкая и гибкая библиотека для работы с интерактивными картами на веб-страницах. Основные преимущества Leaflet — простота использования, поддержка большинства современных браузеров и высокая производительность.
Leaflet можно подключить через npm:
npm install leaflet
или через CDN:
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
Создание карты в Vue-компоненте начинается с простого шаблона:
<template>
<div id="map" style="height: 500px;"></div>
</template>
<script>
import L from 'leaflet';
export default {
name: 'LeafletMap',
mounted() {
const map = L.map('map').setView([55.751244, 37.618423], 10); // Москва
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
}
}
</script>
Ключевые моменты:
L.map('id') создаёт карту в элементе с указанным
id.setView([lat, lng], zoom) задаёт начальную позицию и
масштаб.L.tileLayer(url, options) подключает слой
картографических тайлов.Маркер добавляется с помощью метода L.marker():
const marker = L.marker([55.751244, 37.618423]).addTo(map);
marker.bindPopup('<b>Москва</b><br>Столица России.').openPopup();
bindPopup(content) привязывает всплывающее окно к
маркеру.openPopup() открывает окно сразу после добавления.Leaflet поддерживает геометрические объекты:
const polyline = L.polyline([
[55.751244, 37.618423],
[55.761244, 37.628423],
[55.771244, 37.638423]
], { color: 'red' }).addTo(map);
const polygon = L.polygon([
[55.751244, 37.618423],
[55.761244, 37.628423],
[55.751244, 37.638423]
], { color: 'blue' }).addTo(map);
Полилинии и полигоны поддерживают события click,
mouseover, mouseout, что позволяет создавать
интерактивные карты.
Для масштабируемых проектов рекомендуется использовать библиотеку
vue2-leaflet или vue3-leaflet, которая
предоставляет компоненты Vue для карты, маркеров и слоёв.
Пример использования компонента карты:
<template>
<l-map :zoom="10" :center="[55.751244, 37.618423]" style="height: 500px">
<l-tile-layer url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
<l-marker :lat-lng="[55.751244, 37.618423]">
<l-popup>Москва</l-popup>
</l-marker>
</l-map>
</template>
<script>
import { LMap, LTileLayer, LMarker, LPopup } from 'vue3-leaflet';
export default {
components: { LMap, LTileLayer, LMarker, LPopup }
}
</script>
Такой подход упрощает работу с реактивными данными и обеспечивает лучшую интеграцию с экосистемой Vue.
Google Maps предоставляет мощные возможности для отображения карт, маршрутов, геокодирования и интерактивных объектов.
Для работы с Google Maps необходимо получить API-ключ и подключить скрипт:
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places"></script>
В Vue это удобно делать динамически через lifecycle hooks или
использовать готовые обёртки, например
@fawmi/vue-google-maps.
Простейший пример инициализации карты:
<template>
<div id="google-map" style="height: 500px;"></div>
</template>
<script>
export default {
mounted() {
const map = new google.maps.Map(document.getElementById('google-map'), {
center: { lat: 55.751244, lng: 37.618423 },
zoom: 10
});
new google.maps.Marker({
position: { lat: 55.751244, lng: 37.618423 },
map,
title: "Москва"
});
}
}
</script>
Особенности:
google.maps.Map создаёт карту в указанном
контейнере.center и zoom задают начальное
положение.google.maps.Marker добавляет маркеры с возможностью
привязки событий.Для интерактивности маркеры могут реагировать на события:
const infoWindow = new google.maps.InfoWindow({
content: '<b>Москва</b><br>Столица России.'
});
marker.addListener('click', () => {
infoWindow.open(map, marker);
});
Google Maps поддерживает сложные геометрические объекты — линии, полигоны, круги, многоугольники — с кастомизацией стилей и событий.
Для реактивного взаимодействия рекомендуется использовать обёртки:
<template>
<GMapMap :center="{lat: 55.751244, lng: 37.618423}" :zoom="10" style="height: 500px">
<GMapMarker :position="{lat: 55.751244, lng: 37.618423}" :clickable="true" />
</GMapMap>
</template>
<script>
import { GMapMap, GMapMarker } from '@fawmi/vue-google-maps';
export default {
components: { GMapMap, GMapMarker }
}
</script>
Использование таких компонентов позволяет полностью интегрировать карту в реактивную модель данных Vue, связывать маркеры с состоянием приложения и управлять событиями через методы и свойства компонента.
Кастомные маркеры и иконки Leaflet:
L.icon({ iconUrl, iconSize }) Google Maps:
icon: 'url_to_icon'
Кластеры маркеров Leaflet:
leaflet.markercluster Google Maps:
MarkerClusterer
Геокодирование и маршруты Google Maps предоставляет полноценное API Directions и Geocoding для построения маршрутов и поиска координат.
События карты и слоёв Обе библиотеки поддерживают события клика, наведения, изменения масштаба, но Google Maps предоставляет больше встроенных событий и детальную документацию по ним.
Интеграция с Vuex/Pinia Карты могут быть связаны с глобальным состоянием, что позволяет управлять маркерами и данными динамически, используя реактивные хранилища Vue.
Эта методика работы с Leaflet и Google Maps создаёт основу для разработки сложных интерактивных картографических приложений на Vue.js с полной поддержкой реактивности, кастомизации и расширенных функций картографии.