Клуб API Карт

расстояние между двумя точками

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

Добавляю объект circle на карту, хочу чтобы при разных зумах, на экране при добавлении он был всегда одного размера на вид. Пробовал вычислять радиус таким образом radius*(1/myMap.getZoom()). Только зум не линеен, и на больших зумах круг получается слишком маленьким.  

Попробовал сделать так

var x = proj.fromGlobalPixels ([150,0], myMap.getZoom()), y = proj.fromGlobalPixels ([0,0], myMap.getZoom());
alert(ymaps.formatter.distance(
  ymaps.coordSystem.geo.getDistance(x, y)
));

но пишет что нет такого объекта   ymaps.coordSystem. myMap.coordSystem тоже не нашел. Как использовать этот метод? И стоит ли вообще делать так, может быть есть способы проще перевести 150px в метры, с учетом масштаба.  

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

какую задачу в итоге вы хотите решить?

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

Координатную систему карты можно получить так:

myMap.options.get('projection').getCoordSystem()

либо не привязанную к карте так ymaps.coordSystem.geo

если нажать на имя метода, увидите его пример использования

http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/coordSystem.geo.xml

есть какие-т тонкости в том когда и где можно применить данные метода? потом-что alert(myMap.options.get('projection').getCoordSystem);// undefined

 alert(ymaps.coordSystem.geo)// undefined

покажи урл по которому АПИ подключаешь

Sergey Konstantinov
28 января 2016, 03:23

Ваша задача неразрешима.

"Пиксели в метры" перевести нельзя, так как (а) по горизонтали и по вертикали масштабы разные, (б) они ещё и изменяются с ростом широты.

Sergey Konstantinov
28 января 2016, 03:23

Но можно перевести пиксельное расстояние в метрическое вдоль какого-то выбранного направления - например, на север - от какой-то конкретной точки.

 

а можно нарисовать оверлей круга и перенести его в какой-нибудь pane чтобы он двигался с картой но не изменял размеры при изменениях зума?

Sergey Konstantinov
28 января 2016, 03:23

Можно, но это не ко мне :)

 

призови этого мистера-Х в комменты, пожалуйста ))

ну хотябы приблизительно. radius*(1/myMap.getZoom()) даже эту формулу если переработать с учетом нелинейности мне бы подошла. Не силен в математике. тут логарифм или что-то такое нужно или tan, график масштаба какой приблизительно

В отладчике нашел у proection это

myMap.options.get('projection').distanceToGlobalPixels

метод принимает 3 параметра, кто-нибудь знает как им пользоваться 

выдрал из distanceToGlobalPixels логику,сделал так 

function getDistance(dist,zoom){

var e = dist*Math.cos(Math.PI/180)/Math.pow(2,zoom+8);return Math.abs(e)

}

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

Sergey Konstantinov
28 января 2016, 03:23

var start = [/* координататы точки, от которой нужно отложить расстояние */],

      projection = ymaps.projection.wgs84,

      pixelStart = projection.toGlobalPixels(start, zoom),

      end = projection.fromGlobalPixels([pixelStart[0], pixelStart[1] + offset], zoom),

      distance = ymaps.coordSystem.geo.distance(start, end);

Это в случае, если мы от текущей точки смещаемся на offset пикселов на север.

я все понимаю, если бы этот код у меня сработал этого топика бы не было. ymaps.coordSystem.geo // undefined

ymaps.coordSystem// undefined

myMap.coordSystem// undefined

myMap.options.get('projection').getCoordSystem //undefined

что это вообще за формулировка http://api.yandex.ru/maps/doc/jsapi/2.x/ref/reference/projection.wgs84Mercator.xml

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

 

Sergey Konstantinov
28 января 2016, 03:23

Вероятно, вы используете старую версию АПИ.

Координатные системы были добавлены в версии 2.0.13

алилуйййя, http://api-maps.yandex.ru/2.0.13/?load=package.full&lang=ru-RU и все сразу заработало

вот самое простое решение
var radius = this.options.get('defaultRadius', 0) ? this.options.get('defaultRadius') :
                        Math.min(
                            Math.max(this.options.get('minRadius', 0), 5000000 / Math.pow(2, parent.getMap().getZoom())),
                            this.options.get('maxRadius', 0) ? this.options.get('maxRadius') : 100000000);

круги получаются одинаковые.
подаблкикай на разных зумах - http://mapexpert.pro/maparea/index.html