0

我试图简单地获取一组位置与用户的距离。这些位置是在代码前面的数据库中调用的。“places”数组中有 3 个条目,每个条目都包含一些信息和一个“距离”和“持续时间”字段,它们都设置为 0 作为占位符。我正在尝试遍历 DistanceMatrix "distance.text" 和 "duration.text" 结果并将它们添加到相应对象的 "distance" 和 "duration" 字段中,但我要么不能在回调中使用 places[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);

foundlatlng是 GPS 找到的坐标,表示为 google.maps.LatLng。它来自代码的前面部分。

4

3 回答 3

0

距离矩阵调用是异步的,您需要更新数组并使用回调函数中的返回值。

(console.log(places) 将始终在日期返回之前运行)

我在您的问题中没有看到任何代码将返回的数据添加到您的“places”数组中,这应该在回调例程中,您现在所做的只是在本地范围内创建变量,这些变量一旦不可用回调函数退出。

看起来您也没有利用DistanceMatrix服务获取多个起点和终点并在一次调用中返回它们之间的行驶距离的能力。您发布的代码使用它的方式效率低下,一次只返回一个结果(如果您要这样做,您不妨使用DirectionsService)。

组成数据的工作示例

于 2013-01-02T18:09:10.060 回答
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 ++;
  } 
}
于 2013-01-02T18:26:11.540 回答
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);
于 2013-01-02T19:59:54.197 回答