Документация
Справочник JavaScript API
2.1.50 (текущая версия)
collection
interactivityModel
Интерфейсы

Работа с большим числом объектов

Довольно часто перед пользователем API стоит задача отобразить на карте сотни и даже тысячи объектов.

Самый простой способ разместить на карте какой-нибудь объект — создать геообъект (экземпляр класса GeoObject) и добавить его на карту. С помощью геообъектов на карте можно отметить порядка сотни объектов без потери производительности.

Но если на карте нужно разместить несколько тысяч объектов, такой подход приводит к значительной потере производительности. Это связано со следующими проблемами:

  • Обработка геообъекта на стороне клиента.

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

  • Неоптимальная загрузка данных.

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

API предоставляет набор инструментов, которые решают указанные выше проблемы:

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

Ниже приведены описания этих инструментов и таблица, содержащая достоинства и недостатки каждой из них.

Преимущества и недостатки инструментов

ИнструментПреимуществаНедостатки

ObjectManager

— Нет необходимости реализовывать серверную часть.

— Позволяет фильтровать объекты при их отображении.

— Использует кластеризацию объектов на стороне клиента.

— Позволяет одновременно отрисовывать без потери производительности порядка тысячи объектов (которые попадают в область видимости).

— Необходимо самостоятельно реализовать оптимальную загрузку данных.

LoadingObjectManager

— Оптимально загружает данные с сервера.

— Позволяет фильтровать объекты при их отображении.

— Использует кластеризацию объектов на стороне клиента.

— Позволяет одновременно отрисовывать без потери производительности порядка тысячи объектов (которые попадают в область видимости).

— Необходимо реализовать серверную часть.

RemoteObjectManager

— Оптимально загружает данные с сервера.

— Может отображать результаты серверной кластеризации.

— Позволяет одновременно отрисовывать без потери производительности порядка тысячи объектов (которые попадают в область видимости).

— Необходимо реализовать серверную часть.

Слой активных областей

— Позволяет размещать на карте различные объекты: метки, круги, многоугольники и т. д.

— С сервера загружаются только необходимые данные.

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

— Сложная реализация серверной части.

— Невозможно перерисовать объект на стороне клиента. Чтобы изменить внешний вид объекта (например, при наведении курсора мыши), необходимо отправить серверу запрос за новой картинкой.

Менеджер объектов ObjectManager

Принцип работы ObjectManager заключается в следующем. На вход менеджеру подается JSON-описание всех объектов, которые должны быть размещены на карте. По заданному описанию менеджер создает оверлеи объектов (их визуальное отображение), которые затем и добавляет на карту. ObjectManager также позволяет кластеризовать объекты.

Перед началом работы с ObjectManager на сторону клиента необходимо загрузить JSON-описание объектов с удаленного сервера (например, с помощью функции jQuery.getJSON()).

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

Менеджер объектов LoadingObjectManager

Менеджер объектов LoadingObjectManager работает по такому же принципу, что и ObjectManager — по JSON-описанию объектов создает оверлеи и добавляет их на карту.

Разница между этими менеджерами заключается в следующем. ObjectManager не загружает данные с сервера — он работает только с теми объектами, которые были предварительно загружены на сторону клиента. LoadingObjectManager сам производит загрузку данных, причем только для тех объектов, которые попадают в видимую область карты.

LoadingObjectManager сохраняет загруженные данные на стороне клиента. Когда пользователь двигает карту или изменяет коэффициент масштабирования, менеджер проверяет, были ли ранее загружены данные — если нет, то подгружает их.

При использовании LoadingObjectManager необходимо самостоятельно реализовать серверную обработку данных. Так как сервер и менеджер обмениваются данными в формате JSONP, сервер должен возвращать данные для запрашиваемых объектов, обернутые в callback-функцию.

LoadingObjectManager рекомендуется использовать, когда на карте необходимо отобразить большое число объектов, но загружать их всех сразу не имеет смысла (например, когда метки покрывают весь мир, но на карте будет показана только территория одной страны).

Менеджер объектов RemoteObjectManager

Принцип работы RemoteObjectManager аналогичен принципу работы LoadingObjectManager. Основная разница между данными инструментами заключается в том, что RemoteObjectManager не кластеризует объекты на стороне клиента, но он может отображать результаты серверной кластеризации.

RemoteObjectManager сохраняет загруженные с сервера данные. Однако при изменении коэффициента масштабирования менеджер повторно запрашивает данные у сервера, даже если данные для видимой области уже были загружены ранее на другом уровне масштабирования.

Из всех трех менеджеров RemoteObjectManager позволяет достичь наибольшей производительности при работе с большим числом объектов.

Слой активных областей

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

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

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

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

Из всех четырех технологий данная технология является самой эффективной, но при этом и самой сложной в использовании.