Клуб API Карт

Найдено на тему «ObjectManager»:
ObjectManager, установка preset в конструкторе
dbratsun
9 ноября 2017, 15:16

Добрый день!

Можно ли пояснить причину поведения при переносе установки preset из функций objectManager.objects.options.set и objectManager.clusters.options.set в конструктор на примере из песочницы

Было

ymaps.ready(init);

function init () {
    var myMap = new ymaps.Map('map', {
            center: [55.76, 37.64],
            zoom: 10
        }, {
            searchControlProvider: 'yandex#search'
        }),
        objectManager = new ymaps.ObjectManager({
            // Чтобы метки начали кластеризоваться, выставляем опцию.
            clusterize: true,
            // ObjectManager принимает те же опции, что и кластеризатор.
            gridSize: 32,
            clusterDisableClickZoom: true
        });

    // Чтобы задать опции одиночным объектам и кластерам,
    // обратимся к дочерним коллекциям ObjectManager.
    objectManager.objects.options.set('preset', 'islands#greenDotIcon');
    objectManager.clusters.options.set('preset', 'islands#greenClusterIcons');
    myMap.geoObjects.add(objectManager);

    $.ajax({
        url: "data.json"
    }).done(function(data) {
        objectManager.add(data);
    });

}

Стало

ymaps.ready(init);

function init () {
    var myMap = new ymaps.Map('map', {
            center: [55.76, 37.64],
            zoom: 10
        }, {
            searchControlProvider: 'yandex#search'
        }),
        objectManager = new ymaps.ObjectManager({
            // Чтобы метки начали кластеризоваться, выставляем опцию.
            clusterize: true,
            // ObjectManager принимает те же опции, что и кластеризатор.
            gridSize: 32,
            clusterDisableClickZoom: true,
            preset: 'islands#greenDotIcon'
        });

    // Чтобы задать опции одиночным объектам и кластерам,
    // обратимся к дочерним коллекциям ObjectManager.
    // objectManager.objects.options.set('preset', 'islands#greenDotIcon');
    // objectManager.clusters.options.set('preset', 'islands#greenClusterIcons');
    myMap.geoObjects.add(objectManager);

    $.ajax({
        url: "data.json"
    }).done(function(data) {
        objectManager.add(data);
    });

}

Получается что опция preset при создании OM полностью игнорируется?

4 комментария
ObjectManager
Определение меток попадающих в видимую область карты и получение их ID
vikktor.com
13 октября 2017, 10:43

Решаю задачу с определением меток попадающих в видимую область карты. При изменении масштаба карты, мне надо обновлять список на список состоящий только из объектов которые видны на карте. Для создания меток использую ObjectManager (с кластеризацией)

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

Вариант 1.

// Определение объектов попадающих в видимую область карты
    myMap.events.add(['boundschange','datachange','objecttypeschange'], function(e){
        ymaps.geoQuery(objectManager.objects).searchInside(myMap).each(function (object) {
            console.log(object);
        });
    });

В этом варианте проблема в том, что geoQuery корректно отдает список меток в видимой области, но я не могу получить ID метки, который я назначал про создании списка objectManager.objects, чтобы потом сравнить со своим списком материалов из базы данных. ID метки у меня совпадает с ID материалов.

Вариант 2.

// Определение объектов попадающих в видимую область карты
    myMap.events.add(['boundschange','datachange','objecttypeschange'], function(e){
        objectManager.objects.each(function (object) {
          var objectState = objectManager.getObjectState(object.id);
          if (objectState.isShown) {
            console.log(object.id);
          }
        });
    });

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

Подскажите пожалуйста, как правильно получить назначенные при создании массива объектов ID? Либо как правильно заставить работать isShown? Или может есть другой более правильый вариант?

Спасибо.

7 комментариев
ObjectManager,GeoQueryResult,области видимости,objectState.isShown
Как изменить текст балуна объекта, добавленного через ObjectManager?
f-ph
14 сентября 2017, 04:44

Добрый день! Я создаю карту с кучей точек на ней. Точки добавляю с помощью ObjectManager:

