2013-01-02 35 views
0

我試圖簡單地從一組用戶位置獲取距離。這些位置是在代碼的早些時候從數據庫中調用的。 「places」數組中有3個條目,每個條目都包含一些信息和一個「distance」和「duration」字段,它們都被設置爲0作爲佔位符。我試圖遍歷DistanceMatrix「distance.text」和「duration.text」結果並將它們添加到相應對象的「距離」和「持續時間」字段中,但我無法在回調中使用位置[i]函數,或者,如果我嘗試在回調之外添加值,則會丟失返回的值。如果有人能幫助我,我會很開心。將距離矩陣結果放入現有陣列

 var service = new google.maps.DistanceMatrixService();//request distance matrix 
    var outputdiv = document.getElementById('info'); 

    for (var i=1;i<places.length;i++){ 
     var goto = new google.maps.LatLng(places[i].lat, places[i].lng); 
      service.getDistanceMatrix(
       { 
       origins: [foundlatlng], 
       destinations: [goto], 
       travelMode: google.maps.TravelMode.WALKING, 
       unitSystem: google.maps.UnitSystem.IMPERIAL, 
       avoidHighways: false, 
       avoidTolls: false, 
       }, callback);//end service.getdistancematrix() 

       function callback(response, status) { 
       var distancefield = distancefield; 
        if (status == google.maps.DistanceMatrixStatus.OK) { 
        var origins = response.originAddresses; 
        var destinations = response.destinationAddresses; 
        var results = response.rows[0].elements; 

         for (var r = 0; r < results.length; r++) { 
         var element = results[r]; 
         var distancetext = element.distance.text; 
         var durationtext = element.duration.text; 
         var to = destinations[r]; 
         }//end for r 

        }//end if status=ok 
       }//end callback 

    };//end for i 
    console.log(places); 

非常感謝您提供任何幫助!

+0

你有地方數組的樣本? – geocodezip

+0

什麼是「[f​​oundlatlng]」? – geocodezip

+0

foundlatlng是由GPS找到的座標,表示爲google.maps.LatLng。它來自代碼中的較早部分。 –

回答

0

Distance Matrix調用是異步的,您需要更新您的數組並使用回調函數內的返回值。

(將執行console.log(地方)將始終運行日期纔回來)

我沒有看到你的問題返回的數據添加到您的「地方」陣列中的任何代碼,這應該是在回調例程中,你現在正在做的就是在本地範圍內創建變量,一旦回調函數退出,變量將不可用。

看起來您似乎沒有利用DistanceMatrix服務獲取多個來源和目的地的能力,並在一次呼叫中返回它們之間的行駛距離。您發佈的代碼使用它的方式效率低下,並且一次只返回一個結果(如果您打算這麼做,則不妨使用DirectionsService)。

working example with made up data

+0

感謝您的回覆。位置數組只是地址,描述,鏈接(到網站)等)作爲對象的每個目的地。我最初在一個請求中完成了所有的呼叫,但遇到了類似的問題......也許我應該回到這個問題。但是,返回數據之前運行的console.log可能會回答我的問題。非常感謝! –

+0

添加了一個[工作示例](http://www.geocodezip.com/v3_simpleMap_distanceMatrix.html)到我的答案。 – geocodezip

+0

我試着再次調用它們,除了使用ic3b3rg的解析結果的方法,它的工作!非常感謝!!! –

0

我覺得這是做它的方式:

var placesIndex = 0; 
calculateDistance(); 

function calculateDistance(response,status){ 

    if(response) { 
    var distancefield = distancefield; 
    if (status == google.maps.DistanceMatrixStatus.OK) { 
     var origins = response.originAddresses; 
     var place = places[placesIndex]; // use this in your calculations 
     var destinations = response.destinationAddresses; 
     var results = response.rows[0].elements; 

     for (var r = 0; r < results.length; r++) { 
     var element = results[r]; 
     var distancetext = element.distance.text; 
     var durationtext = element.duration.text; 
     var to = destinations[r]; 
     }//end for r 
    }//end if status=ok 
    } 

    if(placesIndex < places.length) { 
    var goto = new google.maps.LatLng(places[placesIndex].lat, places[placesIndex].lng); 

    service.getDistanceMatrix(
     { 
     origins: [foundlatlng], 
     destinations: [goto], 
     travelMode: google.maps.TravelMode.WALKING, 
     unitSystem: google.maps.UnitSystem.IMPERIAL, 
     avoidHighways: false, 
     avoidTolls: false, 
     }, calculateDistance);//end service.getdistancematrix() 

    placesIndex ++; 
    } 
} 
+0

嗯。謝謝你的迴應。我會試着要求他們全部作爲一個單一的迴應,但這種方法也可以在這種情況下工作。 –

+0

我將Geocodezip的建議與您的解析技術相結合,它工作。非常感謝您提供關於如何遍歷索引的建議! –

0

感謝您既爲您的建議!這裏是代碼:

 var service = new google.maps.DistanceMatrixService();//request distance matrix from the Googleplex 
    var outputdiv = document.getElementById('info'); 
    var destArray = [<?php 
    $result = mysqli_query($mysqli, "SELECT * FROM places"); 
     foreach($result as $key => $value){echo "'" . $value['address'] . "',"; };?>]; 

      service.getDistanceMatrix(
       { 
       origins: [foundlatlng], 
       destinations: destArray, 
       travelMode: google.maps.TravelMode.WALKING, 
       unitSystem: google.maps.UnitSystem.IMPERIAL, 
       avoidHighways: false, 
       avoidTolls: false, 
       }, callback);//end service.getdistancematrix() 

       function callback(response, status) { 
        if (status == google.maps.DistanceMatrixStatus.OK) { 
        var origins = response.originAddresses; 
        var destinations = response.destinationAddresses; 
        console.log(response); 
        for (var i = 0; i < origins.length; i++) { 
         var results = response.rows[i].elements; 
         for (var j = 0; j < results.length; j++) { 
         var element = results[j]; 
         var distance = element.distance.text; 
         var duration = element.duration.text; 
         var from = origins[i]; 
         var to = destinations[j]; 
         generateArray(to, destinations, distance, duration); 
         }//end for j 
        }//end for i 
        }//end if 
       }//end callback 

       **var theindex = 1; 
       function generateArray(origin, destin, dis, dur){ 
        places[theindex].distance = dis; 
        places[theindex].duration = dur; 
        theindex++; 


      }//end generateTable** 
      console.log(places);