Группировка объектов

Однотипные объекты-оверлеи можно объединить в группу, а затем оперировать этой группой как единым целым: отображать/скрывать объекты, одновременно производить действия над всеми членами группы, и т. д.

Для совершения действий над группой объектов используйте методы класса YMaps.GeoObjectCollection. Ниже приведены примеры основных действий:

Пример ниже демонстрирует использование методов YMaps.GeoObjectCollection. Пример добавляет на карту Москвы несколько перетаскиваемых меток. При перемещении метки за пределы МКАД (обозначена с помощью многоугольника), метка удаляется с карты.

Открыть пример в новом окне

Создание группы

В примере показано, как создать группу из 10 меток и добавить ее на карту одной командой:

var bounds = map.getBounds(),
    pointLb = bounds.getLeftBottom(),
    span = bounds.getSpan();

var gCollection = new YMaps.GeoObjectCollection();

for (var i = 0; i < 10; i++) {
    var point = new YMaps.GeoPoint(pointLb.getLng() + span.x * Math.random(),
                                   pointLb.getLat() + span.y * Math.random());
    var placemark = new YMaps.Placemark(point);
    gCollection.add(placemark);
}

map.addOverlay(gCollection);

Открыть пример в новом окне

Добавление и удаление объекта из группы

Чтобы добавить объект (или массив объектов) в группу используйте метод add():

// Добавляет одиночный объект в группу
gCollection.add(new YMaps.Placemark(new YMaps.GeoPoint(37.554265,55.71554)));

// Добавляет массив объектов в группу
gCollection.add([
    new YMaps.Placemark(new YMaps.GeoPoint(37.518234,55.708937)),
    new YMaps.Placemark(new YMaps.GeoPoint(37.514146,55.722294))
]);

Чтобы удалить объекты из группы используйте метод remove():

var placemark = new YMaps.Placemark(new YMaps.GeoPoint(37.554265,55.71554));

// Добавляет объект в группу
gCollection.add(placemark);

// Удаляет объекта из группы
gCollection.remove(placemark);

Подсчет количества объектов в группе

Чтобы узнать общее количество объектов в группе, вызовите метод length().

var length = gCollection.length();

Доступ к отдельным объектам группы

Используйте методы get() (возвращает объект из группы по его индексу) и filter() (возвращает массив объектов, удовлетворяющих некоторому условию).

gCollection.get(0) // Первый объект 
gCollection.get(5) // Шестой объект 
gCollection.get(-1) // Последний объект 
gCollection.get(-3) // Третий объект с конца

// Осуществляет рекурсивный отбор объектов с заданным значением свойства
var filteredObj = 
gCollection.filter(function (obj) {
    return obj.property == "filter";
});

Вызов пользовательской функции для объектов группы

Чтобы выполнить какие-либо действия над всеми элементами группы, используйте метод forEach(). Метод позволяет вызвать указанную пользовательскую функцию для каждого объекта группы.

gCollection.forEach(function (obj, objIndex, group) {
    // Набор действий
});

Задание стиля для группы объектов

Чтобы задать единый стиль всем элементам группы, передайте ключ (или указатель) стиля в качестве параметра в конструктор класса YMaps.GeoObjectCollection. Указанный стиль будет автоматически применен ко всем объектам группы, например:

var gCollection = new YMaps.GeoObjectCollection("default#greenPoint");

Открыть пример в новом окне

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

// Устанавливает зеленый значок в качестве стиля группы меток
var gCollection = new YMaps.GeoObjectCollection("default#greenPoint");
gCollection.add([
    // У этой метки установлен индивидуальный стиль (красный значок), 
    // являющийся более приоритетным, чем стиль группы
    // Соответственно, метка отобразится красным значком
    new YMaps.Placemark(new YMaps.GeoPoint(37.518234,55.708937), {style: "default#redPoint"}),
    new YMaps.Placemark(new YMaps.GeoPoint(37.514146,55.722294))
]);