const map = new ymaps.Map(document.getElementById('map'), {
    center: [63, 121],
    zoom: 6
});
const objectManager = new ymaps.ObjectManager({
    clusterize: true
});
objectManager.add({
    type: 'FeatureCollection',
    features: [
        {
            type: 'Feature',
            id: 1,
            geometry: {
                type: 'Point',
                coordinates: [64, 122]
            },
            properties: {
                balloonContentBody: 'Загрузка...'
            }
        },
        {
            type: 'Feature',
            id: 2,
            geometry: {
                type: 'Point',
                coordinates: [62, 120]
            },
            properties: {
                balloonContentBody: 'Загрузка...'
            }
        }
        // ...
    ]
});
map.geoObjects.add(objectManager);

Как в произвольный момент времени изменить текст балуна точки? Желательно не отказываться от ObjectManager, чтобы не жертвовать производительностью.

Пробовал так, получилось только изменить внешний вид метки:

objectManager.objects.setObjectOptions(1, {
    preset: 'islands#redIcon',
    balloonContentBody: 'Загружено (бла бла бла)',
    properties: {
        balloonContentBody: 'Загружено (бла бла бла)'
    }
});

Ещё пробовал так:

objectManager.objects.getById(1).properties.balloonContentBody = 'Загружено (бла бла бла)';

В этом случае новый текст применяется только после открытия балуна (т.е. если балун открыт, текст внутри не поменяется пока не закроешь и не откроешь балун). Есть ли способ получше?

1 комментарий
ObjectManager,Balloon
objectManager.setFilter() из input
arzanal
25 июля 2017, 08:41

Добрый день!

как реализовать фильтр чтобы

objectManager.setFilter('id ==  было равно то что я ввожу из <input type ='text' name ='id'</input>');

Пожалуйста помогите

если можно более подробным примером

СПАСИБО

2 комментария
setFilter,ObjectManager,фильтрация
Фильтрация меток по нескольким свойствам ObjectManager
Удалённый пользователь
18 июля 2017, 19:49

Весь функционал реализован с помощью ObjectManager. Объекты выгружаются из JSON, порядка 3000. Необходимо реализовать фильтрацию, по виду объекта и цене. 

Фрагмент JSON:
"properties": {
                "code": "160058",
                "cost": "8500",
                "typeObject": "home",
                "balloonContentBody": ""
            },

Кнопки с чекбоксами:
<input class="" type='checkbox' value="home" checked=true/>
<input class="" type='checkbox' value="flat" checked=true/>

function mapFilter () {
var item = $( "input[type='checkbox']" );
obj = {};
item.each(function( index ) {
  obj[$( this ).val()] = $( this ).prop('checked');
});
objectManager.setFilter(getFilterFunction(obj));
};
function getFilterFunction(categories){
    return function(obj){
        var content = obj.properties.typeObject;
        return categories[content];
    }
};
$('input[type='checkbox']').click(mapFilter);
Фильтер работает.

Необходимо еще фильтровать по цене (properties.cost) c сохранением результата первого фильтра.
function mapFilterCost () {
var costMin = $("#input_cost_min").val(),
    costMax = $("#input_cost_max").val();
objectManager.setFilter('properties.cost >= "'+costMin+'" && properties.cost <= "'+costMax+'"');
};

Подскажите как объединить два фильтра. Спасибо.

5 комментариев
ObjectManager,setFilter
Триггер события.
Тарасов Александр
2 июля 2017, 17:41

Добрый день. Никак не могу найти в документации как вызвать событие, которое  висит на метке созданной через ObjectManager. При клике по нему с сервера подгружается баллун. Необходимо программно, имея на руках объект, вызвать клик по нему.

Вот так вешал событие:

