Кластеры на Яндекс Карте

Кластер на Яндекс Карте
Кластер на Яндекс Карте

Привет всем! Близко расположенные друг к другу метки создают пользователю проблему, ведь кликнуть по каждой из них не получится. Нажатие возможно только по той метке, которая окажется выше остальных.

Кластеризатор — объединение близко расположенных меток в группу (кластер), позволяет справиться с задачей.

Подробнее, как всегда, можно и обязательно нужно прочитать в документации: кластеризатор.

Кластеризатор реализуется классом Clusterer. В качестве параметров конструктору можно передать опции кластеризатора: стиль отображения значка кластера, размер его ячейки и т. д. Список доступных опций можно посмотреть в официальном разделе справочника.

Для добавления геообъектов в кластеризатор используется метод add. В качестве параметра может быть передан как отдельный геообъект, так и массив геообъектов.

Понаблюдайте за поведением кластеров, в зависимости от масштаба карты, и нажмите на кластер для просмотра меток:

В центре кластера появляется цифра — это число попавших в нее меток.

При нажатии на кластер, открываются закладки-переключатели, — это ссылки на метки, при клике по которым открывается их содержимое.

И еще добавила круг — так можно совмещать метки с выделенной областью. Например, требуется показать клиентам территорию охвата вашими услугами, тогда выделение их на карте таким способом просто замечательная идея.

JavaScript

// Кластеризатор Яндекс карты

ymaps.ready(init);

function init() {
  var myMap = new ymaps.Map('map', {
    center: [43.602943, 39.734053],
    zoom: 14,
    controls: []
  }, {
    searchControlProvider: 'yandex#search'
  });  
  
  var GeoObjects = [];
    GeoObjects[0] = new ymaps.GeoObject({
        geometry: { type: "Point", coordinates: [43.599346, 39.736640] },
        properties: {
            clusterCaption: 'ЖК Огни Сочи - 1',                    
            // Зададим содержимое заголовка балуна.
            balloonContentHeader: '<a href = "#">ЖК Огни Сочи - 1</a>',
            // Зададим содержимое основной части балуна.
            balloonContentBody: '<img src="http://lorempixel.com/200/150/city/"/>' + '<br/>' +
              '<a href="tel:+7-123-456-78-90">+7 (123) 456-78-90</a>',
            // Зададим содержимое нижней части балуна.
            balloonContentFooter: 'Информация предоставлена:<br/>OOO "Тест"',
            // Зададим содержимое всплывающей подсказки.
            hintContent: 'ЖК Огни Сочи',
            iconCaption: 'ЖК Огни Сочи'                        
        }
    });
    GeoObjects[1] = new ymaps.GeoObject({
        geometry: { type: "Point", coordinates: [43.597621, 39.736887] },
        properties: {
            clusterCaption: 'Чебрикова 48',
            balloonContentHeader: '<a href = "#">Чебрикова 48</a>',
            // Зададим содержимое основной части балуна.
            balloonContentBody: '<img src="http://lorempixel.com/200/150/city/"/>' + '<br/>' +
              '<a href="tel:+7-123-456-78-90">+7 (123) 456-78-90</a>',
            // Зададим содержимое нижней части балуна.
            balloonContentFooter: 'Информация предоставлена:<br/>OOO "Тест"',
            // Зададим содержимое всплывающей подсказки.
            hintContent: 'Чебрикова 48',
            iconCaption: 'Чебрикова 48'  
        }
    });
    GeoObjects[2] = new ymaps.GeoObject({
        geometry: { type: "Point", coordinates: [43.599874, 39.737412] },
        properties: {
            clusterCaption: 'Дагомысская 24',                    
            // Зададим содержимое заголовка балуна.
            balloonContentHeader: '<a href = "#">Дагомысская 24</a>',
            // Зададим содержимое основной части балуна.
            balloonContentBody: '<img src="http://lorempixel.com/200/150/city/"/>' + '<br/>' +
              '<a href="tel:+7-123-456-78-90">+7 (123) 456-78-90</a>',
            // Зададим содержимое нижней части балуна.
            balloonContentFooter: 'Информация предоставлена:<br/>OOO "Тест"',
            // Зададим содержимое всплывающей подсказки.
            hintContent: 'Дагомысская 24',
            iconCaption: 'Дагомысская 24'                       
        }
    });
    GeoObjects[3] = new ymaps.GeoObject({
        geometry: { type: "Point", coordinates: [43.587776, 39.733679] },
        properties: {
            clusterCaption: 'Севастопольская 8',
            balloonContentHeader: '<a href = "#">Севастопольская 8</a>',
            // Зададим содержимое основной части балуна.
            balloonContentBody: '<img src="http://lorempixel.com/200/150/city/"/>' + '<br/>' +
              '<a href="tel:+7-123-456-78-90">+7 (123) 456-78-90</a>',
            // Зададим содержимое нижней части балуна.
            balloonContentFooter: 'Информация предоставлена:<br/>OOO "Тест"',
            // Зададим содержимое всплывающей подсказки.
            hintContent: 'Севастопольская 8',
            iconCaption: 'Севастопольская 8'  
        }
    });
    GeoObjects[4] = new ymaps.GeoObject({
        geometry: { type: "Point", coordinates: [43.629505, 39.694881] },
        properties: {
            clusterCaption: 'Крымская 65',
            balloonContentHeader: '<a href = "#">Крымская 65</a>',
            // Зададим содержимое основной части балуна.
            balloonContentBody: '<img src="http://lorempixel.com/200/150/city/"/>' + '<br/>' +
              '<a href="tel:+7-123-456-78-90">+7 (123) 456-78-90</a>',
            // Зададим содержимое нижней части балуна.
            balloonContentFooter: 'Информация предоставлена:<br/>OOO "Тест"',
            // Зададим содержимое всплывающей подсказки.
            hintContent: 'Крымская 65',
            iconCaption: 'Крымская 65'  
        }
    });
    GeoObjects[5] = new ymaps.GeoObject({
        geometry: { type: "Point", coordinates: [43.640904, 39.676814] },
        properties: {
            clusterCaption: 'Ландышевая',
            balloonContentHeader: '<a href = "#">Ландышевая</a>',
            // Зададим содержимое основной части балуна.
            balloonContentBody: '<img src="http://lorempixel.com/200/150/city/"/>' + '<br/>' +
              '<a href="tel:+7-123-456-78-90">+7 (123) 456-78-90</a>',
            // Зададим содержимое нижней части балуна.
            balloonContentFooter: 'Информация предоставлена:<br/>OOO "Тест"',
            // Зададим содержимое всплывающей подсказки.
            hintContent: 'Ландышевая',
            iconCaption: 'Ландышевая'  
        }
    });

var clusterer = new ymaps.Clusterer({ 
    gridSize: 64, 
    groupByCoordinates: false,
    hasBalloon: true,
    hasHint: true,
    margin: 10,
    maxZoom: 14,
    minClusterSize: 3,
    showInAlphabeticalOrder: false,
    viewportMargin: 128,
    zoomMargin: 0, 
    clusterDisableClickZoom: true 
});
clusterer.add(GeoObjects);
myMap.geoObjects.add(clusterer);
}

