YMap
Класс YMap
создает все необходимые элементы карты и представляет базовый контейнер для вкладывания в него других сущностей. Класс позволяет себя уничтожить, при необходимости.
Создание карты
Для создания карты в конструкторе класса необходимо:
- указать HTML-элемент, в котором будет размещена карта;
- инициализировать карту через параметр карты
location
.
<head>
<script>
ymaps3.ready.then(() => {
// HTML-элемент.
const map = new ymaps3.YMap(document.getElementById('first_map'), {
location: {
bounds: [[-0.118092, 51.509865], [-0.118092, 51.509865]]
}
});
});
</script>
</head>
<body>
<p>Карта</p>
<div id="first_map" style="width:400px; height:300px"></div>
</body>
Карта может быть размещена в любом блочном HTML-элементе, она полностью заполнит занимаемую ею прямоугольную область. Вычисление размеров этой области производится при помощи ResizeObserver
.
Уничтожение карты
Для уничтожения карты из DOM используется метод destroy()
.
// Уничтожение карты.
map.destroy();
HTML-элемент, который был указан при создании карты, из DOM-дерева не удаляется.
Пример создания и уничтожения карты.
Конструктор
new YMap(rootContainer, props[, children]);
Параметры конструктора
Параметр |
Тип |
required |
Описание |
|
required |
Ссылка на HTML-элемент, в котором размещается карта |
|
|
required |
Параметры карты |
|
|
- |
Дочерние элементы |
Props
Свойство |
Тип |
required |
Описание |
|
required |
Первоначальное местоположение или запрос на изменение местоположения с возможностью указания анимации. |
|
|
- |
Активные поведения. |
|
|
- |
Первоначальная камера или запрос на смену камеры с указанием продолжительности. |
|
|
|
- |
Имя css-класса контейнера карты. |
|
- |
Другие конфигурации. |
|
|
|
- |
Стратегия запрашивания активных областей на карте сразу для всего видимого экрана или по наведению указателя мыши. |
|
- |
Отступы карты. |
|
|
- |
Режим карты: |
|
|
- |
Проекция, используемая на карте. |
|
|
|
- |
Устанавливает область просмотра карты таким образом, чтобы пользователь не мог перемещаться за пределы этой области. |
|
- |
Нужно ли повторять мир по оси X. |
|
|
- |
Ограничение минимального и максимального увеличения карты. |
|
|
- |
Округление для масштабирования. Если выбрано значение |
|
|
- |
Стратегия масштабирования описывает, привязан ли центр карты к точке масштабирования или нет. |
Методы
addChild
Объекты расширяемые от класса YMapEntity
можно добавить на карту с помощью метода addChild()
, вызванного у экземпляра карты:
const {YMap, YMapLayer} = ymaps3;
// Инициализируйте карту
const map = new YMap(...);
// Инициализируйте слой
const layer = new YMapLayer(...);
// Добавьте этот слой на карту
map.addChild(layer);
Параметры
Параметр |
Тип |
required |
Описание |
|
required |
Сущность добавляемая на карту. |
|
|
|
- |
YMap
Возвращается экземпляр карты типа removeChild
Метод удаляет объект с карты.
const {YMap, YMapLayer} = ymaps3;
const map = new YMap(...);
const layer = new YMapLayer(...);
map.addChild(layer);
map.removeChild(layer);
Параметр |
Тип |
required |
Описание |
|
required |
Объект, удаляемый с карты. |
YMap
Возвращается экземпляр карты типа setLocation
Метод позволяет установить область картографирования.
// Указание центра карты и масштаба
map.setLocation({
center: [37.588144, 55.733842],
zoom: 5
});
// Указание границ видимой части карты
map.setLocation({
bounds: [[25.21, 55.27], [25.23, 55.29]]
});
Область картографирования можно изменить в любой момент.
setLocation(location: YMapLocationRequest): void {
this.update({location});
}
Примечание
Метод не меняет местоположение карты, если в него передавать объект location
с одинаковыми параметрами при каждом запросе.
Пример:
const moscow = {center: [37,55], zoom:10};
map.setLocation({location: moscow});
// масштабирование
map.update({location: moscow}); // Запрос на изменение location такой же как и последний, локация не меняется.
Параметры
Параметр |
Тип |
required |
Описание |
|
required |
Область картографирования. |
void
Возвращается update
update(changedProps
): void
Метод позволяет изменить текущее местоположение на карте.
map.update({
location: {
center: [-0.118092, 51.509865], // Центр карты.
zoom: 10, // Уровень зума.
duration: 200, // Анимация карты займет 200 миллисекунд.
easing: 'ease-in-out' // Функция анимации изменения местоположения на карте.
}
});
Примечание
Метод не меняет местоположение карты, если в него передавать объект location
с одинаковыми параметрами при каждом запросе.
Пример:
const moscow = {center: [37,55], zoom:10};
map.update({location: moscow});
// масштабирование
map.update({location: moscow}); // Запрос на изменение location такой же как и последний, локация не меняется.
Параметры
Параметр |
Тип |
Описание |
|
|
Новые значения |
void
Возвращается setBehaviors
Карта обладает набором поведений, определяющих реакцию карты на действия, производимые пользователем. Например, при перемещении курсора мыши в области показа при нажатой левой кнопке карта сдвигается вслед за курсором.
При инициализации карты ей присваивается набор поведений, который в дальнейшем можно изменить с помощью метода setBehaviors()
. Доступ к поведениям карты предоставляется через поле behaviors
.
const map = new YMap(element, {
document.getElementById('map'),
{
// ... остальные props.
behaviors: ['drag', 'pinchZoom', 'mouseTilt']
}
});
map.setBehaviors(['drag', 'pinchZoom']);
Параметры
Параметр |
Тип |
required |
Описание |
|
required |
Набор поведений. |
void
Возвращается setMode
Режим карты может быть задан как в конструкторе, так и с помощью метода setMode()
.
// Задание растрового режима в конструкторе.
const map = new YMap(
document.getElementById('map'),
{
// ... остальные props.
mode: 'raster'
}
);
// Задание векторного режима с помощью метода setMode().
map.setMode('vector');
Параметры
Параметр |
Тип |
required |
Описание |
|
required |
Режим карты. |
void
Возвращается destroy
Метод позволяет уничтожить карту.
const {YMap} = ymaps3;
const map = new YMap(...);
map.destroy();
void
Возвращается Проекционные пакеты
@yandex/ymaps3-cartesian-projection
Пакет Пакет предоставляет проекцию, с которой карта будет работать в декартовой системе координат.
Установка и использование пакета
npm install --save @yandex/ymaps3-cartesian-projection
Чтобы использовать декартову проекцию, импортируйте ее:
import {Cartesian} from '@yandex/ymaps3-cartesian-projection';
const projection = new Cartesian([
// Эти границы определяют границы карты мира в декартовой системе координат.
[-400, -600],
[400, 600],
]);
console.log(projection.toWorldCoordinates([-400, 600])) // {x: -1, y: 1}
console.log(projection.toWorldCoordinates([200, 0])) // {x: 0.5, y: 0}
console.log(projection.toWorldCoordinates([0, -75])) // {x: 0, y: -0.125}
console.log(projection.fromWorldCoordinates({x: -1, y: 1})) // [-400, 600]
console.log(projection.fromWorldCoordinates({x: 0.5, y: 0})) // [200, 0]
console.log(projection.fromWorldCoordinates({x: 0, y: -0.125})) // [0, -75]
Вы можете использовать CDN с обработчиком загрузки модуля в JS API на своей странице.
По умолчанию ymaps3.import
можно загружать собственные модули. Просто используйте ymaps3.registerCdn
и ymaps3.import
:
// зарегистрируйте CDN в `ymaps3.import`, добавьте загрузчик для пакета, указывая из какого CDN загружать
ymaps3.import.registerCdn(
'https://cdn.jsdelivr.net/npm/{package}',
'@yandex/ymaps3-cartesian-projection@latest'
);
// ...
// импортируйте пакет из CDN
const pkg = await ymaps3.import('@yandex/ymaps3-cartesian-projection');
Пример использования:
<!DOCTYPE html>
<html>
<head>
<title>Vanila example @yandex/ymaps3-cartesian-projection</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<script src="https://api-maps.yandex.ru/v3/?apikey=%APIKEY%&lang=en_US"></script>
<script src="common.js"></script>
<script>
let map = null;
main();
async function main() {
await ymaps3.ready;
const {YMap, YMapTileDataSource, YMapLayer, YMapDefaultFeaturesLayer, YMapControls} = ymaps3;
const {YMapZoomControl} = await ymaps3.import('@yandex/ymaps3-default-ui-theme');
const {YMapDefaultMarker} = await ymaps3.import('@yandex/ymaps3-default-ui-theme');
const {Cartesian} = await ymaps3.import('@yandex/ymaps3-cartesian-projection');
map = new YMap(document.getElementById('app'), getMapProps(Cartesian));
map.addChild(new YMapTileDataSource(SOURCE));
map.addChild(new YMapLayer(LAYER));
map.addChild((new YMapDefaultFeaturesLayer()));
map.addChild(
new YMapControls({position: 'right'}).addChild(new YMapZoomControl({}))
);
MARKERS.forEach(marker => {
map.addChild(new YMapDefaultMarker(marker));
});
}
</script>
<link rel="stylesheet" href="common.css" />
</head>
<body>
<div id="app"></div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>React example @yandex/ymaps3-cartesian-projection</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script crossorigin src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script src='https://api-maps.yandex.ru/v3/?apikey=%APIKEY%&lang=en_US'></script>
<script src="common.js"></script>
<script type="text/babel">
let map = null;
main();
async function main() {
const [ymaps3React] = await Promise.all([ymaps3.import('@yandex/ymaps3-reactify'), ymaps3.ready]);
const reactify = ymaps3React.reactify.bindTo(React, ReactDOM);
const {
YMap,
YMapTileDataSource,
YMapLayer,
YMapDefaultFeaturesLayer,
YMapControls
} = reactify.module(ymaps3);
const {useState, useCallback} = React;
const {YMapZoomControl} = reactify.module(await ymaps3.import('@yandex/ymaps3-default-ui-theme'));
const {YMapDefaultMarker} = reactify.module(await ymaps3.import('@yandex/ymaps3-default-ui-theme'));
const {Cartesian} = await ymaps3.import('@yandex/ymaps3-cartesian-projection');
const mapProps = getMapProps(Cartesian);
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('app')
);
function App() {
const [location, setLocation] = useState(mapProps.location);
const onClick = useCallback(() => alert('Click!'), []);
return (
<YMap {...mapProps} location={location} ref={(x) => (map = x)}>
<YMapTileDataSource {...SOURCE} />
<YMapLayer {...LAYER} />
<YMapDefaultFeaturesLayer />
<YMapControls position="right">
<YMapZoomControl />
</YMapControls>
{MARKERS.map(marker => <YMapDefaultMarker {...marker} />)}
</YMap>
);
}
}
</script>
<link rel="stylesheet" href="common.css" />
</head>
<body>
<div id="app"></div>
</body>
</html>
@yandex/ymaps3-web-mercator-projection
Пакет Пакет предоставляет проекцию Web Меркатора.
Установка и использование пакета
npm install --save @yandex/ymaps3-web-mercator-projection
Чтобы использовать декартову проекцию, импортируйте ее:
import {WebMercator} from '@yandex/ymaps3-web-mercator-projection';
const projection = new WebMercator();
console.log(projection.toWorldCoordinates([-180, 90])) // {x: -1, y: 1}
console.log(projection.toWorldCoordinates([-180, 85.051])) // ~ {x: -1, y: 1}
console.log(projection.toWorldCoordinates([90, 0])) // ~ {x: 0.5, y: 0}
console.log(projection.toWorldCoordinates([0, -23.6])) // ~ {x: 0, y: -0.135}
console.log(projection.fromWorldCoordinates({x: -1, y: 1})) // ~ [-180, 85.051]
console.log(projection.fromWorldCoordinates({x: 0.5, y: 0})) // [90, 0]
console.log(projection.fromWorldCoordinates({x: 0, y: -0.135})) // ~ [0, -23.6]
Вы можете использовать CDN с обработчиком загрузки модуля в JS API на своей странице.
По умолчанию ymaps3.import
можно загружать собственные модули. Просто используйте ymaps3.registerCdn
и ymaps3.import
:
// зарегистрируйте CDN в `ymaps3.import`, добавьте загрузчик для пакета, указывая из какого CDN загружать
ymaps3.import.registerCdn(
'https://cdn.jsdelivr.net/npm/{package}',
'@yandex/ymaps3-web-mercator-projection@latest'
);
// ...
// импортируйте пакет из CDN
const pkg = await ymaps3.import('@yandex/ymaps3-web-mercator-projection');
Пример использования:
<!DOCTYPE html>
<html>
<head>
<title>Vanila example @yandex/ymaps3-web-mercator-projection</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<script src="https://api-maps.yandex.ru/v3/?apikey=%APIKEY%&lang=en_US"></script>
<script src="common.js"></script>
<script>
let map = null;
main();
async function main() {
await ymaps3.ready;
const {YMap, YMapTileDataSource, YMapLayer, YMapDefaultFeaturesLayer} = ymaps3;
const {YMapZoomControl} = await ymaps3.import('@yandex/ymaps3-default-ui-theme');
const {YMapDefaultMarker} = await ymaps3.import('@yandex/ymaps3-default-ui-theme');
const {WebMercator} = await ymaps3.import('@yandex/ymaps3-web-mercator-projection');
const projection = new WebMercator();
map = new YMap(document.getElementById('app'), {
location: LOCATION,
projection: projection
});
map.addChild(new YMapTileDataSource(SOURCE));
map.addChild(new YMapLayer(LAYER));
map.addChild(new YMapDefaultFeaturesLayer());
map.addChild(new YMapDefaultMarker(MARKER));
}
</script>
<link rel="stylesheet" href="common.css" />
</head>
<body>
<div id="app"></div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>React example @yandex/ymaps3-web-mercator-projection</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<script crossorigin src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script crossorigin src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script src='https://api-maps.yandex.ru/v3/?apikey=%APIKEY%&lang=en_US'></script>
<script src="common.js"></script>
<script type="text/babel">
let map = null;
main();
async function main() {
const [ymaps3React] = await Promise.all([ymaps3.import('@yandex/ymaps3-reactify'), ymaps3.ready]);
const reactify = ymaps3React.reactify.bindTo(React, ReactDOM);
const {YMap, YMapTileDataSource, YMapLayer, YMapDefaultFeaturesLayer} = reactify.module(ymaps3);
const {useState, useCallback} = React;
const {YMapZoomControl} = reactify.module(await ymaps3.import('@yandex/ymaps3-default-ui-theme'));
const {YMapDefaultMarker} = reactify.module(await ymaps3.import('@yandex/ymaps3-default-ui-theme'));
const {WebMercator} = await ymaps3.import('@yandex/ymaps3-web-mercator-projection');
const projection = new WebMercator();
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('app')
);
function App() {
const [location, setLocation] = useState(LOCATION);
const onClick = useCallback(() => alert('Click!'), []);
return (
<YMap location={location} projection={projection} ref={(x) => (map = x)}>
<YMapTileDataSource {...SOURCE} />
<YMapLayer {...LAYER} />
<YMapDefaultFeaturesLayer />
<YMapDefaultMarker {...MARKER} />
</YMap>
);
}
}
</script>
<link rel="stylesheet" href="common.css" />
</head>
<body>
<div id="app"></div>
</body>
</html>