-1

J'essaie de générer un itinéraire avec l'API Google Directions. Générer l'itinéraire n'est pas le problème, mais Je voudrais charger les points d'itinéraire en limitant l'itinéraire en 9 heures ou (32.400 secs)Comment limiter une route par le temps?

J'ai essayé de le mettre dans un While (boucle), le processus calcule le heure, mais une erreur se produit dans le traitement de l'API Directions (Limite de requête dépassée) Est-ce que quelqu'un a des idées?

Mon code ...

(function ($) { 
var directionDisplay; 
var directionsService = new google.maps.DirectionsService(); 
var map; 

var zoomLevel = 16; 
var idInfoBoxAberto; 
var infoBox = []; 
Markers = []; 
cor = '#0586e7'; 
indice = {}; 
customers = new Array(); 

var loc = ' - São Paulo,'; // Define location 
var registros = 1; 

function initialize() { 
    directionsDisplay = new google.maps.DirectionsRenderer({ suppressMarkers: true }); 

    var sp = new google.maps.LatLng(-23.6492, -46.6600); // Define center map (SP- Brasil) 

    var myOptions = { 
     zoom: 16, 
     mapTypeId: google.maps.MapTypeId.ROADMAP, 
     center: sp, 
     disableDefaultUI: true, 
     styles: [{ "stylers": [{ "saturation": -100 }, { "gamma": 1 }] }, { "elementType": "labels.text.stroke", "stylers": [{ "visibility": "off" }] }, { "featureType": "poi.business", "elementType": "labels.text", "stylers": [{ "visibility": "off" }] }, { "featureType": "poi.business", "elementType": "labels.icon", "stylers": [{ "visibility": "off" }] }, { "featureType": "poi.place_of_worship", "elementType": "labels.text", "stylers": [{ "visibility": "off" }] }, { "featureType": "poi.place_of_worship", "elementType": "labels.icon", "stylers": [{ "visibility": "off" }] }, { "featureType": "road", "elementType": "geometry", "stylers": [{ "visibility": "simplified" }] }, { "featureType": "water", "stylers": [{ "visibility": "on" }, { "saturation": 50 }, { "gamma": 0 }, { "hue": "#50a5d1" }] }, { "featureType": "administrative.neighborhood", "elementType": "labels.text.fill", "stylers": [{ "color": "#333333" }] }, { "featureType": "road.local", "elementType": "labels.text", "stylers": [{ "weight": 0.5 }, { "color": "#333333" }] }, { "featureType": "transit.station", "elementType": "labels.icon", "stylers": [{ "gamma": 1 }, { "saturation": 50 }] }] 
    }; 

    map = new google.maps.Map(document.getElementById("google-map"), myOptions); 
    directionsDisplay.setMap(map); 

    calcRoute(' - São Paulo,'); 
} 

initialize(); 

function calcRoute(loc) { 

    $.getJSON('http://dbtraining.com.br/startup/app/maps/rota/' + loc, function (pontos) { 
     var RouteIndex = pontos[0].rota; 
     //console.log(RouteIndex); 

     $.each(pontos, function (index, ponto) { 

      if (RouteIndex != ponto.rota) { 
       RouteIndex = ponto.rota; 
       cor = getRandomColor(); 
      } 

      customers[registros] = { 
       "id": ponto.id, 
       "cliente": ponto.Cliente, 
       "endereco": ponto.endereco, 
       "territorio": ponto.Territorio, 
       "rota": ponto.rota, 
       "distance": ponto.distance, 
       "color": cor, 
       "lat": ponto.lat, 
       "lng": ponto.lng 
      }; 
      registros++; 
     }); 

     //Sort array by Distance 
     customers.sort(function (a, b) { 
      return (a.distance > b.distance) ? 1 : ((b.distance > a.distance) ? -1 : 0); 
     }); 

     var start = new google.maps.LatLng(customers[0].lat, customers[0].lng); 
     var end = new google.maps.LatLng(customers[0].lat, customers[0].lng); 

     var waypts = []; 
     var i = 1; 

     var distance = 0; 
     var time = 0; 
     var totaltime = 0; 

     // Load Waypoints. 
     while (i < 20) { 
      waypts.push({ location: customers[i].endereco, stopover: true }); 


      var request = { 
       origin: start, 
       destination: end, 
       waypoints: waypts, 
       optimizeWaypoints: true, 
       travelMode: google.maps.DirectionsTravelMode.WALKING 
      }; 

      directionsService.route(request, function (response, status) { 
       if (status == google.maps.DirectionsStatus.OK) { 
        directionsDisplay.setDirections(response); 

        var route = response.routes[0]; 

        for (var i = 0; i < route.legs.length; i++) { 
         var theLeg = route.legs[i]; 

         var marker = new google.maps.Marker({ 
          id: i, 
          position: route.legs[i].start_location, 
          map: map, 
          title: "Stop number: " + i, 
          icon: '../img/markers/marker.png', 
          label: { 
           text: i.toString() 
          } 
         }); 

         attachInfoWindow(marker, i, route.legs[i]); 

         time = theLeg.duration.value ; 
         totaltime += time + 5400; 

         console.log("ID.............: " + getKey(customers, "endereco", "R. Herculano de Freitas, 85 - Bela Vista, São Paulo - SP, 01308-020, Brasil")); 
         console.log("Start..........: " + theLeg.start_address); 
         console.log("Destination....: " + theLeg.end_address); 
         console.log("Location.......: " + theLeg.start_location.lat() + "," + theLeg.start_location.lng()); 
         console.log("Distance.......: " + theLeg.distance.text); 
         console.log("Travel time....: " + secondsToTime(theLeg.duration.value)); 
         console.log("Service time...: " + secondsToTime(5400)); 
         console.log(totaltime); 
         console.log("------------------------------"); 

        } 

        if (totaltime >= 32000) { 
         break; // break While Loop 
        } 

       } else { 
        alert("directions response " + status); 
       } 
      }); 

      sleep(1000); 
      i++; 
     } 
    }); //end getJSON 
} 




function secondsToTime(secs) { 
    secs = Math.round(secs); 
    var hours = Math.floor(secs/(60 * 60)); 

    var divisor_for_minutes = secs % (60 * 60); 
    var minutes = Math.floor(divisor_for_minutes/60); 

    var divisor_for_seconds = divisor_for_minutes % 60; 
    var seconds = Math.ceil(divisor_for_seconds); 

    var t = hours + ":" + minutes + ":" + seconds; 

    return t; 
} 

function sleep(milliseconds) { 
    var start = new Date().getTime(); 
    for (var i = 0; i < 1e7; i++) { 
     if ((new Date().getTime() - start) > milliseconds) { 
      break; 
     } 
    } 
} 

function getRandomColor() { 
    var length = 6; 
    var chars = 'ABCDEF'; 
    var hex = '#'; 
    while (length--) hex += chars[(Math.random() * 16) | 0]; 
    return hex; 
} 

function attachInfoWindow(marker, legIndex, leg) { 
    var infowindow = new google.maps.InfoWindow({ 
     content: "<div><h3>Stop Number: " + legIndex + "</h3><p>" + leg.start_address + "</p><a href='#'>(Stop Details)</a></div>" 
    }); 
    google.maps.event.addListener(marker, 'click', function() { //when the marker on map is clicked open info-window 
     infowindow.open(map, marker); 
     console.log(marker.get("id")); 
    }); 

} 

function getKey(obj, prop, val) { 
    var keys = []; 
    for (var key in obj) { 
     if (obj[key].hasOwnProperty(prop) && obj[key][prop] === val) { 
      keys.push(key); 
     } 
    } 
    return keys; 
} 

function dynamicSort(property) { 
    var sortOrder = 1; 
    if (property[0] === "-") { 
     sortOrder = -1; 
     property = property.substr(1); 
    } 
    return function (a, b) { 
     var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0; 
     return result * sortOrder; 
    } 
} 

}) (window.jQuery);

