Клуб API Карт

Использование метрического масштаба

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

  Добрый день. Столкнулся с проблемкой при использовании API 2.x:

есть переменная, которая содержит необходимый масштаб в метрах (то есть показывает сколько метров находится в одном пикселе), но вот как её перевести в формат для яндекс.карт - не нашёл. Надеюсь вы мне дадите совет =)

 

 

xzoom = 13.33; //кол-во метров в пикселе 

 

var myMap = new ymaps.Map('map', {
center: [$lat, $long],
zoom: 12, //хочу использовать xzoom здесь
type: 'yandex#satellite'
}); 

 

 

 

 

 

 

 

 

11 комментариев
Sergey Konstantinov
28 января 2016, 02:41
Масштаб "метров на пиксель" в меркаторовской проекции зависит от широты и направления движения.

Дело в том, что я хочу перевести это число в масштаб для яндекс.карт. Текущие latitude и longitude известны. Но я не могу понять как связать его с количеством тайлов. 

Sergey Konstantinov
28 января 2016, 02:41
Опишите задачу подробнее - что вы хотите сделать?

Дело обстоит так: 

имеется изображение в виде картинки, которая генерируется сторонней программой. В этой картинке используется масштаб метры\пиксель. Я хочу синхронизировать эту картинку с яндекс картами. По координатам они совпадают, а вот коэффициент увеличения нужно как-то рассчитать. Я пока что не могу понять от чего мне отталкиваться, чтобы в результате получить одинаковый масштаб на картинке и на картах.

 

 

Sergey Konstantinov
28 января 2016, 02:41
Формально говоря, сделать нужно следующее.
Пусть [long, lat] - центр изображения, а [w, h] - его размеры в метрах.
Тогда углы изображения будут находиться в координатах:
ymaps.coordSystem.geo.solveDirectProblem([long, lat], [-w, -h], .5 * Math.sqrt(w *w + h * h)).endPoint

ymaps.coordSystem.geo.solveDirectProblem([long, lat], [w, h], .5 * Math.sqrt(w *w + h * h)).endPoint
Однако, если ваш сторонний ресурс действительно строит картинку с фиксированным масштабом пиксель/метр, то задача не решается при больших размерах области (искажение становится нелинейным, картинка будет проецироваться не в прямоугльник, а в сложную кривую фигуру).

Спасибо. Приложение использует небольшие области (от 1 до 20км), так что искажения несущественны.

 Если не ошибаюсь, то определить зум можно по границам (нашел в примерах):

 

 ymaps.util.bounds.getCenterAndZoom(
[[55.7, 37.6], [55.8, 37.7]],
[$mapElement.width(), $mapElement.height()]
)

Sergey Konstantinov
28 января 2016, 02:41
ага
можно map.container.getSize() вместо $.width/$.height

Спасибо :) всё получилось как надо

Андрей Грэй
28 января 2016, 02:41

Дилетантский вопрос: а разве можно точно привязать размер пикселя к метрической системе. Эти самые пиксели на разных дисплеях разные.

 

Любопытно посмотреть на реализацию, если можно поделитесь ссылочкой. Спасибо.

Насколько я понял, то система такая:

1 градус по широте равен фиксированному числу в метрах. 1 градус долготы зависит от текущей широты. 

если учитывать что в 1 пикселе k метров, то тогда если отсчитать от центра карты w/2 и h/2 пикселей то получим число, насколько далеко отстоит от центра крайняя граница в метрах. а затем уже эти метры можно перевести в градусы, зная сколько на данной широте длится 1 градус. Соответственно можно и получить  сколько в одном пикселе градусов и сколько градусов в пикселе и т.д.