Клуб API Карт

Расчёт расстояний и стоимости + перенос обеих точек

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

Добрый день, сталкнулся с такой проблемой. 

Мне понадобилось что-бы при расчёте стоимости от точки "А" до точки "Б" можно было перемещать обе точки + геопозиционирование.

С геопозиционированием я разобрался а вот с перемещением точки "Б" всё никак

 

 

function init() {

    var geolocation = ymaps.geolocation,

        // координаты

        coords = [geolocation.latitude, geolocation.longitude],

        myMap = new ymaps.Map('map', {

            center: coords,

            zoom: 5

        }, {

            minZoom: 4,

            maxZoom: 10

        });

    myMap.controls

    // Кнопка изменения масштаба.

    .add('zoomControl', {

        left: 5,

        top: 50

    })

    search = new ymaps.control.SearchControl({

        useMapBounds: true,

        noCentering: true,

        noPlacemark: true

    }),

    calculator = new DeliveryCalculator(myMap, myMap.getCenter());

    myMap.controls.add(search, {

        left: 5,

        top: 5

    });

    search.events.add('resultselect', function (e) {

        var results = search.getResultsArray(),

            selected = e.get('resultIndex'),

            point = results[selected].geometry.getCoordinates();

        calculator.setStartPoint(point);

    });

}

 

function DeliveryCalculator(map, finish) {

    this._map = map;

    this._start = null;

    this._finish = new ymaps.Placemark(finish, {

        iconContent: 'Б'

    });

    this._route = null;

    map.events.add('click', this._onClick, this);

    map.geoObjects.add(this._finish);

}

var ptp = DeliveryCalculator.prototype;

ptp._onClick = function (e) {

    this.setStartPoint(e.get('coordPosition'));

};

ptp._onDragEnd = function (e) {

    var target = e.get('target');

    this.setStartPoint(target.geometry.getCoordinates());

}

ptp.getDirections = function () {

    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).properties.get('balloonContentBody') || '';

            ymaps.route([start, finish])

                .then(function (router) {

                    var distance = Math.round(router.getLength() / 1000),

                        message = 'Расстояние: ' + distance + 'км.

' +

                            'Стоимость доставки: %sр.';

                    self._route = router.getPaths();

                    self._route.options.set({

                        strokeWidth: 5,

                        strokeColor: '0000ffff',

                        opacity: 0.5

                    });

                    self._map.geoObjects.add(self._route);

                    self._start.properties.set('balloonContentBody', address + message.replace('%s', self.calculate(distance)));

                    self._start.balloon.open();

                });

        });

};

ptp.setStartPoint = function (position) {

    if(this._start) {

        this._start.geometry.setCoordinates(position);

    }

    else {

        this._start = new ymaps.Placemark(position, {

            iconContent: 'А'

        }, {

            draggable: true

        });

        this._start.events.add('dragend', this._onDragEnd, this);

        this._map.geoObjects.add(this._start);

    }

    this.getDirections();

};

ptp.calculate = function (len) {

    // Константы.

    var DELIVERY_TARIF = 25,

        MINIMUM_COST = 500;

    return Math.max(len * DELIVERY_TARIF, MINIMUM_COST);

};

 

ymaps.ready(init);