Клуб API Карт

Поиск Point по карте, по properties

Пост в архиве.
Spavel74
18 сентября 2012, 16:14

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

все ymaps.GeoObject (Point) в clusterer

на каждую Point навешан events ('click') , где присваивается balloonContentBody

 

стандартный clusterBalloonContentBody заменён 

 

var clusterIcons = [{
                href: '/declare/images/map/find.png',
                size: [53, 53],
                // Отступ, чтобы центр картинки совпадал с центром кластера.
                offset: [-20, -20]
            },
            {
                href: '/declare/images/map/find.png',
                size: [63, 63],
                offset: [-30, -30]
            }
        ];
var BalloonLayout = ymaps.templateLayoutFactory.createClass("", {
                    build: function () {
                        var parent = this.getParentElement();
                            geoObjects = this.getData().properties.get('geoObjects');
                              var Arr_idbase = new Array();
                              geoObjects.forEach(function(index, i){
                                      (function (currentGeoObject) {
                                          var idbase = currentGeoObject.properties.get('idbase');
                                          Arr_idbase[i] = idbase;
                                     })(index);
                              });
                         //alert(Arr_idbase);
                        parent.innerHTML =  onClickPointClusterer(Arr_idbase.join());
                    }
                });
clusterer = new ymaps.Clusterer();
clusterer.options.set({
    disableClickZoom: false,
    synchAdd: false,
    icons: clusterIcons,
    numbers: [10],
    balloonContentHeaderLayout:'my#Pointe_Header',
    clusterBalloonContentBodyLayout: BalloonLayout
});
clusterer.add(myGeoObjects);
myMapFull.geoObjects.add(clusterer);

 

Нужно сделать что то типа Показать метку на карте.

Найти метку, Clusterer по карте с properties.idbase, утановить самый максимальный zoom, спровацировать 'click'

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

Недавно мы делились в клубе примером реализации поиска по собственным геообъектам.

Можно взять его за отправную точку

Что то не то, Не поиск а Перебор

например 

получаем все Point на карте

в цикле перебераем.

и если встречаем допустим properties.idbase = 8

то утановить самый максимальный zoom карты по отношению к  Point и спровацировать 'click'

Вопрос

1 Как получить все Point на карте

кластерер это потомок геоколлекции и у нее доступны все методы геооколлекции.

например, вы можете использовать getIterator для перебора кластеров

Не нолучается

clusterer = new ymaps.Clusterer(); 

clusterer.add(myGeoObjects);

myMapFull.geoObjects.add(clusterer);

////////////////////////////////////////////////////////////////

clusterer.each(function (point) {

        var idbase = point.properties.get('idbase');

        alert( idbase );

 });

там должны быть либо геообъекты либо кластеры

нужно проверять какого типа пришел объект point

у кластеров геообъекты можно получить так:

point.properties.get('geoObjects') и соотв. тоже перебрать еще в одном цикле

типа  объект , как?

наверное instanceof можно использовать,

ну или проверь, если есть properties.get('geoObjects'), значит кластер, если нет - значит обычная метка

пока. ясно. Просто думал что метод есть типа IsClusterer

оно даже так не срабатывает, нечего циклить

clusterer.each(function (point) {

        //var idbase = point.properties.get('idbase');

        alert(1);

});

 

Спасибо, оставим этот вопрос до завтра.

Да всё там работает...

Просто кластеризатор добавляет объекты чанками, через setTimeout, чтобы IE не озяб от такого кол-ва итераций по массиву (там же можно и мильён точек догадаться передать)

Поэтому у кластеризатора есть событие objectsaddtomap

После него и надо итерироваться:

 

            clusterer.events.add('objectsaddtomap', function () {                clusterer.each(function (geoObjectOrCluster) {                    console.log(geoObjectOrCluster);                });            });

 

 

На самом деле вам лучше работать с оригинальным массивом, который вы передаете в кластеризатор (искать по нему)

 