Répondre

0

Je ne l'ai pas lu complet, mais:

// Load Waypoints. 
    while (i < 20) 
    ... 

ne peut pas travailler parce que le service de direction est limité à 8 points d'intérêts dans une requête. Vous devez donc commencer une nouvelle requête après avoir atteint cette limite ou vous en demander d'un point à un autre. Si vous recherchez ici "plusieurs waypoints", vous trouverez beaucoup d'exemples pour la solution.

+0

Lorsque je charge les Waypoints avant d'appeler DirectionsService, la route est traitée sans erreur, mais le temps est beaucoup plus long que mes règles métier. Je sais que DirectionsService est limité à 23 waypoints. Mon problème est le suivant: chargez un point de cheminement, vérifiez l'heure, chargez un autre waypoint et vérifiez à nouveau l'heure jusqu'à ce que le temps soit égal à 32000 secondes –

0

Lorsque je charge les Waypoints avant d'appeler DirectionsService, la route est traitée sans erreur, mais le temps est beaucoup plus long que mes règles métier.

Je sais que DirectionsService est limité à 23 waypoints.

Mon problème est: charger un Waypoint, vérifier le temps, charger un autre point de passage et vérifier le temps jusqu'à ce que le temps est égal à 32000 secondes

// Load Waypoints. 
     while (i < 20) { 
     waypts.push({ location: customers[i].endereco, stopover: true }); 
     i++; 
     } 

Route with 20 waypoints

Lien pour le fichier JSON: http://dbtraining.com.br/startup/app/maps/rota/sp

+0

Peut-être que c'est seulement un problème de temps. Je pense que votre déclaration de sommeil (1000) ne fonctionne pas. Jetez un oeil à ceci: http://stackoverflow.com/questions/951021/what-is-the-javascript-version-of-sleep – ReFran

+0

Le calcul général jusqu'à une limite de temps devrait être relativ simple. Je préférerais le faire étape par étape sans waypoints. J'ai mis un simple calcul de temps dans mon exemple (http://stackoverflow.com/questions/36023443/gmap-study-multi-auto-routes-direction-with-unlimited-waypoints-click-by-click). Vous pouvez essayer si cet exemple de clic par clic fonctionne pour vous. Si vous voulez avoir un exemple basé sur vos besoins, veuillez indiquer quelques lat, lons comme valeurs csv. Json serait un travail supplémentaire. – ReFran