const mapRoot = document.querySelector('[data-map]')
// Загружаем API Яндекс Карт
function loadYMaps() {
return new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = `https://api-maps.yandex.ru/v3/?apikey=${import.meta.env.VITE_YANDEX_MAPS_API_KEY}&lang=ru_RU`
script.onload = () => {
// @ts-ignore - ymaps3 будет доступен после загрузки скрипта
resolve(window.ymaps3)
}
script.onerror = () => reject(new Error('Failed to load Yandex Maps API'))
document.body.appendChild(script)
})
}
async function initMap() {
if (!mapRoot) return
const ymaps3: any = await loadYMaps()
await ymaps3.ready
const { YMap, YMapDefaultSchemeLayer, YMapDefaultFeaturesLayer, YMapMarker } = ymaps3
// Координаты центра
const coordinates = mapRoot!.getAttribute('data-coordinates')
const center = coordinates!.split(',').reverse()
// Создаем слой
const layer = new YMapDefaultSchemeLayer({
customization: [
{
tags: {
any: ['road'],
},
elements: 'geometry',
stylers: [
{
color: '#4E4E4E',
},
],
},
{
tags: {
any: ['water'],
},
elements: 'geometry',
stylers: [
{
color: '#000000',
},
],
},
{
tags: {
any: ['landscape', 'admin', 'land', 'transit'],
},
elements: 'geometry',
stylers: [
{
color: '#212121',
},
],
},
{
tags: {
any: ['building'],
},
elements: 'geometry',
stylers: [
{
color: '#757474',
},
],
},
],
})
// Создаем карту
const map = new YMap(mapRoot, {
location: {
center,
zoom: 17,
},
showScaleInCopyrights: false,
})
// Создаем маркер
const markerElement = document.createElement('img')
markerElement.className = 'icon-marker'
markerElement.src = 'images/pin.svg'
const marker = new YMapMarker({ coordinates: center }, markerElement)
// Добавляем элементы на карту
map.addChild(new YMapDefaultFeaturesLayer())
map.addChild(layer)
map.addChild(marker)
map.setBehaviors(['drag', 'pinchZoom', 'mouseRotate', 'mouseTilt'])
}
initMap()