Клуб API Карт

Подгрузка меток в видимую область карты по событию масштабирования или перемещения

ya.prostorobot
26 сентября 2011, 01:29

Доброго времени суток.

 

Есть довольно интересный сервис по поиску банкоматов http://bankomap.com.ua/, реализован с использованием Google Map.

Большим его преимуществом является то, что банкоматы подгружаются в видимую область карты по мере того как пользователь двигает карту или изменяет масштаб. Стоит задача реализовать аналогично, но на базе Yandex Map. 

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

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

Одна из проблемных ситуаций: пользователь сдвинул карту вправо, для новой области подгрузились обьекты, потом снова сдвинул влево. И снова происходит просчет подгруженной области и загрузки на неё обьектов. (хотя область уже показывалась и обьекты на ней есть). Тобишь, хочется как-то отмечать, что эта область уже просматривалась и не нужно сюда грузить ничего.

А может этот подход с просчетом новых видимых областей в корне неверный?!

 

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

 

6 комментариев
Подписаться на комментарии к посту

прочитайте про активные области, про то как они данные кусочками грузят.

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

таким образом вы получаете дискретные кусочки которые вы можете и запрашивать по точным адресами и запоминать в скриптах браузера, чтобы не запрашивать их потом когда будет "сдвиг влево"

вариант два, как говориться, народный -

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

Но лучше конечно - отбросьте эту идею, и подгружайте данные дискретными кусочками.

 

thekashey, спасибо за совет. Активные области я уже просматривал и поначалу думал, что это поможет мне оптимально решить поставленную задачу.

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

В сервисе, который разрабатывается, есть возможность фильтровать этот список. Причем параметров несколько.

 

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

 

Если бы была возможность выводить КОНКРЕТНЫЕ  обьекты загружаемого тайла, активные области было бы отличным решением.

 

Когда я говорил про активные области - я имел в виду принципы загрузки.

Вот если вы сделаете один-большой-файл YML и скормите его построителю областей - получите кучу файлов данных и кучу картинок.

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

В моей ситуации, неплохим решением оказалась кластеризация. 

Взял решение: https://bitbucket.org/beholder/yandex.clusterer/

 

Я думаю HotSpot предпочтительно использовать, когда есть большая плотность обьектов на карте. Как пример, проект http://bankomator.ru с выводом более 11000 терминалов QIWI.

В моей ситуации, плотность небольшая, максимальное количество меток 2200. По сравнению с тем что было, сейчас летает :)

 

thekashey, спасибо за ответы.

 


тоесть началось все с загрузки, а кончилось все показом?

В целом да, начальные требования изменились по ходу поиска решения.