Клуб API Карт

Не удается получить координаты по адресу

Пост в архиве.
mikvalyan
29 июля 2013, 22:17

 

var coord = 0;


function () {

    var orderobj = JSON.parse(orders);

    var order;

    for (i = 0; i < orderobj.length; i++) {

        var geocoder = new ymaps.geocode(city + " " + orderobj[i].deliveryAddress.building.street.name + " " + orderobj[i].deliveryAddress.building.number, {

            results: 1

        });

        geocoder.then(

            function (res) {

                window.coord = res.geoObjects.get(0).geometry.getCoordinates();

            }

        );

        alert(coord);

        var order = new ymaps.Placemark([coord], {

            name: orderobj[i].id,

            balloonContentHeader: orderobj[i].deliveryAddress.building.street.name + " " + orderobj[i].deliveryAddress.building.number,

            balloonContentBody: 'телефон:' + orderobj[i].contactPhone + '

статус: ' + orderobj[i].status, // содержимое балуна

            balloonContentFooter: ''

        }, {

            draggable: true

        });

        OrderCollection.add(order); //добавляем метки в коллекцию

    }

} 

 

При первом "проходе" в  alert(coord); показываются "0", при втором показываются координаты, метки на карте отрисовываются, но перемещаются только вертикально. Так понял, что функция  function (res) вызывается после цикла.

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

Именно так и происходит,

Там же http-запрос, он всегда асинхронный

А как можно исправить? Ну или как получить координаты по адресу и нарисовать метку с этими координатами?

Создавать метку внутри обработчика then

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

Я пробовал соpдавать метку внутри 

for (i = 0; i < orderobj.length; i++)
{
  //alert(city + " " + orderobj[i].deliveryAddress.building.street.name + " " + orderobj[i].deliveryAddress.building.number) ;
  var geocoder = new ymaps.geocode(city + " " + orderobj[i].deliveryAddress.building.street.name + " " + orderobj[i].deliveryAddress.building.number, { results: 1}) ;
// После того, как поиск вернул результат, вызывается callback-функция
geocoder.then(
function (res)
{
// координаты объекта
  coord = res.geoObjects.get(0).geometry.getCoordinates() ;
var order = new ymaps.Placemark([coord],
{
//name : orderobj[i].id ,
//balloonContentHeader: orderobj[i].deliveryAddress.building.street.name + " " + orderobj[i].deliveryAddress.building.number,
//balloonContentBody: 'телефон:' + orderobj[i].contactPhone + '
статус: ' + orderobj[i].status , // содержимое балуна
//balloonContentFooter: ''
},
{
//draggable: true
});
  OrderCollection.add(order) ;//добавляем метки в коллекцию
}
  ) ;
}

но внутри не "видит"  orderobj[i]. Пишет ошибку Uncaught TypeError: Cannot read property 'id' of undefined.

Если же создавать метку без свойств - то она отрисовывается на карте, но у нее странное поведение - куда бы я не переместился по карте, метки всегда по центру карты, также не отображается ее имя и не перемещается сама метка.

 

 

 

 

 

прогеокодируй тогда все на сервере

 

Если же создавать метку без свойств - то она отрисовывается на карте, но у нее странное поведение - куда бы я не переместился по карте, метки всегда по центру карты, также не отображается ее имя и не перемещается сама метка.

Это потому что ты берешь массив координат и кладешь его в другой массив. Получается чушь

coord = res.geoObjects.get(0).geometry.getCoordinates() ;
var order = new ymaps.Placemark([coord],

А если как-нибудь так сделать

this.getCoord = function(town, street, house)
{
   var orderplm;
   var geocoder = new ymaps.geocode(town + ' '+ street + ' ' + house, { results: 1}) ;
// После того, как поиск вернул результат, вызывается callback-функция
   geocoder.then(
    function (res) 
    {
// координаты объекта
     var coord = res.geoObjects.get(0).geometry.getCoordinates() ;
     window.orderplm = new ymaps.Placemark([coord]);
   }
   ) ;
return orderplm;
  }  

 

И потом вызвать

var order = this.getCoord(city, orderobj[i].deliveryAddress.building.street.name, orderobj[i].deliveryAddress.building.number) ;