Клуб API Карт

Как фильтровать метки через RemoteObjectManager?

easy-money5
9 февраля 2015, 14:26

  Есть загруженные через RemoteObjectManager объекты.

  Как можно их скрывать/показывать в зависимости от условий (фильтра)?

17 комментариев

Добрый день, на данный момент фильтрация для RemoteObjectManager не реализована. Этот функционал появится в будущих релизах

 Спасибо.

 Может подскажите в правильном ли я направлении двигаюсь?

 Сейчас получилось сделать фильтрацию через RemoteObjectManager.objects.each(...), где вызваю функцию-фильтр, кот. использует removeFromMap() и addToMap() объекта-оверлея, соответственно для скрытия и показа по условию.

  И в этом месте не могу найти, как определить показывается или нет оверлей: сейчас просто вызываю addToMap(), даже если оверлей и так показывается.

 UPD:

  Проверил: вызов addToMap() для отображаемых оверлеев приводит к созданию "висящих" дубликатов.

Вообще, по-хорошему, в RemoteObjectManager данные должны на сервере формироваться, т.е. фильтр включается в URL тайла, иначе возможны разные артефакты кластеризации.

 Не согласен, т.к. в этом случае нужно будет отправлять запросы к серверу и ждать ответа на каждое изменения фильтра. Тут же осложняется ситуация с кэшированием ответов на сервере в виду большого кол-ва вариантов фильтра.

Эм.

Для RemoteObjectManager кластера с сервера могут приходить просто в виде центр кластера + число меток. Как клиент может отфильтровать метки в кластере, если он про них ничего не знает?

Ну в кластере может быть передан список меток, и тогда фильтрация будет иметь смысл

Да, но тогда ROM не будет иметь смысла )

Ладно, вот тебе кейс.

Человек не делает на сервере кластеризацию, он просто показывает разных набор меток в зависимости от зума. При этом метки могут быть трех типов - кафе, аптека, бар.

И хочет, чтобы на карте был список чекбоксов-переключалок, чтобы можно было быстро показать только объекты из выбранной категории.

Чем не кейс? )

Ну и чем его LOM не устраивает тогда?

состав данных меняется в зависимости от зума

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

Если фильтр включен на клиенте, то клиент отфильтрует из этих 20, скажем, 15 неподходящих и покажет 5 подходящих.

Если фильтр включен на сервере — сервер пришлёт 20 подходящих.

Что совой об пень, что пнём об сову. ROM не знает полные данные о входящих в тайл объектах и не может правильно делать фильтр.

голосом поговорим)

пожалуй самым правильным будет такое решение

1. вы сохраняете где-то срез объектов, хранящихся в ROM.objects

2. Фильтруете метки и удаляете ненужные прямо из коллекции objects

 

Единственный тонкий момент - загрузка новых данных, если включен фильтр.

Нужно тогда после фильтрации слушать событие add на ROM.objects, и если очередная метка попадает под фильтрацию, запоминать ее во внешнем хранилище и удалять из коллекции objects.

Сделал почти также. Только храню список ID объектов, для которых были удалены (removeFromMap) оверлеи.

 

Оперируйте методом setMap у оверлеев, методы removeFromMap и addToMap - это хелперы, которые не заявлены в интерфейсе. Вызов этих методов напрямую может вызвать разные интересные эффекты)

Изменил - работает.

P.S.

 Пользуясь случаем, не подскажет еще ответ на http://clubs.ya.ru/mapsapi/replies.xml?item_no=54870?

отписалась