2013-10-11 6 views
0

Я новичок в яваскрипт и я эту проблему с направлениями Google:Массив направления с Google API направления

У меня есть таблица, которая содержит координаты различных мест, таких как:

lieux = [ 
    {"nom": "place1", "icon": "galerie.png", "coordinates": [46.2018773, 6.1396896]}, 
    {"nom": "place2", "icon": "galerie.png", "coordinates": [46.1989726, 6.1371983]}, 
    {"nom": "place3", "icon": "galerie.png", "coordinates": [46.1976313, 6.1382951]}, 
    {"nom": "place4", "icon": "galerie.png", "coordinates": [46.1997394, 6.1388766]} 
]; 

I 'd хотел бы создать кнопку направления для каждого места, которое вычисляет маршрут к нему. Вот функция, вычислить путь, это за пределами инициализатор()

function errorfunction(error){ 
    console.log(error); 
}; 

function successfunction(position){ 
    myLatitude = position.coords.latitude; 
    myLongitude = position.coords.longitude; 
}; 

calcul_itin = function() {                
    origin = myLatitude+","+myLongitude;             
    for (i = 0; i < place.length; i++) { 
     lieuxLat = place[i].coordinates[0];            
     lieuxLong = place[i].coordinates[1]; 
     destination = placeLat+","+placeLong;           
    } 
    if(origin && destination){ 
     var request = { 
      origin  : origin, 
      destination : destination, 
      travelMode : google.maps.DirectionsTravelMode.WALKING      
     } 
     var directionsService = new google.maps.DirectionsService();      
     directionsService.route(request, function(response, status){      
      if(status == google.maps.DirectionsStatus.OK){ 
       direction.setDirections(response);          
      } 
     }); 
    }; 
}; 

Но каждая кнопка расчета маршрута для последнего места за столом, и я не знаю, как организовать свой код, чтобы изменить это.

+0

взглянуть на https://developers.google.com/maps/documentation/directions/ и https://developers.google.com/maps/documentation/distancematrix/ – Plato

+0

Я прошу подобный вопрос несколько раз назад он может вам помочь: http: // stackoverflow.ком/вопросы/19125716/подожди-для-конца из-ан-асинхронной-JavaScript-функции к получить-а-результат-де – AlexB

ответ

0

Вы продолжаете переписывать направления обслуживания для каждого нового запроса. Вы не можете перезаписать его, пока запрос не вернется с сервера. Поэтому либо связывайте свои запросы (вызывайте следующее, когда заканчивается предыдущий запрос), либо создавайте отдельный объект DirectionsService для каждого запроса.

Обратите внимание, что DirectionsService:

  1. подлежит ограничение скорости
  2. подлежит квоте
  3. асинхронный, требует взаимодействия с сервером. Обратный вызов выполняется, когда ответ возвращается с сервера.
1

Если я правильно понимаю, что вы хотите, чтобы рассчитать кратчайший (или быстрый) путь из одного места в многих направлений, и вы должны иметь детальную информацию о пути на самом деле отображать эти пути на карте.

Я думаю, ваша проблема в том, что вы делаете только запрос на одно путешествие от источника до последнего места назначения в своем списке мест назначения. Все остальные адресаты будут перезаписаны, так как запрос в Directions Service расположен после вашей петли через пункты назначения. Вам нужно сделать отдельный запрос для каждой поездки, и каждый результат направления должен быть предоставлен отдельно, используя вашу собственную реализацию или отдельный DirectionsRenderer. Поэтому ваш звонок в службу проезда должен быть внутриfor петля. Вам также необходимо управлять рендерерами, поскольку вы, вероятно, захотите удалить старые средства рендеринга, когда будет сделан новый вызов calcul_itin.

Следующий код иллюстрирует этот подход. Возможно, вам захочется персонализировать пути и маркеры.

var directionRenderers = []; // array for keeping track of renderers 
calcul_itin = function(origin) { 
    // Remove previous renderers 
    for (var i=0; i < directionRenderers.length; i++) { 
     directionRenderers[i].setMap(null); 
    } 
    directionRenderers = []; 
    // create a request for each destination 
    for (i = 0; i < lieux.length; i++) { // guess destinations are in lieux... 
     var dest = lieux[i].coordinates[0] +','+ lieux[i].coordinates[1]; 
     var request = { 
      origin: origin,  // assume origin is an instance of google.maps.LatLng 
      destination: dest, 
      travelMode: google.maps.DirectionsTravelMode.WALKING 
     }; 
     var directionsService = new google.maps.DirectionsService(); 
     directionsService.route(request, function(response, status){      
      if(status == google.maps.DirectionsStatus.OK){ 
       // create a new DirectionsRenderer for this route 
       var dirRenderer = new google.maps.DirectionsRenderer({map: map}); 
       dirRenderer.setDirections(response); 
       directionRenderers.push(dirRenderer); // track the renderers 
      } 
     }); 
    } 
}; 

Следует также отметить, что Google Directions API имеет пределы квот и ставок, и вышеупомянутый подход делает много запросов на эту услугу, так что будьте осторожны, чтобы не использовать слишком много направлений.

Если вам нужно только расстояние и время в пути для нескольких источников/направлений, вам лучше использовать Google Distance Matrix API. Но в этом случае вы не получите подробную информацию о пути.

Смежные вопросы