Клуб API Карт

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

democratiya74
22 июля 2015, 11:27

Не могу разобраться как  сделать тоже самое на api 2.1

Сделал пример на api 2.0

http://codepen.io/anon/pen/jPvzmJ?editors=110

 

function MultiGeocoder(options) {
this._options = options || {};
}

MultiGeocoder.prototype.geocode = function(requests, options) {
var self = this,
opts = ymaps.util.extend({}, self._options, options),
size = requests.length,
promise = new ymaps.util.Promise(),
result = [],
geoObjects = new ymaps.GeoObjectArray();

requests.forEach(function(request, index) {
ymaps.geocode(request, opts).then(
function(response) {
var geoObject = response.geoObjects.get(0);

geoObject && (result[index] = geoObject);
--size || (result.forEach(geoObjects.add, geoObjects), promise.resolve({geoObjects: geoObjects}));
},
function(err) {
promise.reject(err);
}
);
});

return promise;
};
function init() {

var myMap = new ymaps.Map('map', {
center: [55.160317, 61.402307],
zoom: 10,
behaviors: ['default', 'scrollZoom']
});
myMap.controls
.add('zoomControl', {top: 35, right: 20})
.add('typeSelector', {top: 5, right: 20})
.add('mapTools', {top: 5, right: 220});
myMap.behaviors.disable('scrollZoom');
var myCollection = new ymaps.GeoObjectCollection();
var address = [];
var phone = [];
var j = 0;
$('.company').each(function(i) {
address.push($(this).find('.comp-addr').text());
phone.push($(this).find('.comp-phone').html());
});

var mGeocoder = new MultiGeocoder({boundedBy: myMap.getBounds()});
mGeocoder.geocode(address).then(
function(res) {
res.geoObjects.each(function(item) {
item.properties.set('balloonContentBody', '

' + address[j] + '
' + phone[j] + '

');
item.options
.set('iconImageHref', 'assets/images/map-icon.png')
.set('iconOffset', [-10, -15])
.set('iconImageSize', [39, 52]);
j++;
});
myCollection.add(res.geoObjects);
myMap.geoObjects.add(myCollection);
myMap.setBounds(myCollection.getBounds(), { zoomMargin: [0], checkZoomRange: true,
callback: function(err) {
if (myMap.getZoom() > 13) {
myMap.setZoom(13);
}

}
});
myMap.events.add('click', function(e) {
myMap.balloon.close();
});
});
}
ymaps.ready(init);

 

 

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

Не надо так делать

каждый адрес - это отдельный http-запрос на сервер.

Отправляйте все адреса одним запросом на свой сервер и с него геокодируйте с сохранением в кэш

Не могли бы показать пример или поправить в примере с codepen'а плз?  

Пример чего? Нужна серверная часть, которая будет кешировать запросы.

А как мне всетаки переделать то что я скинул на новую api? Мне этого впринцепи достаточно.

если у вас всего 2 адреса, прогеокодируйте их руками с помощью этого инструмента

и создавайте сразу метки по координатам без всех этих костылей

Адреса могут добавляться в будущем. Нужно именно из дивника брать