Клуб API Карт

как сделать перемещение старта и финиша маршрута

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

Здравствуйте. Есть задача строить маршрут для такси и расчитывать растояние которое нужно проехать (только по Волгограу). После нажатия на "рассчитать" идет расчет расстояния и построение маршрута на карте, но яндекс некоторые адреса не точно показывает и мне нужно сделать чтобы можно было смещать вручную  метки начала и конца маршрута, в идеале и промежуточных точек. Но вот как это сделать пока не могу придумать.

19 комментариев
Алексей Yarrr!
28 января 2016, 03:39

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

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

спасибо у меня был вариант тоже менять просто метки старт и финиш на смещаемые плейсмарки, но как быть например с промежуточными точками? хочу просмотреть все варианты, а на уме только один)

Алексей Yarrr!
28 января 2016, 03:39

Создавать динамически при кклике на путь? Или он не ловит событий?

Евгений Белоусов
28 января 2016, 03:39

как-то так:

route.getPaths().get(1).geometry.setCoordinates(...);route.getPaths().get(route.getLength()-1).geometry.setCoordinates(...);

 

Понятно что чтение документации это моветон, но зачем придумывать то что уже сделано?

Модуль редактор маршрута есть уже начиная с первой версии

 

вот такой кусок кода у меня который определает маршрут

 

myRouter = ymaps.route(str, 

    {

        mapStateAutoApply: true

    });    

    myRouter .then(function(router) {

route && myMap.geoObjects.remove(route);

 route = router;

//вот тут ставил  route.editor.start();

route && myMap.geoObjects.remove(route);

        route = router;

// Добавление маршрута на карту

myMap.geoObjects.add(route);

/////вот тут код определения растояния и тд. тп

 

///в конце ставил route.editor.stop();

    },

   function (error) {

          //текст ошибки

      });

вопрос: что тут нужно добавить/изменить чтобы редактирование заработало?

 

 

ты сначала запустил редактирование,

а затем зачем-то вызвал stop()

есс-но оно выключилось

раскоментировал route.editor.start();

но так ничего не возможно переместить/редактировать=(

http://romansl.cybers.net.ua/


по твоей ссылке в коде нет слова "editor"

Что-то я ничего не пойму. вот полностью код функции, где нужно указать "editor"?

 

function Geo(saddr,eaddr){ 

    var str=new Array();

     str.push({type: "Point", point:saddr});

       $('.otherpoint').each(function(i,elem) {

           if($(elem).val()!=''){

            str.push({type: "viaPoint", point:'Волгоград '+$(elem).val()+' '+$(elem).next('.house').val()});

           }

        }); 

       str.push({type: "Point", point:eaddr});

  

    myRouter = ymaps.route(str, 

    {

        mapStateAutoApply: true

    });    

    myRouter .then(function(router) {

route && myMap.geoObjects.remove(route);

        route = router;

route.editor.start();//вот тут включил вроде этот эдитор

// Добавление маршрута на карту

myMap.geoObjects.add(route);

console.log(route.getWayPoints());

        var cena=90;

        if(parseFloat(route.getLength())

                cena=0;

            }

        $("#dl").html(parseFloat(route.getLength()/1000)+' км');

            if(parseFloat(route.getLength())

                if(Discount==0){

                    price=' цена '+ cena +' руб';

                }else{

                    price=' цена '+(parseInt(cena)-(parseInt(cena)*0.2)) +' руб';

                }

                $("#vr").html(price); 

            }else{

                if(Discount==0){

                     cena=((parseFloat(route.getLength()/1000)-2)*10)+90;

                }else{

                        cena=(((parseInt(route.getLength()/1000)-2)*10)+90)-(((parseInt(route.getLength()/1000)-2)*10)+90)*0.2;

                }

                price=' цена '+ parseInt(cena) +' руб';

                $("#vr").html(price);

            }

            

    },

   function (error) {

            alert('Невозможно расчитать растояние для этого маршрута');

             $("#vr").html(' неизвестно');

             $("#dl").html(' неизвестно');

      });

  

} //end GEO

Если Вы сами в своем коде ничего не понимаете, что там пойму я?

Сделал пример

есть, разобрался, у меня просто "Editor" был перед построением маршрута включен 

 

route.editor.start();//вот тут включил вроде этот эдитор

// Добавление маршрута на карту

myMap.geoObjects.add(route);

 

а нужно было наоборот:

 

// Добавление маршрута на карту

myMap.geoObjects.add(route);

route.editor.start();//вот тут включил вроде этот эдитор

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

как достучаться до события routeupdate

чтобы отлавливать изменение маршрута, пробовал вот так

router.editor.events('routeupdate',function(){console.log('d')})

но оно не работает

загляни в консоль, там написано, что

поле events не функция, а объект

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

Если вы хотите в своем приложении обновлять информацию, связанную с маршрутом, то нужно делать проверку e.get('rough') == false, чтобы избежать частой обработки этого события.



в поле events у всех объектов в АПИ лежит один и тот же экземпляр event.Manager-a, посмотри какие у него методы

я попробовал вот так 

geoObjectItem.events.fire(('routeupdate',function(e){ console.log('dfsdf')}))

и вот так

myMap.events.add('routeupdate', function (e) {console.log('dfsdf')});

но снова что-то не то, или пишу не так

 

слушать надо на редакторе

router.editor.events.add('routeupdate', function (e) {

    console.log('update');

});

спасибо, все получилось