0

一連の場所があるユーザーからの距離を単純に取得しようとしています。場所は、コードの前半のデータベースから呼び出されます。「places」配列には3つのエントリがあり、各エントリにはいくつかの情報と、プレースホルダーとして両方とも0に設定されている「distance」および「duration」フィールドが含まれています。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);

foundlatlngGPSによって検出された座標であり、google.maps.LatLngとして表されます。これは、コードの前半のものです。

4

3 に答える 3

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

距離行列の呼び出しは非同期です。配列を更新し、返された値をコールバック関数内で使用する必要があります。

(console.log(places) は、日付が戻る前に常に実行されます)

返されたデータを「places」配列に追加するコードが質問に表示されません。これは、コールバック ルーチンにある必要があります。現在行っているのは、ローカル スコープに変数を作成することだけです。これは一度も使用できません。コールバック関数が終了します。

また、複数の出発地と目的地を取り、それらの間の運転距離を 1 回の呼び出しで返すというDistanceMatrixサービスの機能を利用していないようです。投稿されたコードがそれを使用する方法は非効率的で、一度に 1 つの結果しか返しません (そうする場合は、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 に答える