Расчёт стоимости доставки
Данный пример показывает, как можно автоматически строить маршрут и рассчитывать стоимость поездки или доставки. Если кликнуть в любое место на карте или вбить нужный адрес в соответствующих полях панели маршрутизации, то на карте отобразится маршрут. В балун маршрута добавится информация о стоимости поездки (доставки).
Чтобы отметить начальную и конечную точки, достаточно кликнуть в нужных местах на карте либо ввести адреса в соответствующих полях панели маршрутизации.
При клике на метке начальной точки откроется балун с информацией о маршруте и стоимости доставки.
index.html
deliveryCalculator.js
<!DOCTYPE html>
<html>
<head>
<title>Расчет стоимости доставки</title>
<meta
http-equiv="Content-Type"
content="text/html; charset=utf-8"
/>
<!--
Укажите свой API-ключ. Тестовый ключ НЕ БУДЕТ работать на других сайтах.
Получить ключ можно в Кабинете разработчика: https://developer.tech.yandex.ru/keys/
-->
<script
src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&apikey=<ваш API-ключ>"
type="text/javascript"
></script>
<script src="deliveryCalculator.js" type="text/javascript"></script>
<style>
html,
body,
#map {
width: 100%;
height: 100%;
padding: 0;
margin: 0;
}
</style>
</head>
<body>
<div id="map"></div>
</body>
</html>
ymaps.ready(init);
function init() {
// Стоимость за километр.
var DELIVERY_TARIFF = 20,
// Минимальная стоимость.
MINIMUM_COST = 500,
myMap = new ymaps.Map("map", {
center: [60.906882, 30.067233],
zoom: 9,
controls: [],
}),
// Создадим панель маршрутизации.
routePanelControl = new ymaps.control.RoutePanel({
options: {
// Добавим заголовок панели.
showHeader: true,
title: "Расчёт доставки",
},
}),
zoomControl = new ymaps.control.ZoomControl({
options: {
size: "small",
float: "none",
position: {
bottom: 145,
right: 10,
},
},
});
// Пользователь сможет построить только автомобильный маршрут.
routePanelControl.routePanel.options.set({
types: { auto: true },
});
// Если вы хотите задать неизменяемую точку "откуда", раскомментируйте код ниже.
/*routePanelControl.routePanel.state.set({
fromEnabled: false,
from: 'Москва, Льва Толстого 16'
});*/
myMap.controls.add(routePanelControl).add(zoomControl);
// Получим ссылку на маршрут.
routePanelControl.routePanel.getRouteAsync().then(function (route) {
// Зададим максимально допустимое число маршрутов, возвращаемых мультимаршрутизатором.
route.model.setParams({ results: 1 }, true);
// Повесим обработчик на событие построения маршрута.
route.model.events.add("requestsuccess", function () {
var activeRoute = route.getActiveRoute();
if (activeRoute) {
// Получим протяженность маршрута.
var length = route
.getActiveRoute()
.properties.get("distance"),
// Вычислим стоимость доставки.
price = calculate(Math.round(length.value / 1000)),
// Создадим макет содержимого балуна маршрута.
balloonContentLayout =
ymaps.templateLayoutFactory.createClass(
"<span>Расстояние: " +
length.text +
".</span><br/>" +
'<span style="font-weight: bold; font-style: italic">Стоимость доставки: ' +
price +
" р.</span>"
);
// Зададим этот макет для содержимого балуна.
route.options.set(
"routeBalloonContentLayout",
balloonContentLayout
);
// Откроем балун.
activeRoute.balloon.open();
}
});
});
// Функция, вычисляющая стоимость доставки.
function calculate(routeLength) {
return Math.max(routeLength * DELIVERY_TARIFF, MINIMUM_COST);
}
}