Клуб API Карт

Множественное геокодирование

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

Здравствуйте, пытаюсь реализовать множественное геокодирование (пока на клиенте), позже будет перенесено на сервер.

Использую "Класс множественного геокодирования" (multi-geocoder.js, list-collection.js).

В данной теме http://ymapsapi.ya.ru/replies.xml?item_no=462, написано, что "Класс множественного геокодирования" распологает найденные результаты в порядке, соответствующем порядку в массиве адресов во входных данных. У меня же получается, что при переборе полученной коллекции геообъектов методом each, порядок расположения элементов отличается от исходного массива данных.

 

 

var data = [
    {
        id: 'id-1',
        address: 'Калитниковская м ул 2 2'
    },
    {
        id: 'id-2',
        address: 'Усачева ул 40 88'
    },
    {
        id: 'id-3',
        address: 'Красносельский 2-й пер 2'
    },
    {
        id: 'id-4',
        address: 'Арбат ул 51'
    },
    {
        id: 'id-5',
        address: 'Смоленский 1-1 пер 24'
    },
    {
        id: 'id-6',
        address: 'Трехгорный вал ул 1'
    }
];
$(function() {
    var map,
        id = [],
        addr = [],
        i = 0;
    for (var key in data) {
        id.push(data[key].id);
        addr.push(data[key].address);
    }
    ymaps.ready(function() {
        map = new ymaps.Map("map", {
            center: [55.76, 37.64],
            zoom: 12,
            controls: []
        });
        // Множественное геокодирование
        var multiGeocoder = new MultiGeocoder({ boundedBy : map.getBounds() });
        multiGeocoder
            .geocode(addr)
            .then(function (res) {
                var collection = new ymaps.GeoObjectCollection();
                res.geoObjects.each(function (geoObject) {
                    var coords = geoObject.geometry.getCoordinates(),
                        name = geoObject.properties.getAll().name,
                        description = geoObject.properties.getAll().description;
                    console.log(addr[i] + ' | ' + name);
                    collection.add(new ymaps.Placemark(coords, {
                        iconContent: id[i],
                        balloonContentHeader: name,
                        balloonContent: description
                    }, {
                        preset: 'islands#blueStretchyIcon'
                    }));
                    polygonPoints.push(coords);
                    i++;
                });
                map.geoObjects.add(collection);
            },
            function (err) {
                console.log(err);
            }
        );
    });
}); 

 

 

 

Один из результатов вывода в консоль:

Калитниковская м ул 2 2 | улица Арбат, 51с1
Усачева ул 40 88 | улица Усачева, 40
Красносельский 2-й пер 2 | Малая Калитниковская улица, 2к2
Арбат ул 51 | 2-й Красносельский переулок, 2
Смоленский 1-1 пер 24 | улица Трехгорный Вал, 1
Трехгорный вал ул 1 | Смоленский бульвар, 1с2


В итоге метки на карте расставляются правильно, адреса соответствуют, но ID в iconContent проставляются не корректно. При повторных рефрешах - порядок в результирующем массиве отличается.

Возможно я что-то делаю не так?

 

Хотел предоставить примеры на JSBin или JSFiddle, но мой пример там выдает ошибки

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

Какую версию АПИ Вы используете?

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

Дело в том что данный класс был написан для версии 2.0 и в 2.1 он правильно работать не будет

Думал если использую multi-geocoder.js для версии 2.1 (https://github.com/deflexor/ymaps/blob/patch-1/multi-geocoder.js) - это решит проблему, но нет.

Спасибо! На 2.0 с вашим классом все работает как надо.

Владимир Жуков
27 января 2016, 23:06

можно немного модифицировать код мультигеокодера, пробросив индекс в сам геообъект т.к. это райнтайм функция. А индекс уже использовать на стороне вызывающего кода (у меня вот так var hotel = self.hotels[geoObject.index]).

 

function (response) {
    var geoObject = response.geoObjects.get(0);
    geoObject.index = index;