Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html>
  2. <html>
  3.   <head>
  4.     <meta charset="utf-8">
  5.     <title>TestMap</title>
  6.     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
  7.   </head>
  8.   <body>
  9.  
  10.     <div id="map" style="width:800px;height:500px;"></div>
  11.  
  12.     <script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
  13.     <script type="text/javascript">
  14.       var map,
  15.         couriers = [
  16.           {
  17.             name: "Имя курьера",
  18.             current_position: [57.117641,65.526741],
  19.             orders: [[
  20.               { // Курьер принял заказ, уже забрал в ресторане, осталось только доставить
  21.                   address: "Тюменская обл., г. Тюмень, Моторостройтелей, 4а",
  22.                   type: 'B',
  23.               },
  24.             ],[
  25.               { // Курьер принял заказ, но еще не забрал в ресторане
  26.                   address: "Тюменская обл., г. Тюмень, Первомайская, 48",
  27.                   type: 'A',
  28.               },{
  29.                   address: "Тюменская обл., г. Тюмень, Ватутина, 7",
  30.                   type: 'B',
  31.               },
  32.             ],[
  33.               { // Новый заказ, на который ищется оптимальный курьер
  34.                   address: "Тюменская обл., г. Тюмень, Тульская, 7", // Ресторан
  35.                   type: 'A',
  36.                   new: true
  37.               },{
  38.                   address: "Тюменская обл., г. Тюмень, Первомайская, 14", // Клиент
  39.                   type: 'B',
  40.                   new: true
  41.               },
  42.             ]
  43.           ]
  44.         }
  45.       ];
  46.  
  47.       ymaps.ready(init);
  48.  
  49.       function getRouteInfo(from_position, to_point){
  50.         let route = [from_position, to_point[0].address];
  51.         return new Promise((resolve) => {
  52.           ymaps.route(route).then(route => {
  53.             resolve({
  54.               address: to_point[0].address,
  55.               type: to_point[0].type,
  56.               time: route.getTime(),
  57.               distance: route.getLength(),
  58.               new: to_point[0].new ? true : false
  59.             });
  60.           })
  61.         });
  62.       }
  63.  
  64.       function getRoutesInfo(courier, orders){
  65.         let promises = [];
  66.         orders.forEach((point,index,arr)=>{
  67.           promises.push(getRouteInfo(courier.route[courier.route.length-1].address, point));
  68.         });
  69.         return Promise.all(promises);
  70.       }
  71.  
  72.       function getShortRoute(courier, orders){
  73.         return new Promise((resolve)=> {
  74.          getRoutesInfo(courier, orders).then(results => {
  75.             results.sort((a, b) => {
  76.               return a.time > b.time;
  77.             });
  78.             courier.route.push(results[0]);
  79.             for (var i = 0; i < orders.length; i++) {
  80.               if(orders[i][0].address == results[0].address && orders[i][0].type == results[0].type) {
  81.                 orders[i].splice(0,1);
  82.                 if(orders[i].length == 0){
  83.                   orders.splice(i,1);
  84.                 }
  85.                 break;
  86.               }
  87.             }
  88.             resolve(orders);
  89.           });
  90.         });
  91.       }
  92.  
  93.       function recursion(courier, orders){
  94.         return new Promise((resolve) => {
  95.             getShortRoute(courier,orders).then(orders => {
  96.               if(orders.length > 0){
  97.                 return recursion(courier, orders).then(result=>{
  98.                   resolve(result); // возврат по рекурсии
  99.                 });
  100.               } else {
  101.                 resolve(courier.route); // здесь выход
  102.               }
  103.             });
  104.           });
  105.       }
  106.  
  107.       function makeShortRoute(courier){
  108.         return new Promise((resolve)=>{
  109.           let orders = courier.orders;
  110.  
  111.           courier.route = [];
  112.           courier.route = [{
  113.               address: courier.current_position, // Точка нахождения курьера
  114.               type: '0',
  115.               time: 0,
  116.               distance: 0
  117.           }];
  118.  
  119.           recursion(courier, orders).then(data => {
  120.             resolve(data);
  121.           });
  122.         })
  123.  
  124.       }
  125.  
  126.       function getArrayByRoute(route){
  127.         let resultRoute = [];
  128.         route.forEach(point=>{
  129.           resultRoute.push(point.address);
  130.         });
  131.         return resultRoute;
  132.       }
  133.  
  134.       function init() {
  135.         ymaps.ready(function() {
  136.           map = new ymaps.Map('map', {
  137.             center: [57.153033, 65.534328],
  138.             zoom: 11
  139.           });
  140.  
  141.           let courier = couriers[0];
  142.           console.time('solving');
  143.           makeShortRoute(courier).then((shortRoutes)=>{
  144.             console.timeEnd('solving');
  145.  
  146.             shortRoutes.forEach((point,index,arr)=>{
  147.               let action = '';
  148.               switch (point.type) {
  149.                 case "A":
  150.                   action = 'Забрать'
  151.                   break;
  152.                 case "B":
  153.                   action = 'Отдать'
  154.                   break;
  155.                 case "0":
  156.                   action = 'Текущее местоположение'
  157.                   break;
  158.               }
  159.               console.log(index+1, action, point.address);
  160.             });
  161.  
  162.             let route = getArrayByRoute(shortRoutes);
  163.             ymaps.route(route).then(route => {
  164.               map.geoObjects.add(route);
  165.               console.log('Примерное время прохождения',(route.getTime()/60).toFixed(0),'мин');
  166.               console.log('Дистанция',(route.getLength()/1000).toFixed(0),'км');
  167.             });
  168.           });
  169.  
  170.         });
  171.       }
  172.  
  173.     </script>
  174.   </body>
  175. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement