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

旅程を計算する各場所の方向ボタンを作成したいと思います。パスを計算する関数は次のとおりです。initializer() の外側にあります。

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

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 に答える