Изменение размера ячейки кластеризатора
При добавлении большого числа меток на карту их кластеризация позволяет избежать большой потери производительности браузера при их отображении.
Для сравнения в данном примере на карту можно добавить метки, объединенные как в кластеры, так и в обычные коллекции.
index.html
clusterer_gridSize.js
<!DOCTYPE html>
<html>
<head>
<title>Изменение размера ячейки кластеризатора</title>
<meta
http-equiv="Content-Type"
content="text/html; charset=utf-8"
/>
<!--
Укажите свой API-ключ. Тестовый ключ НЕ БУДЕТ работать на других сайтах.
Получить ключ можно в Кабинете разработчика: https://developer.tech.yandex.ru/keys/
-->
<script
src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&apikey=<ваш API-ключ>"
type="text/javascript"
></script>
<script
src="https://yandex.st/jquery/2.2.3/jquery.min.js"
type="text/javascript"
></script>
<script src="clusterer_gridSize.js" type="text/javascript"></script>
<style>
body,
html {
font-family: Arial;
font-size: 14px;
width: 100%;
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 75%;
}
.inputs {
padding: 5px;
}
</style>
</head>
<body>
<div class="inputs">
Количество меток:
<input type="text" size="6" id="count" value="100" /> <br />
<input type="checkbox" id="useClusterer" /> Использовать
кластеризатор<br />
<input
type="button"
value="Добавить на карту"
id="addMarkers"
/>
<input
type="button"
value="Удалить все метки"
id="removeMarkers"
/>
</div>
<div id="map"></div>
</body>
</html>
ymaps.ready(init);
function init() {
var myMap = new ymaps.Map(
"map",
{
center: [63.369315, 105.440191],
zoom: 3,
},
{
searchControlProvider: "yandex#search",
}
);
// Создаем кластеризатор c красной иконкой (по умолчанию используются синяя).
var clusterer = new ymaps.Clusterer({
preset: "islands#redClusterIcons",
}),
// Создаем коллекцию геообъектов.
collection = new ymaps.GeoObjectCollection(),
// Дополнительное поле ввода при включенном режиме кластеризации.
gridSizeField = $(
'<div class="field" style="display: none">Размер ячейки кластера в пикселях: <input type="text" size="6" id ="gridSize" value="64"/></div>'
).appendTo(".inputs");
// Добавляем кластеризатор на карту.
myMap.geoObjects.add(clusterer);
// Добавляем коллекцию геообъектов на карту.
myMap.geoObjects.add(collection);
$("#useClusterer").bind("click", toggleGridSizeField);
$("#addMarkers").bind("click", addMarkers);
$("#removeMarkers").bind("click", removeMarkers);
// Добавление меток с произвольными координатами.
function addMarkers() {
// Количество меток, которое нужно добавить на карту.
var placemarksNumber = $("#count").val(),
bounds = myMap.getBounds(),
// Флаг, показывающий, нужно ли кластеризовать объекты.
useClusterer = $("#useClusterer").is(":checked"),
// Размер ячейки кластеризатора, заданный пользователем.
gridSize = parseInt($("#gridSize").val()),
// Генерируем нужное количество новых объектов.
newPlacemarks = createGeoObjects(placemarksNumber, bounds);
if (gridSize > 0) {
clusterer.options.set({
gridSize: gridSize,
});
}
// Если используется кластеризатор, то добавляем кластер на карту,
// если не используется - добавляем на карту коллекцию геообъектов.
if (useClusterer) {
// Добавлеяем массив меток в кластеризатор.
clusterer.add(newPlacemarks);
} else {
for (var i = 0, l = newPlacemarks.length; i < l; i++) {
collection.add(newPlacemarks[i]);
}
}
}
// Функция, создающая необходимое количество геообъектов внутри указанной области.
function createGeoObjects(number, bounds) {
var placemarks = [];
// Создаем нужное количество меток
for (var i = 0; i < number; i++) {
// Генерируем координаты метки случайным образом.
coordinates = getRandomCoordinates(bounds);
// Создаем метку со случайными координатами.
myPlacemark = new ymaps.Placemark(coordinates);
placemarks.push(myPlacemark);
}
return placemarks;
}
// Функция, генерирующая случайные координаты
// в пределах области просмотра карты.
function getRandomCoordinates(bounds) {
var size = [
bounds[1][0] - bounds[0][0],
bounds[1][1] - bounds[0][1],
];
return [
Math.random() * size[0] + bounds[0][0],
Math.random() * size[1] + bounds[0][1],
];
}
// Показывать/скрывать дополнительное поле ввода.
function toggleGridSizeField() {
// Если пользователь включил режим кластеризации, то появляется дополнительное поле
// для ввода опции кластеризатора - размер ячейки кластеризации в пикселях.
// По умолчанию размер ячейки сетки равен 64.
// При отключении режима кластеризации дополнительное поле ввода скрывается.
gridSizeField.toggle();
}
// Удаление всех меток с карты
function removeMarkers() {
// Удаляем все метки из кластеризатора.
clusterer.removeAll();
// Удаляем все метки из коллекции.
collection.removeAll();
}
}