При изменении границ карты опрашиваю сервер, который возвращает набор точек (до 300) с координатами, которые входят в эту область. При клике по кластеру происходит приближение карты и дважды срабатывает событие boundschange, в связи с чем точки/кластеры повторно перестраиваются и происходит заметные «прыжки» меток на карте. Если использовать zoom-контролы, то событие срабатывает один раз. Использование debounce для колбека на boundschange не помогает. Как решить эту проблему?
https://jsfiddle.net/frontenddeveloping/936drznz/
Выскакивают ошибки:
Uncaught TypeError: this.builders[s] is not a function
Uncaught TypeError: Cannot read property 'setPosition' of null
Ничего не понимаю. Это для 2000 точек. Если количество уменьшить, то оно отработает как надо.
Привет!
Использую LoadingObjectManager с включенной кластеризацией. Хочу показывать балун кластеризатора с произвольным макетом и с динамически формируемым контентом. Сейчас при клике на кластеризатор карта зумится к выбранным точкам и это хорошо, когда доходим до макс. зума нужно открыть балун и заполнить его контентом. Вопрос: если отслеживать клик по кластерам
loadingObjectManager.clusters.events.add('click', function (e) {
var cluster = loadingObjectManager.clusters.getById(e.get('objectId'));
})как понять что дальше зумить уже нельзя и пора открывать балун? через
myMap.action.getCurrentState().zoom
видимо не то, т.к. значение показывается еще до окончания анимации приближения
Может другое событие отлавливать? Например, через Monitor
var activeObjectMonitor = new ymaps.Monitor(loadingObjectManager.clusters.state);
Но можно ли изменить контент балуна уже после его открытия?
Здравствуйте!
А есть ли где пример формирования кластеров и меток на сервере? Т.е. именно код как по заданным границам тайла правильно сгруппировать точки (с учетом проблемной области на границах тайлов). Поделитесь ссылочкой.
Здравствуйте. Столкнулся с проблемой. На карте имеется несколько тысяч точек, добавленных при помощи objectManager. Включена кластеризация. При клике на точку выполняется AJAX-запрос данных, после чего загруженные данные добавляются к геообъекту
objectManager.objects.events.add('balloonopen', function(e) {
var objectId = e.get('objectId');
var hasBalloonData = function(objectId) {
return objectManager.objects.getById(objectId).properties.loaded;
};
if (!hasBalloonData(objectId)) {
// getPointInfo - это AJAX-запрос данных метки
getPointInfo([objectId]).done(function(response) {
var obj = objectManager.objects.getById(objectId);
$.extend(true, obj.properties, response);
obj.properties.loaded = true;
_map.balloon.setData(obj);
});
}
});Но иногда возникает ситуация, что две точки имеют одинаковые координаты и остаются объединенными в кластер до максимального масштаба. В этом случае при клике на кластер вызывается балун кластера.
Я хочу оставить двухколоночный макет, но в правую часть выводить данные в виде кастомного макета метки, такого же, как и при клике на одиночную метку. Данные должны подгружаться так же аяксом.
Все в целом работает, данные подгружаются, но балун не меняет своего внешнего вида. И выглядит пустым (см. картинку). Каким образом добавить название метки в левую часть? Как сделать так, чтобы правая часть балуна обновлялась сразу же, а не после переключения между точками?
UPD:
Получилось сделать только так:
getPointInfo(ids).done(function(response) {
$.each(response, function(idx, pointInfo) {
var obj = objectManager.objects.getById(pointInfo.id);
$.extend(true, obj.properties, pointInfo);
obj.properties.loaded = true;
obj.properties.clusterCaption = pointInfo.title;
});
var balloonData = objectManager.clusters.balloon.getData();
objectManager.clusters.balloon.setData(balloonData);
});
Это правильный способ обновления содержимого балуна? Или можно то же самое сделать более правильно?
http://jsfiddle.net/HappyCougar/j2e2xtts/1/
Карта зависает если приблизить до уровня разбития кластера на метки. Почему так, и где ошибка?
Реализовываю серверную кластеризацию. Для большого zoom карты запрашиваю только grid с количеством данных в каждой ячейке и генерирую JSON с кластерами. Конкретные объекты для построения карты не запрашиваю.
Когда пользователь приблизился к участку карты, то grid не запрашиваю, выбираю из БД уже конкретные объекты на карте и, так как ROM не поддерживает кластеризацию на стороне клиента, то пробегаюсь еще раз по массиву объектов на сервере и группирую объекты по координатам. Далее эти группы формируют уже новые кластеры.
Итого есть кластеры просто с количеством объектов для большого zoom (массив features у кластера пустой)
И кластеры с конкретными гео-объектами для отрисовки на карте. Если координаты совпадают, то такие объекты образуют кластер (массив features не пустой).
objectManager = new ymaps.RemoteObjectManager(url + '&bounds=%b', {
geoObjectBalloonContentLayout: goodsBalloonContentLayout,
clusterBalloonItemContentLayout: goodsBalloonContentLayout,
clusterDisableClickZoom: true
});Для каждого из вида кластеров хотелось бы различного поведения при клике:
1) Для кластера на большом зуме нужно делать приближение области карты
2) Для кластера конкретных гео-объектов необходимо раскрывать балун с содержимым.
Поэтому clusterDisableClickZoom: true и кастомный обработчик клика:
objectManager.clusters.events.add('click', function (e) {
var objectId = e.get('objectId');
if (objectId.indexOf('pc_') == 0) {
objectManager.clusters.balloon.open(objectId);
} else {
var cluster = objectManager.clusters.getById(objectId);
map.setBounds(cluster.bbox);
}
});Все работает, кроме того, что балун кластера пустой, несмотря на то, что параметр clusterBalloonItemContentLayout проставлен. Балун для обычной метки тоже работает.
Пробовал отключать серверную кластеризацию и сделать то же самое на LoadingObjectManager с включенной кластеризацией на клиенте - балун работает. Что я упустил?
Первый вопрос в том, куда копать по вопросу отсутствия контента в балуне?
Второй вопрос в общей концепции. Возможно, лучше использовать несколько ROM для разных zoom?
День добрый.
Нужен работоспособный пример для API 2.1 по созданию и изменению вычисляемого атрибута iconContent для кластера, т.е. нужно иметь возможность внутри иконки кластера отображать не кол-во объектов, а значение, вычисляемое на основе свойств этих объектов вошедших в кластер.
Ранее по совету из этого клуба использовал создание пользовательского clusterIconContentLayout с переопределением метода build, но у данного решения есть огромный минус не только в избыточности и неэлегантности кода, но и в отсутствии возможности пересчитывать значение внутри метки кластера в процессе изменения объектов в его составе ибо значение внутри метки кластера формируется 1 раз при его создании, а потом уже не меняется.
Пересоздавать кластер не предлагать ибо учитывая число кластеров и объектов на карте это весьма затратная операция.
PS Когда уже введете поле clusterIconContent для кластера дабы писать в него напрямую по аналогии как у Placemark ?
Привет.
Никак не получается понять, как изменить поведение хинта. Мне нужно, чтобы он не следовал за мышкой, а показывался над меткой. Кроме того, у хинта может быть разная высота, что нужно учитывать при позиционировании. Сейчас что имею:
1) При формировании geoObject установлен флаг "openHintOnHover: false".
2) geoObject'ы объединены в кластер.
3) Для кластера добавлено событие, которое слушает "mouseenter" и "mouseleave".
4) Собственно, показ/исчезновение самого хинта уже сделано, осталось лишь правильно получить координаты и спозиционировать. Вот тут и застрял.
Кусок кода: