Клуб API Карт

Проблемы с преобразованием координат (переход с API 1.x на 2.0)

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

В частности где теперь прячутся такие хорошие функции как

map.converter.clientPixelsToCoordinates

map.converter.coordinatesToLocalPixels

??

12 комментариев
Sergey Konstantinov
28 января 2016, 04:50

А что вы пытаетесь сделать? Подход к пиксельным координатам в API 2.0 совсем другой.

Странный вопрос... я пытаюсь преобразовать координаты.

"совсем другой." А именно?

Как мне преобразовать координаты из оконных а географические?

Лучше всего было бы разместить пример по этому поводу на сайте, иначе, я думаю таких вопросов будет много...

 

 

Sergey Konstantinov
28 января 2016, 04:50

Неясен контекст, что Вы потом хотите сделать с этими координатами и откуда у Вас оконные координаты.

Если из события мыши, пойманного через систему событий карты, то получить любые координаты просто:

map.events.add('mousemove', function (e) {

    /* Координаты окна браузера, фактически эквивалент

        [pageX, pageY]. Нормализация в IE производится автоматически */

    console.log(e.get('position'));

    /* Географические координаты */

   console.log(e.get('position'));

});

Если у вас есть координаты окна браузера [pageX, pageY] из каких-то других источников (каких?), то перевести их в соответствующие координаты можно через двойное преобразование:

(а) сначала получим глобальные пиксельные координаты карты (считаются от левого верхнего угла "мира") через конвертер карты:

var globalPixelPoint = map.converter.pageToGlobal([pageX, pageY]);

(б) переведём в геокоординаты через проекцию карты:

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

Однако в большинстве случаев можно ограничиться шагом (а), карта нативно работает с глобальными пиксельными координатами через (set|get)GlobalPixelCenter.

Обратный перевод, из геокоординат в pageX/pageY - через методы toGlobalPixels и globalToPage у проекции и конвертера соответственно.

Спасибо. После праздников попробую ваш код...

Просто странно что вы отменили в конвертере удобные методы

по преобразованию координат.

(эти методы есть и у Гугла и у OSM, были они и в api 1.x)

Может стоит их вернуть? :)

Sergey Konstantinov
28 января 2016, 04:50

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

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

Sergey Konstantinov
28 января 2016, 04:50

Единственный кейс, который я вижу - это drag'n'drop объекта извне карты на карту. Кажется, что это очень минорный кейс.

Ну да, направление мысли правильное, т.е. случай (общий) когда требуется преобразовать оконные координаты браузера в географические координаты. В api 1.x это делалось на раз,два, в api 2.0 требуется двойное преобразование в скрипте. Ну хорошо ли это? :)

Sergey Konstantinov
28 января 2016, 04:50

Двойное преобразование лично мне не представляется чем-то ужасным. В API 2.0 с географическими координатами работают только сама карта и геообъекты (все остальные объекты работают в глобальных пикселях), и нам очень не хотелось бы привносить знание о геокоординатах в те модули, которым это знание логически не нужно. Впрочем, если будет много запросов, мы, конечно, сделаем эту пару методов. Ваш пока первый :)

Кроме неудобства и "враждебности" к пользователю у такого подхода, как мне кажется, есть ещё один недостаток:

 

....
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);

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

}

 

Что у вас выведет alert ?

Дмитрий Сухоносов
28 января 2016, 04:50

twirl
Напишите пожалуйста развернутый понятный пример кода, что и как делать

Приветствую! Подскажите, пожалуйста, как мне с анимацией сместить карту на 320px?
Я хотел сделать это с помощью map.panTo, но тут нужны географические координаты.