Диспетчер объектов
Диспетчер объектов YMaps.ObjectManager предназначен для управления видимостью объектов-оверлеев на карте. Он позволяет показывать или скрывать объекты на карте в зависимости от текущего коэффициента масштабирования и видимой области карты. Диспетчер способен одновременно управлять большим количеством объектов, обеспечивая при этом приемлемую производительность.
Принцип работы диспетчера: карта мира покрывается виртуальной сеткой с квадратными ячейками заданного размера. Объекты, которыми управляет YMaps.ObjectManager, попадают в ячейки, соответствующие их положению на карте. При перетаскивании карты и/или смене масштаба отображаются только объекты из тех ячеек, которые оказываются в пределах текущей видимой области карты. Объекты из остальных ячеек скрываются.
Внимание
Для корректной работы диспетчера, управляемые им объекты должны добавляться на карту только с помощью метода диспетчера add().
Чтобы создать диспетчер объектов, используйте конструктор класса YMaps.ObjectManager(). Полученный объект добавьте на карту как объект-оверлей:
var objManager = new YMaps.ObjectManager();
map.addOverlay(objManager);
Чтобы добавить или удалить объекты из диспетчера используйте методы add(), remove() и removeAll().
Чтобы добавить объект в диспетчер с помощью метода add() укажите следующие параметры:
- ссылку на добавляемый объект;
- минимальный уровень масштабирования, на котором виден объект;
- максимальный уровень масштабирования, на котором виден объект.
Например:
objManager.add(new YMaps.Placemark(new YMaps.GeoPoint(37.7,55.7)), 10, 12);
Пример ниже демонстрирует работу диспетчера объектов. В зависимости от текущего коэффициента масштабирования, на карте будет показано различное количество меток разных цветов: для коэффициентов меньше восьми будет показана одна белая метка, от восьми до десяти - десять меток красного цвета, от одиннадцати и выше - сто меток фиолетового цвета. Координаты меток вычисляются с помощью генератора псевдослучайных чисел Math.random()
.
// Создает диспетчер объектов и добавляет его на карту
var objManager = new YMaps.ObjectManager();
map.addOverlay(objManager);
// Добавляет объекты в диспетчер
objManager.add(getPoints(1, "default#whitePoint" ), 1, 7);
objManager.add(getPoints(10, "default#redPoint" ), 8, 10);
objManager.add(getPoints(100, "default#violetPoint" ), 11, 16);
// Генерирует заданное количество меток
function getPoints(count, sKey){
var arrPoints = [],
bounds = map.getBounds(),
pointLb = bounds.getLeftBottom(),
span = bounds.getSpan();
// Размещает метки случайным образом в текущей видимой области карты
for (var i = 0; i < count; i++) {
var point = new YMaps.GeoPoint(pointLb.getLng() + span.x * Math.random(),
pointLb.getLat() + span.y * Math.random());
arrPoints.push(new YMaps.Placemark(point, {style:sKey}));
}
return arrPoints;
}