Тема
Map
new Map(container: HTMLElement | string, options: MapOptions)
Если вам не нужен полный контроль над созданием карты — обычно проще EvaMaps.create() — тонкая обёртка над Map + TileLayer с тайлами и темой по умолчанию.
Опции конструктора
| Опция | Тип | По умолчанию | Статус |
|---|---|---|---|
center | LngLatLike | — (обязательно) | ✅ |
zoom | number | — (обязательно) | ✅ |
minZoom, maxZoom | number | 0, 22 | ✅ |
zoomSnap | number | 1 | ✅ В покое зум кратен zoomSnap (0 — без привязки, дробный зум). Во время жеста (пальцы, трекпад) зум всегда дробный |
zoomControl | boolean | true | ✅ |
scaleControl | boolean | true | ✅ |
cooperative | boolean | false | ✅ Колесо мыши масштабирует карту только с Ctrl/⌘; на тач-экране один палец листает страницу, два пальца двигают карту |
cooperativeHintText | string | «Для масштабирования используйте Ctrl + колесо» | ✅ Подсказка, которая на миг появляется при игнорируемом жесте |
maxBounds | LngLatBoundsLike | — | ⏳ |
keyboard | boolean | true | ✅ Стрелки и +/− двигают и зумят карту; фокус — по клику на карту или через Tab |
doubleClickZoom | boolean | true | ✅ Зум по двойному клику/тапу. Можно выключить и на лету — setDoubleClickZoom(false) |
Методы — вид карты
| Метод | Возвращает | Статус | |
|---|---|---|---|
getCenter() | LngLat | ✅ | |
getZoom() | number | ✅ | |
getBounds() | LngLatBounds | ✅ | Видимая область |
setView(center, zoom) | this | ✅ | Мгновенно, без анимации |
setZoom(zoom, { animate? }) | this | ✅ | |
zoomIn() / zoomOut() | this | ✅ | Плавно, на 1 уровень вокруг центра |
panTo(center, { animate? }) | this | ✅ | |
panBy(dx, dy) | this | ✅ | Сдвиг в пикселях экрана |
flyTo(center, zoom, { duration? }) | this | ✅ | Плавный перелёт; при системной настройке prefers-reduced-motion — мгновенно, без анимации |
fitBounds(bounds, { padding?, maxZoom? }) | this | ✅ | Корректно работает через 180° долготы (например, для Чукотки) |
project(lngLat) / unproject(point) | Point / LngLat | ✅ | Пиксели контейнера карты ↔ географические координаты. У антимеридиана (180°, Чукотка) project() берёт ближайшую к центру карты точку, а не противоположный край мира |
getContainer() | HTMLElement | ✅ | |
setDoubleClickZoom(enabled) / getDoubleClickZoom() | this / boolean | ✅ | Включает/выключает зум по двойному клику на лету |
destroy() | void | ✅ | Снимает всё: слушатели событий, DOM-узлы, таймеры, незавершённые загрузки тайлов |
Методы — слои и события
| Метод | Статус |
|---|---|
add(layer) / remove(layer) | ✅ |
on(type, fn) / off(type, fn) / once(type, fn) | ✅ |
Полный список слоёв — в разделе «Слои», список событий — в «События».
События карты
| Событие | Данные | Статус |
|---|---|---|
load | — | ✅ Первые тайлы видимой области загружены |
click, dblclick, contextmenu | { lngLat, point, originalEvent } | ✅ |
movestart, move, moveend | — | ✅ |
zoomstart, zoom, zoomend | — | ✅ |
resize | { width, height } | ✅ |
Пример
ts
import { Map, TileLayer, Marker, Popup } from '@evamaps/sdk';
const map = new Map('map', {
center: [37.6173, 55.7558],
zoom: 12,
cooperative: true,
});
map.add(
new TileLayer({ url: 'https://evamaps.ru/v1/light/{z}/{x}/{y}{r}.png' }),
);
new Marker([37.6173, 55.7558])
.setPopup(new Popup().setText('Наш офис'))
.addTo(map);
map.on('moveend', () => {
console.log(map.getCenter(), map.getZoom());
});
// при удалении страницы/компонента
map.destroy();