Клуб API Карт

Список видимых на данный момент меток

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

Добрый вечер

 

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

Причём так, чтобы при передвижении по карте список обновлялся (оставались лишь те, что видны на карте).

 

Это возможно сделать? И каким образом? 

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

var addedObjects;

 

function getChild (collection) {

collection.each(function (childObject) {

if (!childObject.each) {

addedObjects.push(childObject);

} else {

getChild(childObject);

}

});

}

 

map.events.add('boundschange', function() {

addedObjects = [];

getChild(map.geoObjects);

console.log(addedObjects);

});

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

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

Благодарю) У меня как раз все метки через кластеризатор добавлены

Попробую сейчас... Получается, что в массиве addedObjects что лежит? 

Там имена видимых меток? 

Нет, в массиве будут сами метки.

Максим Горчаков
28 января 2016, 04:36

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

Способ очень даже интересный...) Благодарю 

А... как узнать координаты и размер видимой области?

У меня карта растягивающаяся 

Максим Горчаков
28 января 2016, 04:36

map.getBounds() получает координаты 2ух углов. Размер можно посчитать по полученным координатам.

Благодарю! )))

Сразу несколько вопросов возникло) 

 

А как забрать значения переменных из этой функции? Чтобы отдельно были координаты все?

И как завести обработчик события, чтобы вызывалась функция при перемещении карты и при смене масштаба? 

Максим Горчаков
28 января 2016, 04:36

Вы выведите то, что эта функция вернула через console.log(map.getBounds()); и посмотрите как там данные выглядят. От сюда узнаете как их взять. По памяти могу сказать, что там массив, его даже разбирать не нужно. Просто использутей нужные индексы, например bounds[0][1]

 

Если у вас карта map, то событие повешать можно так:

map.events.add('boundschange', function(e){

  //тут делаем что нужно

})

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

Благодарю!!!!! Всё понял)) Ура!

Не стоит использовать данный механизм.

Лучше работать с кирпичиками тайлов

В ajaxCallback что определен в .case файле можно взять гекоординаты, из которых я создают Rectangle и именно по этим координатам запросить сервер.

Вроде мелочь, но как же приятно это будет работать.

Максим Горчаков
28 января 2016, 04:36

Не вижу в чем он хуже вашего. Страница от этого грузиться дольше не будет из-за использования тогоже ajax для передачи координат прямоугольника. А вы изобрели велосипед какой-то. Для чего мудрить, если api сразу дает 2 координаты. Просто ширина и долгота точек должна быть больше одной и меньше другой. Это все что нужно, чтобы поместить нужные точки в прямоугольник. Вы же чего-то там определяете по несколько раз. А то получается, что вы математическую задачу решаете не на калькуляторе, а используете счеты, причем двигаете вы бусинки плоскогубцами :)

Максим Горчаков
28 января 2016, 04:36

a ------------ b

|                   |

c ------------ d

Вот прямоугольник, существует несколько точек, какие-то ему принадлежат, какие-то нет.

Если x и y точки больше, чем они же у точки C и меньше, чем у точки B, то точка принадлежит прямоугольнику. Что же может быть проще?

Что будет если я сдвину карту.

Что будет если на карту зашло 1000 человек, а сервер один.

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