0

我是 javascript 新手,我对 google 方向有这个问题:

我有一个表格,其中包含不同地方的坐标,例如:

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]}
];

我想为每个计算行程的地方创建方向按钮。这是计算路径的函数,它在初始化器()之外

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);                                      
            }
        });
    }; 
};

但是,每个按钮都会计算表格最后一个位置的行程,我不知道如何安排我的代码来改变它。

4

2 回答 2

1

如果我理解正确,您想要计算从一个位置到多个目的地的最短(或最快)路径,并且您需要详细的路径信息才能在地图上实际显示这些路径。

我认为您的问题是您只请求从起点到目的地列表中的最后一个目的地的单程旅行。所有其他目的地都将被覆盖,因为对路线服务的请求位于您循环通过目的地之后。您需要为每次旅行发出单独的请求,并且需要使用您自己的实现或单独的 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。但在这种情况下,您不会获得详细的路径信息。

于 2013-10-14T16:02:17.487 回答
0

您不断为每个新请求覆盖方向服务。在请求从服务器返回之前,您无法覆盖它。因此,要么链接您的请求(在前一个请求完成时调用下一个请求),要么为每个请求创建一个单独的 DirectionsService 对象。

请注意DirectionsService

  1. 受速率限制
  2. 受配额限制
  3. 是异步的,需要与服务器交互。当响应从服务器返回时,回调运行。
于 2013-10-11T14:22:44.627 回答