Добрый день.
Сделал на примере рассчета стоимости из песочницы Яндекс API. Не могу понять почему не работает перетаскивание маршрута. Что делаю не так? Код ниже:
myMap = new ymaps.Map('map', {
center: [55.76, 37.64],
zoom: 10,
type: 'yandex#map',
behaviors: ['scrollZoom', 'drag']
}),
search = new ymaps.control.SearchControl({
useMapBounds: true,
noCentering: true,
noPlacemark: true
}),
search2 = new ymaps.control.SearchControl({
useMapBounds: true,
noCentering: true,
noPlacemark: true
}),
calculator = new DeliveryCalculator(myMap, myMap.getCenter()
myMap.controls.add(search, { right: 5, top: 5 }
myMap.controls.add(search2, { right: 260, top: 5 }
myMap.controls
// Кнопка изменения масштаба.
.add('zoomControl', { left: 5, top: 5 })
// Список типов карты
.add('typeSelector', { left: 229, top: 5 })
.add('mapTools', { left: 35, top: 5 }
var trafficControl = new ymaps.control.TrafficControl(
myMap.controls
.add('trafficControl', {left: 131, top: 5})
.add(new ymaps.control.MiniMap({
type: 'yandex#publicMap'
})
search.events.add('resultselect', function (e) {
var results = search.getResultsArray(),
selected = e.get('resultIndex'),
point = results[selected].geometry.getCoordinates(
calculator.setStartPoint(point);
}
search2.events.add('resultselect', function (e2) {
var results2 = search2.getResultsArray(),
selected2 = e2.get('resultIndex'),
point2 = results2[selected2].geometry.getCoordinates(
calculator.setFinishPoint(point2);
}
}
var start = null;
var finish = null;
function DeliveryCalculator(map, finish) {
this._map = map;
this._start = null;
this._finish = null;
this._route = null;
myMap.events.add('click', this._onClick, this);
}
var ptp = DeliveryCalculator.prototype;
ptp._onClick = function (e) {
var position = e.get('coordPosition');
if(!this._start) {
finish = null;
this._start = new ymaps.Placemark(position,
{
iconContent: "Поставщик",
hintContent: "Перетащите метку и кликните, чтобы узнать адрес"
}, {
draggable: "true",
preset: "twirl#greenStretchyIcon",
// Заставляем балун открываться даже если в нем нет содержимого.
openEmptyBalloon: true
}
this._start.events.add('dragend', this._onDragEnd, this);
this._map.geoObjects.add(this._start);
} else if (!this._finish) {
this._finish = new ymaps.Placemark(position,
{
iconContent: "Заказчик",
hintContent: "Перетащите метку и кликните, чтобы узнать адрес"
}, {
draggable: "true",
preset: "twirl#redStretchyIcon",
// Заставляем балун открываться даже если в нем нет содержимого.
openEmptyBalloon: true
}
this._finish.events.add('dragend', this._onDragEnd, this);
this._map.geoObjects.add(this._finish);
} else {
this._map.geoObjects.remove(this._start);
this._start = null;
this._map.geoObjects.remove(this._finish);
this._finish = null;
this._map.geoObjects.remove(this._route);
this._route = null;
start = null;
finish = null;
}
this.getDirections(
};
ptp._onDragEnd = function (e) {
this.getDirections(
};
ptp.getDirections = function () {
try
{
var self = this;
start = this._start.geometry.getCoordinates(
finish = this._finish.geometry.getCoordinates(
if(this._route) {
this._map.geoObjects.remove(this._route);
}
ymaps.geocode(start, { results: 1 })
.then(function (geocode) {
var address = geocode.geoObjects.get(0) &&
geocode.geoObjects.get(0)
ymaps.route([start, finish])
.then(function (router) {
self._route = router.getPaths(
self._route.options.set({ strokeWidth: 5, strokeColor: '0000ffff', opacity: 0.5 }
self._map.geoObjects.add(self._route);
var distance = Math.round(router.getLength() / 1000);
document.getElementById("txt4").value = distance;
dost_for_map(
var message = '<span>Расстояние: ' + distance + 'км.</span><br/>' +
'<span style="font-weight: bold; font-style: italic">Стоимость доставки: '+document.getElementById
self._start.properties.set('balloonContentBody', address + message);
self._start.balloon.open(
router.editor.start({ addWayPoints: true }
}
}
}
catch (e) {}
};
ptp.setStartPoint = function (position) {
if(this._start) {
this._start.geometry.setCoordinates(position);
}
else {
this._start = new ymaps.Placemark(position, //{ iconContent: 'Поставщик' }, { draggable: true }
{
iconContent: "Поставщик",
hintContent: "Перетащите метку и кликните, чтобы узнать адрес"
}, {
draggable: "true",
preset: "twirl#greenStretchyIcon",
// Заставляем балун открываться даже если в нем нет содержимого.
openEmptyBalloon: true
}
this._start.events.add('dragend', this._onDragEnd, this);
this._map.geoObjects.add(this._start);
//start = this._start.geometry.getCoordinates(
}
this.getDirections(
};
ptp.setFinishPoint = function (position) {
if(this._finish) {
this._finish.geometry.setCoordinates(position);
}
else {
this._finish = new ymaps.Placemark(position, //{ iconContent: 'Заказчик' }, { draggable: true }
{
iconContent: "Заказчик",
hintContent: "Перетащите метку и кликните, чтобы узнать адрес"
}, {
draggable: "true",
preset: "twirl#redStretchyIcon",
// Заставляем балун открываться даже если в нем нет содержимого.
openEmptyBalloon: true
}
//this._finish.events.add('dragend', this._onFinishPointChange, this);
this._finish.events.add('dragend', this._onDragEnd, this);
this._map.geoObjects.add(this._finish);
//finish = this._finish.geometry.getCoordinates(
}
this.getDirections(
};
ptp.calculate = function (len) {
// Константы.
var DELIVERY_TARIF = 20,
MINIMUM_COST = 500;
return Math.max(len * DELIVERY_TARIF, MINIMUM_COST);
};
ymaps.ready(init);