Клуб API Карт

Прошу помочь с размещением объектов на карте

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

Создаю карту из объектов по результатам геокодирования. Около каждого из объектов создается метка с балуном по клику.

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

Если же я в участок кода " if (geocoder.length()) { ... } вставляю алерт, выводятся все объекты с метками, но ломаной все равно нет. Где я туплю?


function showMap(){
    var map = new YMaps.Map(YMaps.jQuery("#findmap")[0]);
    map.enableScrollZoom();
    map.addControl(new YMaps.SmallZoom());
   
    places = ["Город 1", "Город 2", "Город 3"];
    var group = new YMaps.GeoObjectCollection();
   
    for(var i=0;i < places.length;i++) {
        var geocoder = new YMaps.Geocoder(places[i]);
        var listenerLoad = YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {
            if (geocoder.length()) {
                geoResult = geocoder.get(0);
                map.addOverlay(geoResult);
                map.setBounds(geoResult.getBounds(),12);
                geoResult.openBalloon();
               
                group.add(new YMaps.Placemark(new YMaps.GeoPoint(geoResult.getCoordPoint())));
            } else {}
            listenerLoad.cleanup();
        });
    }
    // Создаем ломаную
    var polyline = new YMaps.Polyline(group);
    map.addOverlay(polyline);
   
}

7 комментариев
Обработчик геокодера срабатывает в момент прихода ответа, а линия у тебя создается в момент после создания обработчика. Когда ответ еще не получен.

Рисовать линию нужно после того как все ответы от геокодера пришли. И прийти они могут в разном порядке.






Так ведь это:

if (geocoder.length())

и есть проверка на ответ от геокодера, только после него продолжается действие. И то, не рисование, а всего лишь добавление точки к ломаной.
Рисуется она уже после перебора массива с городами.
Александр Новиков
28 января 2016, 07:38
Вы не совсем понимаете принцип работы... Геокодер работает асинхронно. Т.е. вы в цикле прошлись по точкам и запустили несколько геокодеров. А после цикла сразу используете переменную, которая заполняется в обработчике геокодера.

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

Т.е. вполне возможно что у вас цикл закончился, а код внутри if (geocoder.length()) еще и не думал исполняться. ищите другие методы реализации задуманного вами функционала :)

Конструктор ломаной принимает на вход массив геоточек, а вы передаете группу.

Я рекомендую вначале определить координаты всех городов, а потом работать с ними без использования геокодера. Если городов немного, то можете воспользоваться инструментом Определение координат
В том-то и дело, что массив динамический - города могут быть каждый раз новые. Каким образом можно дождаться ответа геокодера, и по его результатам обработать события?
Вот пример множественного геокодирования на JavaScript: http://api.yandex.ru/maps/jsapi/examples/multiplygeocoding.html
Спасибо! (B)