Я мог бы подумать о том, чтобы сделать это более или менее точно так, как Google подает листы карты - вместо того, чтобы загружать данные для всего окна просмотра сразу, разделите всю карту на квадратные области (хотя, вероятно, большие области, чем плитки Google 256x256),определить, какие области находятся в текущем окне просмотра, и загрузить данные для этих областей.Когда пользователь перемещает и масштабирует карту, проверьте границы области просмотра, чтобы увидеть, появились ли новые области в кадре, и загрузите их по мере необходимости.Примерный псевдокод:
var cache = {}
function onViewportChange() {
// get new bounds
var bounds = map.getBounds();
// identify all the areas in the bounds
var areas = getAreas(bounds);
areas.forEach(function(area) {
if (area.key in cache) {
// do nothing, or load items from cache
} else {
// load new data, storing the key (and maybe the data)
// to the cache
}
})
}
function getAreas(bounds) {
/* given a set of bounds, return an array of objects like:
[
{
x: 1,
y: 2,
zoom: 4,
key: "4-1,2",
bounds: b // lat/lon bounds of this area
},
...
]
*/
}
(см. Google объяснение координат карты и в этом примере для идеи о том, как реализовать getAreas
.)
Привлекательность этого в том, что области, которые вы извлекаете, намного проще, и становится очень легко проверить, загружены ли вы уже данные для данной области - каждая область может иметь простой уникальный ключ, вероятно, строкусделан из координат x / y / zoom, и при загрузке каждой новой области вы сохраняете ключ (или, возможно, ключ и данные - это зависит от того, удаляете ли вы старые данные с карты или просто оставляете их там)к некоторому объекту кэша.Затем все, что вам нужно сделать, когда область просмотра перемещается в новую область, это проверить наличие этого ключа в вашем кэше.
Недостатком является то, что вы часто можете загружать данные вне текущего окна просмотра, и вывозможно, отправив на сервер больше запросов, чем вы предложили бы в реализации.Этот метод может работать лучше всего, если вы обслуживаете разные данные при разных уровнях масштабирования - в противном случае вы можете застрять, пытаясь выбрать область кэша одного размера, которая хорошо работает при разных масштабах.