Клуб API Карт

Отображение на карте только тех объектов, которые попадают в видимую зону

giovanni10
2 февраля 2011, 22:46
Требуется сделать отображение на карте только тех объектов, которые попадают в видимую зону - т.е. те, которые попадают в ту часть карты, которую просматривает пользователь, а по мере масштабирования (увеличения и уменьшения зоны просмотра) - показывать больше объектов или меньше. А также при перемещении по карте подгружать новые объекты, а "стырые" (которые уже не видны) не грузить на кару. Требуется это так как сразу все наносить не хорошо из их большого количества. Подскажите, пожалуйста, в каком направлении искать ответ на вопрос? Заранее всем спасибо 
6 комментариев
Подписаться на комментарии к посту
Для меток можете использовать ObjectManager:
http://api.yandex.ru/maps/jsapi/doc/ref/reference/objectmanager.xml

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

Если у вас очень много объектов и ObjectManager вам не подойдет, возможно вам помогут
хотспоты: http://api.yandex.ru/maps/jsapi/doc/mod/concepts/hotspots.xml
Спасибо за ответ, полезные инструменты подсказали... но это немного не то, что хотелось бы. вот например в случае с ObjectManager - все верно - он показывает только те объекты, которые видны при текущем масштабе и положении. Но только для этого карте предварительно необходимо подгрузить все объекты. т.е. при перемещении и масштабировании карта не загружает новые объекты, а  берет из тех, что уже были ей загружены первоначально. Исходя из того, что по условию задачи необходимо, чтобы показывались первые 200 (по текущей сортировке) в каждом положении  и при каждом масштабе, то при начальной загрузке (большом масштабе) на карте будут видны все 200, а затем, при уменьшении масштаба - на карте не будет 200 объектов, так как не все первоначально загруженные в эту  область попадут, а новые не "догрузятся". 
Таким образом, при каждом масштабировании или перемещении, как мне кажется, должно инициироваться событие, в котором необходимо сделать загрузку новых объектов, а в качестве параметра должны быть переданы координаты текущей области просмотра. загрузку я сделаю стандартными средствами, а вот как получить координаты текущей области и как инициировать событие на перемещение или масштабирование - я не могу понять.
Подгружать объекты динамически можно по-разному:
1. Механизм активных областей (его вам chalyu подсказал). Это самый лучший способ, однако он не так легок в реализации. С помощью активных областей у нас на картах, например, отображается слой пробок. Кстати, есть небольшая утилита, которая по YMapsML с объектами нарезает тайлы.
2. Вывод объектов по набору тайлов. Определяете какие тайлы входят в видимую область и делаете запрос к БД для получения точек именно для этого набора тайлов. Такой механизм, например, реализован на проекте gdeetotdom.ru.
3. Отображать объекты по видимому bounds (прямоугольная область). Такой механизм используется на проекте Автомонитор у Авторадио. Примерно это реальзовано вот так.
давайте я немного раскажу про пункт 2 и чем он лучше активных областей в моменте загрузки данных.
Итак - у нас в москве 10 обьектов, и еще 10 тысяч обьектов питере.
А вы при этом смотрите в центр Москвы.

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

Вариант 3 - стандартный - вызывается для текущего размера окна карты, которое может быть у всех разное, уничтожая в общем виде кеширование( кроме одного НО*** ), также может вызывать новую подгрузку данных при малейшем сдвиге меньше некой дельты(превышения границ). Обычно эта  дельта - один пиксель. Можно его сделать 100 пикселей - тогда данные подгрузяться из границ на 100 пикселей шире( превышение ) и не потребуют обновления при сдвиге.

И есть вариант два, который может как с клиента запрашивать "хитро" так и с сервера( смотрим НО*** выше, и думаем что те операции которые я сейчас опишу на клиенте можно делать и на сервере )

Вариант 3 - запрос по пирамиде тайлов.
Вариант почти полностью аналогичен загрузке активных областей. Кроме того что адресация идет не по X-Y номеру тайла на зуме Z, а скажем так "по улитке"( или по quad-tree дереву)
В частности это значит что данные большего зума, которые лежат под тайлом меньшего зума - доступны "интуитивно" обратное тоже верно.
Весь всмысл в адресации, ну или в директорной системе ( активные области - одна директория на зум, в ней тайлы ), пункт3-пирамида-4 папки везде( один тайл разбирается на 4 других на большем зуме, повторить )..

Где разница в смысле - если Вы при выборке данных из пирамиды увидите что данных "мало" - вы можете получить данные на "уровень наверх"( стереть два байта из адреса)

В частности для начала этого комента - в москве вам достаточно будет иметь один набор данных, а вот для питера - много( на самом деле это не так, так как через мосвку проходит большой "разделитель" где-то на 6ом зуме, так что тайла будет два практически в любом варианте( берем карту мира и начинаем рекурсивно делить пополам)
Будет здорово, если напишешь пример и расскажешь об этом процессе поподробнее ;)

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