Клуб API Карт

Кластеризация в RemoteObjectManager

ivan-zykov
8 сентября 2015, 22:33
Добрый день!

Нигде не смог найти работающий пример серверной кластеризации в RemoteObjectManager. В моём случае при зумировании карты метки не открываются, на карте только кластер...

Кластеризация происходит автоматически или по событию? Помогите разобраться...
12 комментариев
Подписаться на комментарии к посту

В статье на хабре есть пример и ссылка на репозиторий

http://habrahabr.ru/company/yandex/blog/243665/

Спасибо, но вопрос не в том, как сформировать массив json с кластеризацией, а как отобразить их на карте.

Меня с толку сбил Пример JSON-описания объектов: https://tech.yandex.ru/maps/doc/jsapi/2.1/dg/concepts/remote-object-manager/about-docpage/

Там есть описание кластера:

 {
type: 'Cluster',
id: 1,
bbox: [[35, 46], [46, 57]],
number: 34,
// Массив, описывающий 34 объекта в составе кластера.
// Необязательное поле.
features: [...],
geometry: {
type: 'Point',
coordinates: [40.5, 51]
},
properties: {
iconContent: 34
}
},

С толку меня сбило наличие массива features: [...], в котором описываются, как я понял, собственно, сами метки на карте. Я решил, что при масштабировании они будут показываться, но этого не произошло. Тогда возникает вопрос: как этот массив используется?

https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/RemoteObjectManager-docpage/

 


// Если поле не задано, у кластера по клику будет открываться пустой балун.

 

Это поле нужно только для формирования стандартного балуна кластера.

ИМХО не имеет смысла использовать, т.к. при большом количестве объектов это не жизнеспособно – JSON будем слишком большой.

То есть это исключительно для подсчёта количества дочерних элементов? Ну, тогда проще количество подсчитывать запросом в БД...

Спасибо за подсказку, Вы помогаете мне не в первый раз.

Если не сложно, задам ещё пару вопросов. В какую сторону смотреть, чтобы сделать у маркера кластера подпись снизу, и навесить какое-нибудь событие при клике? Это всё с учётом использования RemoteObjectManager.
Нет, количество это поле "number"
Это для вывода данных этих геообъектов в балуне.

События слушать на коллекции clusters,
и через нее модифицировать содержимое иконки кластера через опцию iconContentLayout
Слушать, как я понимаю, как-то так:


remoteObjectManager.clusters.events.add('click', function (e) {
    alert(e.get('objectId'));
});

А как получить другие нужные мне свойства меток?
Ну это же кластер, он создается динамически. Какие св-ва вам нужны, можно сложить в properties кластера

remoteObjectManager.clusters.getById(e.get('objectId')).properties
Вроде бы разобрался с событиями и со своими свойствами:


remoteObjectManager.clusters.events.add('click', function (e) {
    console.log(remoteObjectManager.clusters.getById(e.get('objectId')).properties.title);
    remoteObjectManager.clusters.setClusterOptions(e.get('objectId'), {preset: 'islands#redClusterIcons'});
});

Могу менять цвет метки при клике, но в этом мне необходимости нет. Просто, так сказать, научился.
Но как вывести подписи ко всем загруженным на карте кластерам, я не понял... Помогите, пожалуйста.
куда вывести? какие подписи?
Нужно вывести текст под метку кластера. Подпись берётся из remoteObjectManager.clusters.getById(e.get('objectId')).properties.title.

Суть задачи состоит в том, чтобы через ROM на мелких масштабах пользователь видел лишь кластеры с количеством меток и подписью, а при приближении массив JSON будет выдавать уже не кластеры, а сами метки.

Кроме того при клике на кластер должны загружаться только определённые метки. Получается, нужно при клике как-то в ROM передавать параметр, по которому серверный скрипт уже сформирует нужный массив. Я подумал, что можно добавлять параметр в адресную строку браузера и обновлять ROM. Или есть другие решения?
Буду рад, если Вы мне поможете.
Насчет подписи – стандартные метки скажем так не очень заточены под разные модификации.
Надо писать свой макет

Насчет параметра – надо наверное не в адресную строку браузера его добавлять, а в шаблон урла ROM и перезагружать данные