0

ローカリゼーション (「通り、都市、郵便番号、州、国」) の配列があります。このように、ローカリゼーションごとにすべての緯度と経度の値を含む文字列が必要です (「#lat.value|lng.value#lat2.value|lng2.value ..」など)。この Google API Geocoder に使用します。しかし、Geocoder には 10 ~ 11 回のローカリゼーションという面倒な制限があります。100 個のローカリゼーションに対して約 100 個の緯度経度値を取得するにはどうすればよいですか? sleep() 関数を試しましたが、うまくいきません。これはjsの私の関数です。

                function sleep(time){
                   time = time * 1000;
                   var start = (new Date()).getTime();
                   while(true){
                      alarm = (new Date()).getTime();
                      if(alarm - start > time){ break; }
                   }
                }

(..)
                var mystring = "";
                var address = <%=testing %>
                var arrayaddress = address.split("%");

                for (var i = 0; i < arrayaddress.length-1; i++) {
                    sleep(0);
                    geocoder = new google.maps.Geocoder(); 
                    geocoder.geocode( { 'address': arrayaddress[i]}, function(results, status) {
                    if (status == google.maps.GeocoderStatus.OK) {
                        map.setCenter(results[0].geometry.location);
                        var marker = new google.maps.Marker({
                        map: map,
                        position: results[0].geometry.location
                        });
                        var zmiennalat = marker.getPosition().lat();
                        var zmiennalng = marker.getPosition().lng();
                        mystring = mystring + "#" + zmiennalat + "|" + zmiennalng;
                    } 
                    else 
                    {
                        mystring = mystring + "#" + "er" + "|" + "er";
                        //alert("Geocode was not successful for the following reason: " + status);
                    }
                    if (i == arrayaddress.length-1) {
                       var dsa = mystring;
                       document.getElementById("<%=hfWysokosc.ClientID%>").value = mystring;
                       document.getElementById("<%=hfSzerokosc.ClientID%>").value = dsa;
                       document.getElementById("<%=UpdateButton1.ClientID %>").click();
                    }

                    }); 
                 } // for

次に、結果はたとえば次のとおりです。

er|er#34.42342|16.4323#23.32131|43.54545# など.

常に最初のローカリゼーションはデコード時にエラーになります (配列内の場所が 10 を超える場合)。なんで?最後にローカライズしないのはなぜですか?

再開: このループを使用して、この攪拌で 10 を超える lat|lng 値を取得するにはどうすればよいですか?

ありがとう!

編集

ありがとう、うまくいきました!

しかし、別の問題があります。string Mystring の表示が非常に遅い.. どうすれば修復できますか? マーカーがマップ上に設定されているときに更新されます-おそらく問題ではありませんが、100〜150個のマーカーの場合、Mystring値を取得するのに数分待たなければなりません.より高速なMystring値を表示する可能性はありますか?

                        var mystring = "";
                    var address = <%=testing %>
                    alert(address);
                    var arrayaddress = address.split("%");

                    (function nextStep(i){
                    if( i >= arrayaddress.length-1 ){
                        return;
                    }
                    geocoder = new google.maps.Geocoder(); 
                    geocoder.geocode( { 'address': arrayaddress[i]}, function(results, status) {
                    if (status == google.maps.GeocoderStatus.OK) {
                        map.setCenter(results[0].geometry.location);
                        var marker = new google.maps.Marker({
                        map: map,
                        position: results[0].geometry.location
                        });
                        var zmiennalat = marker.getPosition().lat();
                        var zmiennalng = marker.getPosition().lng();
                        mystring = mystring + zmiennalat + "|" + zmiennalng + "#";
                    } 
                    else 
                    {
                        mystring = mystring + "er" + "|" + "er" + "#";
                        //alert("Geocode was not successful for the following reason: " + status);
                    }
                    }); 
                    setTimeout(function(){   nextStep(i+1);   }, 800); 
                       var dsa = mystring;
                       document.getElementById("<%=hfSzerokosc.ClientID%>").value = dsa;
                       document.getElementById("<%=UpdateButton1.ClientID %>").click();    
                })(0);

アップデート

                    function nextStep(i){
                    if( i >= arrayaddress.length-1 ){
                        return;
                    }
                    
                    // code
                    
                    }); 
                    setTimeout(function(){   nextStep(i+1);   }, 1000);     
                };

それから

<button type="button" onclick="nextStep(0)">Click Me!</button>

エラーは次のとおりです。

nextStep が定義されていません

なにが問題ですか?

4

1 に答える 1

0

forループの代わりに、これを試してください:

//...............
//...............

var mystring = "";
var address = <%=testing %>
var arrayaddress = address.split("%");

//Modification-----BEGIN
(function nextStep(i){
    if( i >= arrayaddress.length-1 ){
        return;
    }

    //-----------------
    //for-loop body here
    //------------------

    //
    setTimeout(function(){   nextStep(i+1);   }, 500);       
})(0);
//Modification-----END

//...............
//...............

更新:nextStepボタンがクリックされたときにのみ関数を実行する場合は、上記のコードを次のように変更します。

function nextStep(i){
    /////   
};

次に、いつonclickトリガーされるかを呼び出すだけnextStep(0)です。

于 2012-07-07T13:52:11.220 に答える