Клуб API Карт

Когда все тайлы загрузились?

toivonens
16 июля 2009, 18:26

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

Хочется запомнить номера этих тайлов, а потом производить некоторые действия над этой "пачкой". Запоминать понятно как. Но не понятно, когда начинать производить действия. Как понять, что все нужные тайлы уже загрузились и пора что-то делать?

У меня есть перменная-счётчик. При вызове тайловой функции onAddToMap я её увеличиваю, а при вызове функции load - уменьшаю. Если переменная становится нулём - это сигнал к действию.

Такой способ кошерен? Или надо делать как-то по-другому?

7 комментариев
Подписаться на комментарии к посту
Такой способ ненадежный.

Вы можете реализовать интерфейс YMaps.ITile (или воспользоваться классом YMaps.ImageTile) и... делать все, что хотите ;)

Расскажите, пожалуйста, что Вы хотите сделать. Быть может сможем найти более простое решение.
У меня есть свой слой тайлов. Но я не гружу туда картинки, этот слой воображаемый.
Когда на карте появляютя новые тайлы, я отправляю запрос на сервер "покажи мне метки для такого-то тайла". Раньше я для этого использовала метод load() от тайлов своего слоя.
Но мне не хочется за каждым тайлом ходить к серверу. Я хочу запрашивать данные пачками: подвинул пользователь карту так, что появилось 5 новых тайлов - сходить за данными для этих пяти.
Может лучше ориентироваться не на тайл, а на bounds?
Т.е. запрашивать bounds больше, чем тот, что показывается на экран (кэшировать данные). И если пользователь вышел за пределы кэшированной области, то подгружать новую порцию данных.

Такое решение Вам не подходит?
Нет, так нельзя. Решение запрашивать по тайлам принято для экономии на запросах. А если ориентироваться на bounds, то любое маленькое перемещение будет рождать запросы. К тому же "ручка" не умеет отдавать информацию по границам. Ей подавай номера тайлов и зум.
Поэтому я и сказал "Т.е. запрашивать bounds больше, чем тот, что показывается на экран (кэшировать данные)". Экономию на запросах Вы также получите.

Например, большой bounds используется на новом сервисе авторадио - Автомонитор.

Ручку можно сделать и другую тоже ;)
Не получу я экономию. Для экономии надо делать кеш. В кеш надо записывать уже загруженные метки. Т.е.  кеше должны быть заранее определённые дискретные участки карты - а это и есть тайлы.
То, что я описала в посте - позволяет собирать тайлы в пачку при загрузке карты. Но при движении всё-равно грузится по-одному. Можно, конечно смириться - первичная загрузка оптимизировалась уже. Но хочется большего.
О, я придумала. По окончании какого-нибудь действия: Update, MoveEnd, загрузка - определять тайловые координаты 4х угловых точек. Так можно узнать тайловые координаты всех видимых тайлов. Дальше смотреть, нет ли данных в кеше. Если для каких-то тайлов нет - формировать "пачку" из них, и отправлять запрос.