Клуб API Карт

Построение маршрута по своим точкам. Рисование линий по точкам.

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

Всем приветствие!

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

var myLineString = new ymaps.geometry.LineString([[50.657083, 90.575066]]);
geoObject = new ymaps.GeoObject({ geometry: myLineString });
myMap.geoObjects.add(geoObject);

myMap.geoObjects.events.add('click', function (e) {
    myLineString.insert(myLineString.getLength(), e.get('target').geometry.getCoordinates());
		
		
Тут рассчеты..		

});

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

myLineString.insert(myLineString.getLength(), [50.657083, 90.575066]);

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

16 комментариев
Если я правильно понял, то так:
myMap.geoObjects.events.add('click', function (e) {
  updateRoutePath(myLineString, e.get('target').geometry.getCoordinates());
})


function closeRoutePath() {
  updateRoutePath(myLineString, myLineString.get(0));
}


updateRoutePath(path, point) {
  ...
}
Андрей Тебеньков
8 июля 2016, 10:07
dimik,



Вроде суть понял.. но для чего:


function closeRoutePath() {
updateRoutePath(myLineString, myLineString.get(0));
}


?
Андрей Тебеньков
8 июля 2016, 10:45
dimik,



Вот эта часть работает
myMap.geoObjects.events.add('click', function (e) {
myLineString.insert(myLineString.getLength(), e.get('target').geometry.getCoordinates());
});
Эта не работает или я чего-то не то делаю:
myLineString.insert(myLineString.getLength(), e.get('target').geometry.getCoordinates()) {
тут рассчеты
}
updateRoutePath это в моем случае myLineString?
Андрей Тебеньков
8 июля 2016, 10:58
dimik,



В общем вот так у меня, может понятнее будет:
var myLineString = new ymaps.geometry.LineString([[50.657083, 90.575066]]);
geoObject = new ymaps.GeoObject({ geometry: myLineString });
myMap.geoObjects.add(geoObject);

myMap.geoObjects.events.add('click', function (e) {
myLineString.insert(myLineString.getLength(), e.get('target').geometry.getCoordinates());
var thisPlacemark = e.get('target');
var content = thisPlacemark.properties.get('balloonContentHeader');

$("#marshrut2").append(content + '<br />');
$("#marshrut3").append('<a href="" onclick="fresh();">сбросить маршрут</a><br />');
$("#marshrut3").append('<a href="marhclose:;" id="marhclose">замкнуть маршрут</a>');


var dmap = ymaps.formatter.distance(geoObject.geometry.getDistance(), 3);
$("#rulersy").empty(dmap);
$("#rulersy").append(dmap);
});


Непонятно что повешать на <a href="marhclose:;" id="marhclose"> чтобы маршрут закрывался кликом не на карте и значение dmap было посчитано верно.
Андрей Тебеньков,


function updateRoutePath(path, point) {
  path.insert(path.getLength(), point);
}
Это метод куда надо вынести общую часть из обработчика, чтобы переиспользовать для замыкания контура, без вызова самого обработчика

Андрей Тебеньков
8 июля 2016, 12:01
dimik,



Чего я еще сделал не так?


<a href="marhclose:;" onclick="closeRoutePath();">замкнуть маршрут</a>



function closeRoutePath() {
updateRoutePath(myLineString.getLength(), myLineString.get(0));
}


VM42513:1 Uncaught ReferenceError: closeRoutePath is not definedonclick @ VM42513:1
Андрей Тебеньков
8 июля 2016, 12:38
dimik,

Застревает вот тут: 
Андрей Тебеньков
8 июля 2016, 12:38
(function(event){closeRoutePath();
})
Андрей Тебеньков
8 июля 2016, 13:52
dimik,
Может что-то еще можно попробовать?
Андрей Тебеньков,
onclick="closeRoutePath();"
так делать не надо.
используйте хотя бы jQuery
Андрей Тебеньков
8 июля 2016, 15:02
dimik,



Я пробовал так:
<a href="marhclose:;" id="marhclose">замкнуть маршрут</a>



$("#marhclose").click(function(){
updateRoutePath(myLineString.getLength(), myLineString.get(0));
});


Ни ошибок и никакой реакции.
Андрей Тебеньков
8 июля 2016, 15:16
dimik,

Нашел, не работало потому что у меня там конструкция:
$("#marshrut3").append('<a href="marhclose:;" id="marhclose">замкнуть маршрут</a>');



закрывает маршрут такая конструкция соответственно:
$("#marshrut3").click(function(){
updateRoutePath(myLineString.getLength(), myLineString.get(0));
});


Осталась одна проблема: этот отрезок не включается в остальную длину, чего-то не хватает.
Андрей Тебеньков
8 июля 2016, 15:16
dimik,

Нашел, не работало потому что у меня там конструкция:
$("#marshrut3").append('<a href="marhclose:;" id="marhclose">замкнуть маршрут</a>');



закрывает маршрут такая конструкция соответственно:
$("#marshrut3").click(function(){
updateRoutePath(myLineString.getLength(), myLineString.get(0));
});


Осталась одна проблема: этот отрезок не включается в остальную длину, чего-то не хватает.
Андрей Тебеньков,
После замыкания надо перерасчитывать длину
Андрей Тебеньков
8 июля 2016, 15:37
dimik,



у меня получается, что нужно повторить все расчеты в конструкцию
$("#marshrut3").click(function(){
updateRoutePath(myLineString.getLength(), myLineString.get(0));


......


});
Либо перезапустить как-то всю эту конструкцию:

myMap.geoObjects.events.add('click', function (e) {.......});

Можно как-то перезапустить ее, чтобы не городить все расчеты еще раз?