Страница 1 из 1

OpenLayers: кэширование

Добавлено: 07 окт 2009, 11:47
oneDBA
Здравствуйте.

Как можно решить следующую задачу?

Создаем слой TMS. Сервер в завимости от запрашиваемой в url (например, запросом "http://example.com?b=00000033,00000032,03", в котором первые два числа обозначают нужную область, а третье уровень зума.). картой области возвращает картинки, которые заполняют видимую область карты.
При сдвиге карты захватом и перемещением карты левой кнопкой мыши, подгружаются с сервера новые картинки на карту. При частых сдвигах карты следует кэшировать картинки в браузере, для увеличения быстродействия.
Для реализации кэша, на сервере в сессии храниться массив, ключем которого является запрашиваемая область, а значением - время последнего возвращения картинки. В случае, если не позднее времени t для определенной области повторно запрашивалась картинка отправляется http-заголовок: "HTTP/1.1 304 Not Modified". При перезагрузке карты кэш очищается.

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

Re: OpenLayers: кэширование

Добавлено: 07 окт 2009, 11:58
Mavka
Записывать информацию в массив только когда картинка будет полностью загружена и положена в кэш.

Re: OpenLayers: кэширование

Добавлено: 07 окт 2009, 13:29
oneDBA
Mavka писал(а):Записывать информацию в массив только когда картинка будет полностью загружена и положена в кэш.
Спасибо. Попробую воспользоваться обработчиком события loadend класса OpenLayers. Layer для этого.