Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>TestMap</title>
- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
- </head>
- <body>
- <div id="map" style="width:800px;height:500px;"></div>
- <script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
- <script type="text/javascript">
- var map,
- couriers = [
- {
- name: "Имя курьера",
- current_position: [57.117641,65.526741],
- orders: [[
- { // Курьер принял заказ, уже забрал в ресторане, осталось только доставить
- address: "Тюменская обл., г. Тюмень, Моторостройтелей, 4а",
- type: 'B',
- },
- ],[
- { // Курьер принял заказ, но еще не забрал в ресторане
- address: "Тюменская обл., г. Тюмень, Первомайская, 48",
- type: 'A',
- },{
- address: "Тюменская обл., г. Тюмень, Ватутина, 7",
- type: 'B',
- },
- ],[
- { // Новый заказ, на который ищется оптимальный курьер
- address: "Тюменская обл., г. Тюмень, Тульская, 7", // Ресторан
- type: 'A',
- new: true
- },{
- address: "Тюменская обл., г. Тюмень, Первомайская, 14", // Клиент
- type: 'B',
- new: true
- },
- ]
- ]
- }
- ];
- ymaps.ready(init);
- function getRouteInfo(from_position, to_point){
- let route = [from_position, to_point[0].address];
- return new Promise((resolve) => {
- ymaps.route(route).then(route => {
- resolve({
- address: to_point[0].address,
- type: to_point[0].type,
- time: route.getTime(),
- distance: route.getLength(),
- new: to_point[0].new ? true : false
- });
- })
- });
- }
- function getRoutesInfo(courier, orders){
- let promises = [];
- orders.forEach((point,index,arr)=>{
- promises.push(getRouteInfo(courier.route[courier.route.length-1].address, point));
- });
- return Promise.all(promises);
- }
- function getShortRoute(courier, orders){
- return new Promise((resolve)=> {
- getRoutesInfo(courier, orders).then(results => {
- results.sort((a, b) => {
- return a.time > b.time;
- });
- courier.route.push(results[0]);
- for (var i = 0; i < orders.length; i++) {
- if(orders[i][0].address == results[0].address && orders[i][0].type == results[0].type) {
- orders[i].splice(0,1);
- if(orders[i].length == 0){
- orders.splice(i,1);
- }
- break;
- }
- }
- resolve(orders);
- });
- });
- }
- function recursion(courier, orders){
- return new Promise((resolve) => {
- getShortRoute(courier,orders).then(orders => {
- if(orders.length > 0){
- return recursion(courier, orders).then(result=>{
- resolve(result); // возврат по рекурсии
- });
- } else {
- resolve(courier.route); // здесь выход
- }
- });
- });
- }
- function makeShortRoute(courier){
- return new Promise((resolve)=>{
- let orders = courier.orders;
- courier.route = [];
- courier.route = [{
- address: courier.current_position, // Точка нахождения курьера
- type: '0',
- time: 0,
- distance: 0
- }];
- recursion(courier, orders).then(data => {
- resolve(data);
- });
- })
- }
- function getArrayByRoute(route){
- let resultRoute = [];
- route.forEach(point=>{
- resultRoute.push(point.address);
- });
- return resultRoute;
- }
- function init() {
- ymaps.ready(function() {
- map = new ymaps.Map('map', {
- center: [57.153033, 65.534328],
- zoom: 11
- });
- let courier = couriers[0];
- console.time('solving');
- makeShortRoute(courier).then((shortRoutes)=>{
- console.timeEnd('solving');
- shortRoutes.forEach((point,index,arr)=>{
- let action = '';
- switch (point.type) {
- case "A":
- action = 'Забрать'
- break;
- case "B":
- action = 'Отдать'
- break;
- case "0":
- action = 'Текущее местоположение'
- break;
- }
- console.log(index+1, action, point.address);
- });
- let route = getArrayByRoute(shortRoutes);
- ymaps.route(route).then(route => {
- map.geoObjects.add(route);
- console.log('Примерное время прохождения',(route.getTime()/60).toFixed(0),'мин');
- console.log('Дистанция',(route.getLength()/1000).toFixed(0),'км');
- });
- });
- });
- }
- </script>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement