0

私はExcelから緯度と経度のリストを繰り返し処理しています。これは問題なく機能します。ループ内で呼び出したときに、codeLatLng関数が番地を返すようにします。

コメントされたコードは、codeLatLng()内で実行しようとしていたものです。私は毎秒グーグルに10回の呼び出ししかできないことを知っています、これを行うためにループをどのように設定しますか?

ありがとう!

        function codeLatLng(input) {
            var latlngStr = input.split(",", 2);
            var lat = parseFloat(latlngStr[0]);
            var lng = parseFloat(latlngStr[1]);
            var latlng = new google.maps.LatLng(lat, lng);
            geocoder.geocode({
                'latLng' : latlng
            }, function(results, status) {
                document.getElementById("test").innerHTML = results[0].formatted_address + "<br />";
                //return results[0].formatted_address;
            });
        }

        function initialize() {
            geocoder = new google.maps.Geocoder();              
        }   

        function showmethemoney(){  
            var lat, lng, latlng, loc;
            var Excel = new ActiveXObject("Excel.Application"); 
            Excel.Visible = false;
            Excel.Workbooks.Open($("#file").val()); 
            Excel.Active
            //Excel.ActiveSheet.UsedRange.Rows.Count
            $("#test").append("<b> " + Excel.ActiveSheet.UsedRange.Rows.Count + " rows in file</b><br/>");
            //10 for testing purposes. I will be going through the entire document
            for (var i=1; i <= 10; i++) {                   
                lat = Excel.ActiveSheet.Cells(i,17).Value;
                lng = Excel.ActiveSheet.Cells(i,18).Value;
                latlng = lat + "," + lng;
                //loc = codeLatLng(latlng);         
                $("#test").append(i + ") " + latlng + " " + loc + "<br/>");                                     
            };  
            Excel.Quit();
        }
4

2 に答える 2

1

コールバックメソッドを提供する必要があります。指定したメソッドは、次の2つのパラメーターで呼び出されます。

コールバック内では、必要に応じてジオコーダーから返されたデータを処理できます。

こちらのジオコーダーのドキュメントを参照してください

詳細については、ジオコードメソッドはGoogleサービスへのajax呼び出しを行います。これは非同期です。geocodeメソッドが呼び出されると、残りの関数は引き続き実行されます。サービスが応答すると、コールバックが呼び出され、結果とステータスがパラメータで渡されます。結果を保存したい場合は、外部で使用できるようにアクセスできる任意のコンテナに結果を追加するだけです。

于 2012-09-28T20:09:54.907 に答える
1

成功時に呼び出されるcodeLatLngへのコールバックを提供します。変更されたコード。
コードにループを追加しました。setTimeoutを使用して10個のアイテムの束をループします。

  function codeLatLng(input, i, cb) {
                var latlngStr = input.split(",", 2);
                var lat = parseFloat(latlngStr[0]);
                var lng = parseFloat(latlngStr[1]);
                var latlng = new google.maps.LatLng(lat, lng);
                geocoder.geocode({
                    'latLng' : latlng
                }, function(results, status) {
                    document.getElementById("test").innerHTML = results[0].formatted_address + "<br />";
                   cb( results[0].formatted_address, i, input);
                });
            }
    function showmethemoney(){  
 //your code 
           var i = 1;
           function repeat10(i, max){
                for ( ; i <= max; i++) {                   
                     lat = Excel.ActiveSheet.Cells(i,17).Value;
                    lng = Excel.ActiveSheet.Cells(i,18).Value;
                     latlng = lat + "," + lng;
                    codeLatLng(latlng, i, function (loc, i, latlng ){
                          $("#test").append(i + ") " + latlng + " " + loc + "<br/>");   
                     });         

               } 
             setTimeout(function(){
                  if(i >= maxexcelsize){ return };
                   repeat10(i, i+10);
              }, 100);
            } 
            repeat10(i, i+10);
            Excel.Quit();
        }
于 2012-09-28T20:14:28.603 に答える