Клуб API Карт

по клику на внешнюю ссылку открывает не верный балун

veremeev.al
1 июля 2016, 12:36

Есть карта с метками и балунами(api 2.1), и есть список адресов вне карты. по клику на этот список нужно открывать балун, и центрировать карту, все вроде сделал, но по клику почему-то не всегда открывает нужный балун, что не так?

// По клику на адрес, открывает балун и центрирует карту
     $('.filter-result').on('click', '.filter-result__item', function(){
            $(".filter-result__item").removeClass('filter-result__item_active');
            $(this).addClass('filter-result__item_active');
            var pos = $(this).find('.shop-address').text();
            var indexObj = $(this).index();
            //номер метки
            var point = myMap.geoObjects.get(indexObj);
            //координаты метки
            var npoint = $.map(point.geometry.getCoordinates(), Number);
            //центрирование карта
            myMap.setCenter(npoint, 13, {checkZoomRange: true,
                }).then(function () {
                  //открыть балун
                  point.balloon.open();
                }, function (err) {
                }, this);
        });

6 комментариев
Подписаться на комментарии к посту
Поставьте точку в дебаггере и посмотрите чему равен indexObj
и что именно попадает в point и npoint из коллекции.
ДА вроде все верно вот скрин консольлога http://prntscr.com/bo9x0m , а по факту открыта 4 метка http://prntscr.com/bo9xxa ((((
Выведя myMap.geoObjects куда я добавляю перебором все адреса, массив точек с адресами не соответствует тому как они должны были добавится http://prnt.sc/bobq9i, что очень странно, не могу понять в чем проблема. Я беру адреса из DOM, перевожу их в координаты и потом добавляю точки с балунами в geoObjects.
$('.filter-result__item').each(function() {
                        var objAdr = $(this).find('.shop-address').text();
                        var numb = $(this).index();
                        var objGeocoder = ymaps.geocode(objAdr);
                  objGeocoder.then(
                  function (res) {
                                        var myIconContentLayout = ymaps.templateLayoutFactory.createClass(
                                            '<div class="shop-num">'+(numb+1)+'</div>',{
                                                build: function () {
                                        this.constructor.superclass.build.call(this);
                                        },
                                        });

                                // Адресс в координаты
                                var adres = res.geoObjects.get(0).geometry.getCoordinates(); 

                                
                                var myCollection = new ymaps.Placemark(adres,{
                                            balloonHeader: '',
                                            balloonContent: ''+objAdr+''
                                        },{
                                            iconLayout: 'default#imageWithContent',
                                iconImageHref: 'http://verstka.ru.mitgroup.ru/img/marker.png',
                                iconImageSize: [51, 55],
                                iconImageOffset: [-26, -57],
                                iconContentLayout: myIconContentLayout,
                                balloonLayout: MyBalloonLayout,
                                balloonContentLayout: MyBalloonContentLayout
                                });
                                myMap.geoObjects.add(myCollection)
                                myMap.setBounds(myMap.geoObjects.getBounds(), {checkZoomRange:true})
                    },
                function (err) {
                }
                );
              });
veremeev.al,
Вы геокодируете массив точек на клиенте в цикле. Это конечно очень плохой вариант. Не соответствие порядку добавления связано с тем, что ответы геокодера могут приходить в разном порядке
dimik,
, а что можете посоветовать в плане добавления точек на карту, если мне по сути будит возвращаться массив(грубо говоря) адресов. по документации api перевод адреса в координаты происходит через geocode, а добавить placemark нужны координаты а не адрес(ну это как я понял), Может есть какой пример, буду благодарен за любую наводку.
veremeev.al,
Вместо запроса в Яндекс по каждому адресу с каждого клиента,
Вам нужно отравлять все адреса одним запросом (мультиплексирование запросов) на свой сервер, где пересылать их в яндекс по одному, но уже с кешированием результата на своем сервере, можно использовать Redis/Memcached или, например, программный LRU кеш


В статье есть ссылка на репозиторий с примером реализации
Так же есть инструмент множественного геокодирования созданный на этом подходе