About some options Clasterer

Полная документация здесь.

Clusterer

Расширяет IChildOnMapICustomizableIEventEmitterIParentOnMap.

Кластеризатор геообъектов. Кластеризует объекты в видимой области карты. Если объект не попадает в видимую область карты, он не будет добавлен на карту.

options.gridSize

Тип: Number

Значение по умолчанию: 64.

Размер ячейки кластеризации в пикселях. Значение должно быть равно 2^n (в область 256 на 256 пикселей должно умещаться ровное количество ячеек).

options.groupByCoordinates

Тип: Boolean

Значение по молчанию: false

Специальный режим работы кластеризатора, при котором кластеры образуются только из геобъектов с одинаковыми координатами.

options.hasBalloon

Тип: Boolean

Значение по умолчанию: true

Флаг наличия у кластеризатора поля .balloon. Если при клике на кластер не нужно открывать балун, рекомендуется установить эту опцию в значение false, чтобы избежать лишних инициализаций;

options.hasHint

Тип: Boolean

Значение по умолчанию: true

Флаг наличия у кластеризатора поля .hint. Если при наведении на кластер не нужно показывать всплывающую подсказку, рекомендуется установить эту опцию в значение false, чтобы избежать лишних инициализаций.

options.margin

Тип: Number|Number[]

Значение по умолчанию: 10

Число или массив чисел, задающие отступ для центра кластера относительно ячеек кластеризации. Если задано одно число — оно применяется ко всем сторонам. А если два — то это вертикальные и горизонтальные отступы соответственно. Массив из 4х чисел подразумевает отступы top, right, bottom, left.

options.maxZoom

Значение по умолчанию: Infinity

Максимальный коэффициент масштабирования карты, на котором происходит кластеризация объектов. Даже если кластеризация отключена, будут показаны только объекты в видимой области карты.

options.minClusterSize

Тип: Number

Значение по умолчанию: 2

Минимальное количество объектов, образующих кластер.

options.showInAlphabeticalOrder

Тип: Boolean

Значение по умолчанию: false

Показывать метки в балуне в алфавитном порядке при нажатии на кластер. Геообъекты кластера сортируются по специальным полям в данных этих геообъектов — clusterCaption (или balloonContentHeader, если предыдущее поле не определено). По умолчанию геообъекты показываются в порядке добавления в кластеризатор.

options.viewportMargin

Тип: Number|Number[]

Значение по умолчанию: 128

Отступ для области, в которой производится кластеризация. Кластеризация проводится для видимой области карты. С помощью данной опции область кластеризации расширяется по отношению к видимой области карты.

options.zoomMargin

Тип: Number|Number[]

Значение по умолчанию: 128

Отступы от границ видимой области карты, которые соблюдаются при приближении карты после клика на кластере. Рекомендуется устанавливать значение опции в соответствии с размером иконок кластеров и меток. Например, если метка попадает в видимую область карты только нижним концом ножки, стоит выставить ненулевой отступ top, чтобы метка оставалась полностью видна после того, как кластер распался. Одно число применяется ко всем сторонам. Два — это горизонтальные и вертикальные отступы соответственно. Массив из 4х чисел — это отступы top, right, bottom, left.

HTML:

<!--
  Укажите свой API-ключ.
  Получить ключ можно в Кабинете разработчика: https://developer.tech.yandex.ru/keys/
-->
<script type="text/javascript" src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&apikey=ваш API-ключ"></script>
<div id="map"></div>

Справочник с описанием программного интерфейса JavaScript API последней версии 2.1.72.

Кластеризация решает проблему близко стоящих меток, объединяя их в группы (кластеры) при изменении масштаба карты. Это очень удобно.

А как насчет обратной функции кластеризации — не объединения, а рассредоточения меток с заданным отступом? Недавно я получила запрос с такой задачей и смогла предложить только кластеризацию.

Есть ли у вас интересные решения с метками на карте? Напишите в комментариях! Удачи! 🙂

P.S.: Ну как, вы готовы сами установить такую карту на сайт? Если нет — обращайтесь 😉

Голосов: 0, Средняя оценка: 0
Top Юлия Волобой