тогда не нужно проверять - кластер/не кластер

 

 

                var _ree = jQuery("#center_coordinates").attr('idbase'); ;                MyGeoObjects = 'undefined';                clusterer.each(function (geoObjectOrCluster) {                   geoObjects = geoObjectOrCluster.properties.get('geoObjects');                   if (typeof(geoObjects) == 'undefined')                   {                      var idbase = geoObjectOrCluster.properties.get('idbase');                      if(idbase == _ree) MyGeoObjects = geoObjectOrCluster;                   }                   else                   {                              geoObjects.forEach(function(index, i){                                      (function (currentGeoObject) {                                          var idbase = currentGeoObject.properties.get('idbase');                                          if(idbase == _ree) MyGeoObjects = currentGeoObject;                                     })(index);                              });                   }                });                if (typeof(MyGeoObjects) != 'undefined')                {                   //MyGeoObjects // найденый объект                }

Нужный объкт найден.

Как теперь определить максимальный zoom карты для точки? 

я вам написал выше -

1. лучше искать по оригинальному массиву myGeoObjects (отпадает необходимость проверять properties.get('geoObjects') и повторно перебирать кластеры

2. Максимальный зум можно поставить любой с опцией checkZoomRange = true

 

myMap.setCenter([40, 50], 3, { checkZoomRange: true });

 

 

 myMapFull.setCenter(MyGeoObjects.geometry.getCoordinates(), 20, { checkZoomRange: true });

Подскажите как теперь открыть балон(спровацировать 'click'), или кластер (спровацировать ' build ')

 MyGeoObjects объект type: "Point" на нем 

.events.add('click', onClickPoint);  


Как спровацировать 'click'?

 

MyGeoObjects.event.fire('click'); 

Не поучается.

поле называется events, а не event

напиши просто

MyGeoObjects.balloon.open();

MyGeoObjects.balloon.open();

Открывает какойто пустой balloon.


а MyGeoObjects.events.fire('click'); - TypeError: a is undefined


видимо он у тебя пустой (без balloonContentBody)

через клик пока что надо передавать позицию (скоро поправят)

events.fire('click', {globalPixelPosition: myMap.getGlobalPixelCenter()});

Ну да пустой, заполнение. происходит при клике. 

Если поправят, это конструкция будет работать?

 

У меня остался еще один не решонный вопрос: если я при обходе меток получу объект кластер по parent. Можно будет таким же образом запустить build

build оформлен так :

var BalloonLayout = ymaps.templateLayoutFactory.createClass("", {                    build: function () {                        var parent = this.getParentElement();                            geoObjects = this.getData().properties.get('geoObjects');                              var Arr_idbase = new Array();                              geoObjects.forEach(function(index, i){                                      (function (currentGeoObject) {                                          var idbase = currentGeoObject.properties.get('idbase');                                          Arr_idbase[i] = idbase;                                     })(index);                              });                         //alert(Arr_idbase);                        parent.innerHTML =  onClickPointClusterer(Arr_idbase.join());                    }                });clusterer = new ymaps.Clusterer();clusterer.options.set({    disableClickZoom: false,    synchAdd: false,    icons: clusterIcons,    numbers: [10],    clusterBalloonContentBodyLayout: BalloonLayout});

 

Если поправят, это конструкция будет работать?

она и сейчас работает в таком виде

MyGeoObjects.events.fire('click', {globalPixelPosition: MyGeoObjects.geometry.getPixelGeometry().getCoordinates()});

 

Да, да спасибо работает, забыл упамянуть..

Как быть с build кластера

у вас балун кластера не открывается и build соответственно не сработает

там и есть перебор

перебираются все геообъекты в коллекции и на основании какой-то логики (функция фильтрации) нужные выбираются (клонируются) в отдельную коллекцию результатов. Результаты визуализируются.

 

А с Clusterer  нельзя получить все геообъекты