Клуб API Карт

Не ищет objectManager

balov100
28 января 2015, 16:14

С помощью objectManager накидываю объекты. Однако не выхоидт искать их на опреедленной области Polygon

 

var myPolygon_0 = new ymaps.Polygon([ [ [50.4170, 30.5885 ], [ 50.4209, 30.5854 ], [ 50.4275, 30.5820 ], [ 50.4321, 30.5741 ] ] ]);

objectManager = new ymaps.ObjectManager({
    clusterize: true,
    gridSize: 32
});
objectManager.objects.options.set('preset', 'islands#greenDotIcon');
objectManager.clusters.options.set('preset', 'islands#greenClusterIcons');


var collection = {...}
objectManager.add(collection);
myMap.geoObjects.add(objectManager);
   
obj = ymaps.geoQuery(objectManager.objects.getAll());

myPolygon_0.events.add('click', function () {
    var objectsInsideCircle = obj.searchInside(myPolygon_0);
    objectsInsideCircle.setOptions('preset', 'islands#redIcon');
    obj.remove(objectsInsideCircle).setOptions('preset', 'islands#blueIcon');
});

// UPD добавляем все области на карту
for(var i = 0, len = area.length; i < len; i++) {
    myMap.geoObjects.add(eval("myPolygon_"+i+""));
}
Ошибка как я понял в obj.searchInside(myPolygon_0), почему-то тут вываливается "Uncaught TypeError: undefined is not a function", ошибка выскакивает после клика по области, тоесть область коорректно отображается, клик по ней работает.
Подскажите как првильно в этом случаи искть объекты входящие в определенную область?
UPD: добавил пример http://jsfiddle.net/ptmdeq76/
14 комментариев
Подписаться на комментарии к посту
Многоугольник должен быть добавлен на карту при этом.

Да. Забыл написать это в примере, добавил только что, все области добавляются, и клик по ним срабатывает, и после клика вылитает ошибка которую писал в посте.

Тогда без живого примера трудно сказать.

Вот пирмер с которым я работаю http://jsfiddle.net/ptmdeq76/

 

По клику на областе выделенной должны метки поменять цвет на красный. Но если нажать F12, то видно какая ошибка валится вместо этого

objectManager.objects.getAll возвращает массив, содержащий хэши с описанием объектов. Такой формат входных данных geoQuery не поддерживает

Я этот код брал из документации:

https://tech.yandex.ru/maps/doc/jsapi/2.1-dev/ref/reference/objectManager.ObjectCollection-docpage/#getAll

 

var pointsInPolygon = ymaps.geoQuery(objectManager.objects.getAll()).searchInside(polygon);

Да, наш косяк. где-нибудь поправим.

Вообще там такая история - objectManager оперирует хэшами, а geoQuery - инстанциями геообъектов. Поэтому когда вы передаете объекты из ObjectManager в geoQuery, у вас создастся выборка, но внутри нее будут заново созданные объекты. То есть проставление им опций ничего менять не будет.

В общем на данный момент взаимодействие geoQuery и ObjectManager не очень продумано

Понятно. Спасибо. Переписал на обычный geoQuery и поиск по меткам. Однако как я понял ObjectManager создавался для большого количества объектов, скажите до 1000 это много объектов?


И еще, когда я включаю кластеризацию, то по клику метки меняют цвет, а кластер не меняет цвет, даже если включают в себя метки с новым цветом, можно ли как-то наследовать опцию цвета метки для цвета кластера?

До 1000 объектов с кластеризацией можно делать на обычных геообъектах.

А какое поведение в итоге нужно? Чтобы по клику на кластер он менял цвет? Или чтобы кластер имел цвет в зависимости от меток в нем?

Да, чтобы кластер менял цвет, если в нем есть хотя бы одна метка которая поменяла цвет.

Нужно переопределить метод createCluster, проверять цвет меток, из которых делается кластер и выставлять ему соответствующие опции

В документации есть пример переопределения

https://tech.yandex.ru/maps/doc/jsapi/2.1/ref/reference/Clusterer-docpage/#createCluster

Большое спасибо за помощь.

Всегда пожалуйста)