ObjectManager.objects.events.add('click'...

Вот так получил объект:

ObjectManager.objects.getById($(this).data('id'));
2 комментария
ObjectManager,event,events,fire
Как удалить обработчик событий для конкретного объекта в ObjectManager
Дракон
21 июня 2017, 01:43

Доброго времени суток.

Подскажите пожалуйста с ещё одной проблемой, которой не получается решить.
Задача простая: После события 'dblclick' на ломанную линию, которая находится в 'ObjectManager' удалить все обработчики событий, но только для указанной линии.

myObjectManager = new ymaps.ObjectManager();

myObjectManager.objects.events.add(['dblclick', 'mouseenter', 'mouseleave'], function(e)
{
	var objectId = e.get('objectId');
	
	switch( e.get('type') )
	{
		case 'dblclick':
		{
			AddID("#routes_road_id", objectId);
			
			myObjectManager.objects.setObjectOptions(objectId,
			{
				strokeColor: "00000088",
				strokeWidth: 7
			});

            // Удалить обработчик всех событий для objectId.
			
			break;
		}
		case 'mouseenter':
		{
			myObjectManager.objects.setObjectOptions(objectId,
			{
				strokeColor: "00FF0088",
				strokeWidth: 7
			});
			
			break;
		}
		case 'mouseleave':
		{
			myObjectManager.objects.setObjectOptions(objectId,
			{
				strokeColor: "FF000088",
				strokeWidth: 7
			});
			
			break;
		}
	}
});

myMap.geoObjects.add(myObjectManager);

И в догонку ещё уточняющий вопрос: Можно-ли хранить в свойствах гео объекта, который находит в 'ObjectManager' свои поля, например name, и как его получить в обработчике события?

12 комментариев
ObjectManager,events
Ajax подгрузка данных объектов в кластер
light-exo
13 июня 2017, 15:23

Имеется загрузка объектов по аяксу. Все балуны кастомные, кроме кластеров, там карусель из стандартного набора.  При клике на объект загружаются его данные. При клике на кластер идёт отслеживание изменений кластера и загружка(взял из интернетов).

Часть кода на фидле: https://jsfiddle.net/jjt4mLae/

Проблема: при открытии кластера в карусели пусто, хотя если консолью вывести объект, то заполнен параметрами, может там body иной способ имеет заполнения? 

2 комментария
AJAX,Кластеризация объектов,ObjectManager
Стрелки для линий в менеджере объектов
Удалённый пользователь
12 июня 2017, 12:39

День добрый. Для отображения стрелок на карте воспользовался примером Стрелка на карте. При отображении большого количества линий и стрелок >10000 на большом зуме стрелок становилось очень много и из-за чего карта начинала подвисать. Попробовал воспользоваться ObjectManager`ом для отображения только стрелок в области видимой карты, но к сожалению не нашёл поддержки пользовательских модулей. Вот пример Пример. Существует ли какое-нибудь решение данной проблемы?

1 комментарий
стрелки,API 2.1,ObjectManager,Ломаная
Как изменять оформление активной метки?
Elf W.
9 июня 2017, 12:26

На карте добавлено множество меток с помощью ObjectManager. Нужно сделать так, чтобы при клике на любую метку карта центр карты перемещался на метку (реализовано) и метка увеличивалась в размерах. При клике на другую метку предыдущая должна восстанавливать исходный размер и вся последовательность операций повторяться. Проблема с восстановлением исходного размера метки — не знаю, как реализовать. 

Нашел пост, где в комметарии предлагается вариант решения схожей проблемы. В моем случае такой вариант  не подошел, поскольку я не могу в получаемый json с данными для добавления в objectManager добавлять настройки для меток, да и как потом мне их переключать? Пробовал следующим образом (код обработчика клика на метке, для упрощения примем map и objectManager глобальными переменными):

function onPlacemarkClick(e) {
  const activeObject = e.get('target');
  const id = e.get('objectId');
  const coords = e.get('coords');

// перемещение карты
  map.setCenter(coords, 15, {duration: 200});

// установка параметров текущей метке
  objectManager.objects.setObjectOptions(id, {
    iconImageSize: [50, 50],
    iconImageOffset: [-25, -25]
  });

// попытка сброса параметров всем меткам в коллекции - не работает!!
  objectManager.objects.each(obj => {
    if (obj !== activeObject) {
// ругается на метод set
      obj.options.set({
        iconImageSize: [30, 30]
      })
    }
  });
}

Ругается затейливо, вот фрагмент:

Я подозреваю, что нет такого метода, но что тогда нужно использовать для реализации требуемого функционала? Или вообще сменить подход?

1 комментарий
ObjectManager,geoObjects,customize
Как правильно настроить балун для objectManager?
Elf W.
8 июня 2017, 10:35

Столкнулся с проблемой на совершенно ровном месте: не получается настроить балун для ObjectManagerʼa. Вот таким образом пытался:

const objectManager = new ymaps.ObjectManager({
    clusterize: true,
    gridSize: 32,
    clusterDisableClickZoom: true,
    clusterHasBaloon: false,
    clusterOpenBalooOnClick: false,
});
метки нет и балун есть, хотя я писал наоборот

Результат, как видно, не тот, какой задавался. Потом попробовал иначе:

const objectManager = new ymaps.ObjectManager({ 
    clusterize: true, 
    gridSize: 32, 
});
objectManager.clusters.options.set({
    preset: 'islands#blackClusterIcons',
    hasBaloon: false,
    hintContent: "Куча адресов",
    hideIconOnBaloonOpen: false,
});

Результат нисколько не поменялся — никаких хинтов, метка пропадает, балун появляется. Весь код пишу, внимательно вглядываясь в доки. Что я пропустил?

2 комментария
ObjectManager,baloon,customize
Получить параметры метки при клике (objectManager)
Новый пользователь
16 мая 2017, 19:19

Здравствуйте, друзья, очень нужна ваша помощь! Нужно получить параметры метки, которые я прописал в data.php при наведении на саму метку. Например получить category: 

"properties": { 
        "clusterCaption": "Метка1", 
        "hintContent": "тут хинт",
        "category": 10},

Вот код евента, из параметров удалось получить только id а нужно category, почему то obj.properties.category не работает:

function onObjectEvent (e) {
  var obj = e.get('target'),
  objectId = e.get('objectId');
  
  console.log(obj.properties.category); //это почему то не работает
}
  objectManager.objects.events.add(['mouseenter'], onObjectEvent);

2 комментария
ObjectManager
Фильтрация объектов ObjectManager
Николай Круглов
15 мая 2017, 17:00

Подскажите пожалуйста возможно ли реализовать  фильтрацию  меток  в objectManager  через checkbox в html.

На примере: https://tech.yandex.ru/maps/jsbox/2.1/object_manager_geojson

Метки фильтруються из списка на самой карте.

Можно ли вынисти их за пределы карты в html

как в примере: https://tech.yandex.ru/maps/jsbox/2.1/geoobjects_menu

Тяжел разобраться) в JS слабак... Носом тыкнете в нужную сторону... Пожалуйста!

1 комментарий
фильтрация,ObjectManager
balloonContentLayout не применяется к ObjectManager
Руслан Дмитриев
3 апреля 2017, 23:26

Приветствую, прошу помочь. Вроде все делал по инструкции и по примерам, но все равно clusterballoonContentLayout не применяется к ObjectManager


https://jsfiddle.net/RDmitriev/tez0djk1/

Прошу помочь, гуру яндекс карт

2 комментария
clusterBalloonContentLayout,ObjectManager
Добавление GeoQueryResult в ObjectManager
Alexander
16 марта 2017, 21:35

Можно ли как-то GeoQueryResult, полученный в результате myObjects.search(***), добавить в ObjectManager? Почти весь функционал построен на ObjectManager, и теперь не могу из-за этого седлать элементарные выборки по объектам на карте.

Если такое невозможно, можете хотябы подсказать, как удалить объекты (например маркеры) после того, как они были добавлены на карту?

function searchFunc()
{
var res =  new ymaps.GeoQueryResult();
window.myObjects = ymaps.geoQuery(myPlacemark);
//myPlacemark - строка с json-описаниями геометрии
					
res = myObjects.search('options.preset = "islands#greenDotIcon"');
			
/*
Здесь нужно как-то удалять то, что было добавлено на карту в результате предыдущего выполнения функции searchFunc().
*/
			
res.addToMap(myMap);
}

5 комментариев
GeoQueryResult,ObjectManager
Полигоны в objectManager
Maxim R.
16 февраля 2017, 22:49

Здравствуйте!

Нужно разместить на карте большое количество полигонов. В документации к objectManager ничего про полигоны не нашел. На хабре читал статью про objectManager от 2014 года, в которой говорилось, что поддержка полигонов в objectManager уже в разработке и скоро появится.

Но что-то непонятно появилась или нет ?

Если не появилась, то данная задача решается через активные области ? Т.е. генерить png на сервере придётся ?

4 комментария
ObjectManager,полигоны
Фильтровать количество точек в видимой области карты
Valentin
13 февраля 2017, 12:14

Добрый день, как фильтровать количество выводимых точек на карте? Точек может быть очень много и хочется на пример показывать только 500, если хочется увидеть больше, то пользователь зумирует карту. 

Использую LoadingObjectManager, сначала фильтер сделали на сервере, но столкнулись с проблемой, на пример работа с картой начинается в г.Москва, макс 500 отрисовалось точек, пользователь зумирует, а новые не видит. 

Думал восп. фильтром для objectmanager, но по какому критерию фильтровать? 

Подскажите пожалуйста, как это осуществить? Отрисовка происходит при помощи смены setUrlTemplate и перезаписью новых данных на карте reloadData.

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

1 комментарий
LoadingObjectManager,filter,ObjectManager,overlays
Как работать с данными карты? LoadingObjectManager + setUrlTemplate + reloadData
Valentin
2 февраля 2017, 17:08

Добрый вечер. Подскажите пожалуйста, как работать с объектами карты, после обновления их через objectManager.setUrlTemplate (получение новых значений) и objectManager.reloadData() , перезаписывания меток?

На пример:

objectManager.objects.getLength();

Могу использовать только до перезаписывания меток, но он отдает "старый" результат, а не новый.

Пробую не что такое: 

myMap.panTo(myMap.geoObjects.getBounds(), {checkZoomRange:true});

, но иногда приближает точку очень близко и приходится уменьшать зум карты. Или на пример:

myMap.setBounds(myMap.geoObjects.getBounds());

Так же не возможно использовать после objectManager.reloadData(). Не понимаю как центровать карту с исп LOM'a?

objectManager — это и есть LOM

objectManager = new ymaps.LoadingObjectManager
1 комментарий
reloadData,ObjectManager,LoadingObjectManager
Не перескакивают точки
kosilka75
25 января 2017, 17:54

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

Демо-код здесь: http://jsfiddle.net/g7enydLn/

Это баг или фича? Мне нужно использовать objectManager и FeatureCollection т.к. нужно задавать id каждой точки в момент создания, и в то-же время иметь возможность кластеризации, а Placemark's (которые перескакивают как надо) вроде как id не поддерживают, или я что-то проглядел?

UPD: Саппорт, ну что-же вы? Не я один с такой проблемой между прочим, человек то-же самое в декабре спрашивал, почему игнор? https://yandex.ru/blog/mapsapi/perenos-metok-obektov-menedzhera-obektov-objectmanager-v-sosedniy-mir-pri-sdvige-karty

ObjectManager
Возможность реализации серверной части LoadingObjectManager или RemoteObjectManager на PHP
Александр Копосов
10 января 2017, 15:19

Приветствую всех! 

Столкнулся с проблемой реализации серверной части LoadingObjectManager или RemoteObjectManager.

Общая картина: на сайте есть карта; на неё из базы загружаются десятки тысяч меток; используется ObjectManager и PieChartClusterer. Алгоритм такой: Пользователь задаёт фильтр, какие метки ему нужны; из базы загружаются соответствующие данные и формируется JSON; этот JSON скармливается ObjectManager'у; ObjectManager загружается на карту.

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

Как я понимаю, лучше бы использовать LoadingObjectManager или RemoteObjectManager, которые бы позволяли подгружать метки, так скажем, по мере их появляемости в зоне видимости, а не сразу все, но отображать видимые (как делает ObjectManager). Про активные области я пока даже не заикаюсь.

Собственно, сама проблема:

Я читал документацию по "Работе с большим числом объектов", а также статью на Хабре и видел там Проект на гитхабе с примером реализации серверной части для RemoteObjectManager.

Может быть (скорее всего) я чего-то не так понял (ну или вообще не понял), но возможна вообще серверная сторона не на Node.js (как в примере), а на PHP?

Буду признателен за какой-нибудь примерчик, ну или тыканье носом в какую-нибудь статейку, где это дело рассматривается. Я ничего подобного не смог найти на просторах Интернета.

2 комментария
RemoteObjectManager,LoadingObjectManager,objectManager,множество объектов,PHP