Клуб API Карт

Все объекты кластера и поиск по ним

hustle-up
31 августа 2013, 13:20

На моей карте все объекты объединены в один кластер.

Задача

1. Выводить на карту только объекты, попадающие в текущую активную видимую область карты

(по аналогии с http://api.yandex.ru/maps/jsbox/show_visible_objects) для уменьшения нагрузки на браузер.

2. Выделять объекты в заданном радиусе от определенной точки (менять оформление метке, через preset).

 

* Использую версию карт 2.0 стабильную.

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

var points = new ymaps.Clusterer({

    gridSize: {

        $gridSize

    },

    preset: 'drop#group',

    zoomMargin: [70, 10, 10, 450]

});

myMap.geoObjects.add(points);

 

var count = coord.length;

for (var i = 0; i < count; i++) po[i] = new ymaps.Placemark([coord[i]

    ['lat'], coord i]['lon']], {

    id: coord i]['id']

}, {

    preset: 'd'

});

 

points.add(po);

 

var circle = new ymaps.Circle([[ymaps.geolocation.latitude, ymaps.geolocation.longitude], 50000], null);

myMap.geoObjects.add(circle);

 

  

Попытался для поиска получить все объекты из кластера разными методами, никак не могу решить поставленную задачу.
ymaps.geoQuery(points.getGeoObjects()).searchInside(circle);

или

points.geoObjects.searchInside(circle);
points.getGeoObjects() -- консоль в Chrome заявляет о несуществовании фукнции, хотя она есть в документации.
7 комментариев
Подписаться на комментарии к посту

Этот метод есть у кластеров, но не у кластеризатора

задачу 1 за вас решает кластеризатор , он итак удаляет с карты объекты вне области видимости

2. Что если метка входит в кластер? Чему вы будете менять preset?

Видимо, я не доконца догоняю как устроена работа карт и API.

Я предполагал, что есть набор геообъектов, который мы добавляем в кластер с одним preset'ом, затем часть из них по определенному параметру изменить.

** из Вашего вопроса могу сделать вывод, что в момент, когда метка геообъекта не показана на карте, то она не существует?

 

Вижу три места, где возможно произвести подобное приобразование.

1. при создании объектов устанавливать дополнительные рассчеты и условия и сразу создавать с другим preset

2. отфильтровать массив с геообъетами перед добавлением в кластер

3. отфильтровать геообъекты после добавления в кластер, соответсвтенно, выбрав

 

** именно третий я посчитал, наиболее приемлимым, потому что думал что один фильтр будет сразу решать две задачи.

Правильно ли я понял, что третий вариант не реализуем?

Дополню ответ Димы.

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

var visibleObjects = [],

     it = points.getIterator(),

    obj;

while (obj == it.getNext()) {

    visibleObjects.push(obj);

}

// Мы получили массив из меток и кластеров, видимых на карте.

// Теперь нужно получить объекты, попадающие в круг.

var insideCircle = ymaps.geoQuery(visibleObjects).searchIntersect(circle);

// Теперь нужно найти кластеры и перекрасить их

var clusters = insideCircle.search('properties.geoObjects').setOptions('icons', ymaps.option.presetStorage.get('twirl#redClusterIcons').clusterIcons);

// Обычные метки тоже перекрасим

insideCircle.remove(clusters).setOptions('preset', 'twirl#redIcon');

спасибо

Хотелось бы ещё раз уточнить, прямым вопросом на ДА / НЕТ...

 

При использовании кластеров выводятся только те геообъекты, которые попадают в текущую активную видимую область карты?!


* что в этом примере реализовано через постоянную фильтрацию http://api.yandex.ru/maps/jsbox/show_visible_objects

На карту физически добавлены только те объекты, которые попадают в видимую область карты (с небольшими зазорами)

спасибо!