Клуб API Карт

Проблемы с преобразованием координат при инициализации карты.

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

Просветите,пож-та, почему alert(geoPoint); выводит NaN,NaN ?

 

 

....
ymaps.ready(init);

............

function init() {


   map = new ymaps.Map("map", {
       center: [37.61770,55.75582]
    }
  

   map.behaviors.enable("scrollZoom");
   map.setCenter([37.61770,55.75582], 11, {checkZoomRange: true}

   var globalPixelPoint = map.converter.pageToGlobal([100, 100]
   var geoPoint = map.options.get('projection').fromGlobalPixels(globalPixelPoint, map.getZoom()
   alert(geoPoint);

  ............

}

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

Вы выставляете центр карты с флагом checkZoomRange: true.

А при инициализации карты вообще зум не выставляете.

 

Последовательность действий будет такая:

1. Создается карта.

2. Подается команда на выставление центра карты с проверкой - отправляется запрос на сервер за данными.

3. Вы пытаетесь работать с точкой, используя map.getZoom(), который еще не определен.

4. Приходит ответ с сервера и карта получает новый зум и центр.

 

Чтобы все работало как надо, нужно делать так

map.setCenter([37, 55], 11, {

    checkZoomRange: true,

    callback: function () {

       // и вот здесь уже можно смело спрашивать map.getZoom()

    }

})

"3. Вы пытаетесь работать с точкой, используя map.getZoom(), который еще не определен"

Что значит "не определен"?

А цифра 11 чтто означает в методе "map.setCenter([37, 55], 11, {...."?

Разве не zoom?

И ещё: я не понимаю вашего сленга "можно смело спрашивать"

Перепишите, пож-та, мой пример чтобы он работал.

(иначе я до конца не пойму все ваши неочевидные тонкости)

И зачем тут callback? Разве нельзя делать всё последовательно как в api 1.x?

Вы используете 

map.setCenter([37.6, 55.7], 11, {checkZoomRange: true});

Флаг checkZoomRange означает, что апи перед выставлением зума карты должно послать запрос на сервер. С сервера приходит информация о том, какой максимальный и минимальный зум допустимы для запрашиваемого центра карты. Сервер возвращает ответ (с некоторой задержкой), и вызывается функция-колбек.

map.setCenter([37.6, 55.7], 11, {

    checkZoomRange: true,

    callback: function () {

       // вызов этой функции означает, что ответ с сервера пришел, и карте выставлен какой-то корректный для этой точки зум. Скорее всего, это будет 11 зум.

       var globalPixelPoint = map.converter.pageToGlobal([100, 100]),

            geoPoint = map.options.get('projection').fromGlobalPixels(globalPixelPoint, map.getZoom());

       alert(geoPoint);

    }  

});

 

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

map.setCenter([33, 33], 11, {checkZoomRange: false});

В таком случае никакого запроса на сервер за данными на будет, и код будет выполняться последовательно - ваш вариант станет рабочим.

Хм, никак не предполагал что checkZoomRange влияет на синхронность/асинхронность.

Теперь всё понято и всё работает.

Спасибо. С меня шоколадка. :)

Не за что =)

Читайте внимательнее документацию, там написано про асинхронность ;)