Клуб API Карт

Вывод большого количества меток на карту

Пост в архиве.

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

имеется файл (один массив json) с метками (примерно 2500шт), понятно, что через $.getJSON выводить файл с 500кб меток - ужас и дилетанство(чукча не прогаммист). Используется кластеризатор.

 

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

Планируется пополнять и редактировать json данные, добавлять новые ключи к объектам в массиве.

карта: http://utata.ru/m/

статичный json файл: http://utata.ru/m/points.json

10 комментариев

1. Сколько данных будет в итоге?

2. Сколько "поверхности" покроют

От различных вариантов ответов на эти два вопроса зависит выбор оптимального способа передачи данных.

1. Точно не могу ответить, но знаю, что потихоньку будет увеличиваться. (обслуживаемые дома)

2. Москва + Московсткая область (то, что сейчас вне - будет правиться, некоторые координаты будут выставляться ручками).

Если у вас на самом деле нету точек за пределами МО то самым оптимальным вариантом будет держать два файла.

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

Второй хранит данные по самим домам и подключается когда "нужен"

В зависимости от колличества домом, функции этой карты и вашего желания можно "второй" файл загружать частями - например разрезать его на тайлы. Тут потребуется некую динамическую ручку написать.

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

Повод есть, желающие, кажись, тоже.

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

Еще подскажите как быть с несколькими массивами?

Например использовать несколько массивов по городам

[

{"город1":

{"street": "street1", "house": "1", "lat": "55", "lon": "38"}, 

{"street": "street2", "house": "1", "lat": "55", "lon": "38"}

},

{"город2": 

{"street": "street1", "house": "1", "lat": "55", "lon": "38"},

{"street": "street2", "house": "1", "lat": "55", "lon": "38"}

}, ]

всмысле, как из запрашивать на карту?

сейчас так:

for (i = 0; i < json.length; i++) {   

myPlacemark = new ymaps.Placemark([json[i].lat, json[i].lon], {

1. Возможно ли собирать от активной области?

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

2. Например использовать несколько массивов по городам

У вас есть только координаты. И еще id/uid/primary key дома - если его нет, значит нужно завести.

Если есть ID - смержить два массива очень просто. Если нет - значит id это city+street+house, или lat+lon - в общем его всегда можно "придумать"

2500 меток - не такое большое количество, оно и при текущем решении будет работать приемлемо

Несколько приемов для ускорения работы:

1. Загружать данные не целиком, а партиями (по 1000 например) и заполнять кластеризатор постепенно

2. Загружать сначала только координаты меток, а при открытии балуна на кластере или метке подгружать содержимое балуна метки - облегчится объем изначального файла

А можете примеры таковой работы привести?, новичок=(

 

ну из-за 2500 - меток - ощущается долгая загрузка карты

Готовых примеров на эту тему у нас нет.

В целом идея простая - разбейте ваш исходный файл на три части и для всех трех вызывайте подгрузку через getJson по таймауту. После этого выполняйте ровно те же действия, что делаете сейчас.

Динамическую загрузку данных в балун можно посмотреть в песочнице - http://api.yandex.ru/maps/jsbox/balloon_ajax