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

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

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

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

Для работы с большим числом объектов предназначены инструменты:

Инструмент

Описание

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

Работают не с геообъектами, а с их оверлеями. Оверлеи – это визуальное представление объектов на карте, и для их обработки требуется меньшее количество ресурсов, чем для обработки геообъектов. Кроме того, менеджеры создают оверлеи только для тех объектов, которые попадают в видимую область карты.

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

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

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

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

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

Если JSON-описание будет размещаться на сервере, то для добавления в ObjectManager это описание нужно самостоятельно загрузить на сторону клиента (например, с помощью функции jQuery.getJSON()).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Инструмент

Преимущества

Недостатки

ObjectManager

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

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

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

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

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

LoadingObjectManager

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

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

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

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

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

RemoteObjectManager

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

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

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

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

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

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

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

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

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