Клуб API Карт

Как получить общее расстояние, посчитанное стандартной линейкой?

Пост в архиве.
interist32
28 марта 2011, 21:20

Добавил на Яндекс.Карту стандартный элемент YMaps.ToolBar.RulerButton();

Соответственно, кнопка работает как надо. То есть при нажатии на неё, я могу выбирать на карте любой маршрут и в каждой точке при выборе пишется расстояние в удобном виде. Задача простая, нужно общее посчитанное расстояние вывести, например, через alert();

 

Я попробовал так:

 

YMaps.Events.observe(map, map.Events.Click, function(){

        var points = map.getRulerState().split('~');

        if(points.length>1){

            var firstPoint = points[0];

            var secondPoint = points[points.length-1];

            var geoPoint1 = new YMaps.GeoPoint.fromString(firstPoint);

            var geoPoint2 = new YMaps.GeoPoint.fromString(secondPoint);

            var geoCordSystem = new YMaps.GeoCoordSystem();

            var distance = geoCordSystem.rulerDistance(geoPoint1, geoPoint2);

            alert(distance);

        }

Но во-первых, срабатывает метод раньше, чем линейка отрисовала точку, т.к. событие указано map.Events.Click. Как мне получить доступ к самому стандартному объекту, который отвечает за рисование линий и подсчет расстояния.

 

 

Заранее спасибо за помощь.

8 комментариев
Доступа к стандартному объекту нет. Вы можете либо написать собственную линейку, воспользовавшись классом ConnectedPlacemarks. Либо в приведённом коде поставить дополнительно нулевой setTimeout.
Спасибо большое за подсказку.

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

 

Каким образом вам помог setTimeout?

Мне помог не setTimeout(), а то, что нужно реализовать свою линейку. Я думал об этом, но боялся что есть способ проще. Но в любом случае, уже разобрался. И как раз реализовал через ConnectedPlacemarks.

я сделал проще:

 

 

 YMaps.Events.observe(map, map.Events.Click, function(){ 

            

            var points = map.getRulerState().split('~');

            if(points.length > 1){                

                var geoCordSystem = new YMaps.GeoCoordSystem();

                var distance = 0;

                var len = points.length;

                var p0 = points[0].split(',');

                var pnt = new Array();

                pnt[0] = new YMaps.GeoPoint(parseFloat(p0[0]),parseFloat(p0[1]));                

                for(var i=1; i < len; i++) {

                    var px = points[i].split(',');

                    pnt[i] = new YMaps.GeoPoint(pnt[i-1].getLng()+parseFloat(px[0]),pnt[i-1].getLat()+parseFloat(px[1]));

                    distance += geoCordSystem.distance(pnt[i-1],pnt[i]);

                }              

                  

                  //distance = distance /1000;

                

                YMaps.jQuery("#distance").text(Math.round(distance/100)/10);

                YMaps.jQuery("#route").text(this.getRulerState());

        }

 

 

 

Причем Яндекс пишет что:

 

getRulerState

 

{String} getRulerState()

 

Возвращает строковое представление состояния инструмента "Линейка".

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

 

Это вранье координаты меток возвращаются относительно предыдущей, а не первой.

 

 

Кстати да, изначально когда тыкался с этим методом (getRulerState), тоже заметил поведение этих самых смещений. Наверное, просто опечатались.


Ваша реализация и правда проще. 

 

Все отлично, но если вы хотите получить результат аналогичный ленейке следует использовать rulerDistance() вместо distance() в остальном все ок

;-)