Клуб API Карт

Расчет стоимости доставки с исключениями отдельных направлений!?

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

Здравствуйте!
Вопрос следующего характера, есть в песочнице Расчет стоимости доставки: https://tech.yandex.ru/maps/jsbox/2.1/deliveryCalculator теперь, там имеется возможность менять стоимость за км. По любым направлениям.

            calculate: function (routeLength) {
                // Константы.
                var DELIVERY_TARIF = 20, // Стоимость за километр.
                    MINIMUM_COST = 500; // Минимальная стоимость.

                return Math.max(routeLength * DELIVERY_TARIF, MINIMUM_COST);
            },

Теперь есть список из 22 направления, где цена за км другая: 

Краснодар — Симферополь

Краснодар — Москва

Краснодар — Санкт-Петербург

Майкоп — Севастополь

Новороссийск — Москва

Ставрополь — Москва

Ростов-на-дону — Севастополь

Ставрополь — Симферополь

Миниральные Воды — Москва

Пятигорск — Санкт-Петербург

Майкоп — Москва 

И обранто по этому 22 направления, исключения из остального!

Теперь этим исключениям возможно прописать свою цену за 1 км!? На каждое направление что туда, что обратно? 

Как можно обыграть данный случай!? Спасибо!

4 комментария
Сделайте выбор домашнего региона на основе геолокации (с возможностью выбрать самому)
Отправляйте его на сервер, сервер определяет в на его основе откуда доставлять и стоимость 1км либо фиксированная стоимость и отправляет назад для расчета
Александр Сенькин
6 апреля 2016, 11:08
dimik,
Дело в том что я совсем недавно стал работать и вообще сталкиваться с картами Яндекса. Теперь с вашего поста я понял одно, что его написал dimik!!! ) За ранее прошу прощение за не знания js, но необходимо данная функция на сайте...

Вы можете показать пример!? Если вам не трудно!!!
Александр Сенькин,
Пример геолокации
https://tech.yandex.ru/maps/jsbox/2.1/geolocated_map

Без знания javascript примеры не помогут
Удалённый пользователь
10 апреля 2016, 12:20
dimik,
А если вот так, добавочный java? Почему то не читается, белый экран!?
function init() {
var myMap = new ymaps.Map('map', {
center: [55.75396, 37.620393],
zoom: 9,
controls: ['zoomControl']
}),
// Создаем коллекцию.
myCollection = new ymaps.GeoObjectCollection(),
// Создаем массив с данными.
myPoints = [
{ coords: [45.040216, 38.975996], text: 'Краснодар' },
{ coords: [44.952116, 34.102411], text: 'Симферополь' },
{ coords: [55.75396, 37.620393], text: 'Москва' },
{ coords: [59.939095, 30.315868], text: 'Санкт-Петербург' },
{ coords: [44.609764, 40.100516], text: 'Майкоп' },
{ coords: [44.723566, 37.768678], text: 'Новороссийск' },
{ coords: [45.044502, 41.969065], text: 'Ставрополь' },
{ coords: [47.222531, 39.718705], text: 'Ростов-на-Дону' },
{ coords: [44.208799, 43.13834], text: 'Миниральные Воды' },
{ coords: [44.03977, 43.070804], text: 'Пятигорск' }
];

// Заполняем коллекцию данными.
for (var i = 0, l = myPoints.length; i < l; i++) {
var point = myPoints[i];
myCollection.add(new ymaps.Placemark(
point.coords, {
balloonContentBody: point.text
}
));
}

// Добавляем коллекцию меток на карту.
myMap.geoObjects.add(myCollection);

// Создаем экземпляр класса ymaps.control.SearchControl
var mySearchControl = new ymaps.control.SearchControl({
options: {
// Заменяем стандартный провайдер данных (геокодер) нашим собственным.
provider: new CustomSearchProvider(myPoints),
// Не будем показывать еще одну метку при выборе результата поиска,
// т.к. метки коллекции myCollection уже добавлены на карту.
noPlacemark: true,
resultsPerPage: 5
}});

// Добавляем контрол в верхний правый угол,
myMap.controls
.add(mySearchControl, { right: 10, top: 10 });
}


// Провайдер данных для элемента управления ymaps.control.SearchControl.
// Осуществляет поиск геообъектов в по массиву points.
// Реализует интерфейс IGeocodeProvider.
function CustomSearchProvider(points) {
this.points = points;
}

// Провайдер ищет по полю text стандартным методом String.ptototype.indexOf.
CustomSearchProvider.prototype.geocode = function (request, options) {
var deferred = new ymaps.vow.defer(),
geoObjects = new ymaps.GeoObjectCollection(),
// Сколько результатов нужно пропустить.
offset = options.skip || 0,
// Количество возвращаемых результатов.
limit = options.results || 20;

var points = [];
// Ищем в свойстве text каждого элемента массива.
for (var i = 0, l = this.points.length; i < l; i++) {
var point = this.points[i];
if (point.text.toLowerCase().indexOf(request.toLowerCase()) != -1) {
points.push(point);
}
}

/calculate: function (routeLength) {
// Константы.
var DELIVERY_TARIF = 20, // Стоимость за километр.
MINIMUM_COST = 500; // Минимальная стоимость.

return Math.max(routeLength * DELIVERY_TARIF, MINIMUM_COST);
},
// При формировании ответа можно учитывать offset и limit.
points = points.splice(offset, limit);
// Добавляем точки в результирующую коллекцию.
for (var i = 0, l = points.length; i < l; i++) {
var point = points[i],
coords = point.coords,
text = point.text;
geoObjects.add(new ymaps.Placemark(coords, {
name: text + ' name',
description: text + ' description',
balloonContentBody: '<p>' + text + distance+'км.' + calculate(distance)+'p.</p>',
boundedBy: [coords, coords]
}));
}
//расчет стоимости
for (var i = 0, l = points.length; i < l; i++) {
var point = points[i],
coords = point.coords,
text = point.text;

ymaps.route([point[i], point[i+1]]){
var distance = Math.round(route[point[i].coords, point[i+1].coords]/1000)

},
}


deferred.resolve({
// Геообъекты поисковой выдачи.
geoObjects: geoObjects,
// Метаинформация ответа.
metaData: {
geocoder: {
// Строка обработанного запроса.
request: request,
// Количество найденных результатов.
found: geoObjects.getLength(),
// Количество возвращенных результатов.
results: limit,
// Количество пропущенных результатов.
skip: offset
}
}
});

// Возвращаем объект-обещание.
return deferred.promise();
};

ymaps.ready(init);