1

こんにちは私はグーグルマップjavascriptapiv3を使用しています

これがポリラインを描くための私のコードです。

for(var i=0; i < addressArr.length; i++){
     geocoder.geocode( { 'address': addressArr[i]}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {

        point = results[0].geometry.location;
        place.push(results[0].address_components[1].long_name);

        flightPlanCoordinates.push(point);
        if(flightPlanCoordinates.length == addressArr.length){
        flightPath = new google.maps.Polyline({path: flightPlanCoordinates,strokeColor: "#FF0000",strokeOpacity: 0.50,strokeWeight: 2 });
        flightPath.setMap(map);
        }

addressArrはアドレスの配列です

問題は私のflightPlanCoordinatesにあり、forループからaddressArrを渡す順序ではありません。
addressArr = [1,2,3,4]を渡したとすると、私のflightPlanCoordinatesは[2,3,1,4]になります。何が起こっているのかを示唆することはできますか?

4

2 に答える 2

1

これは、ループ内で非同期呼び出し(geocoder.geocode)を実行するためです。これは、実行に異なる時間がかかります。したがって、配列内の2番目の要素をジオコーディングするのに1秒かかり、最初の要素をジオコーディングするのに3秒かかることをお勧めします。次に、明らかに2番目の要素のコールバック関数が最初の要素の前に呼び出され、最初の位置のflightPlanCoordinatesにプッシュされます。

この問題を解決するには、コード内の2番目のifステートメント内の配列でsort()メソッドを呼び出すだけです。

アップデート:

var i = 0;
function geocode(){
    geocoder.geocode({
        'address': addressArr[i]
    },
    function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            point = results[0].geometry.location;
            place.push(results[0].address_components[1].long_name);
            flightPlanCoordinates.push(point);
            i++;
            if(addressArr[i] != null)
                geocode();

            if (flightPlanCoordinates.length == addressArr.length) {
                flightPath = new google.maps.Polyline({
                    path: flightPlanCoordinates,
                    strokeColor: "#FF0000",
                    strokeOpacity: 0.50,
                    strokeWeight: 2
                });
                flightPath.setMap(map);
            }
        }
    }
}
geocode();
于 2011-08-11T15:19:35.130 に答える
0

なぜそのような値が返されるのかはわかりませんが、配列を並べ替えるだけで問題は解決します。FlightPlanCoordinates.sort();

于 2011-08-11T13:33:45.650 に答える