2012-09-28 2 views
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(); 
     } 

답변

1

콜백 메소드를 제공해야합니다. 사용자가 제공하는 방법은 두 개의 매개 변수와 함께 호출됩니다

개체를, 당신은 당신이 필요로하는 데이터가 지오 코더에서 반환 처리 할 수 ​​있습니다. here

참조 지오 코더 문서는 더 세부 정보, 지오 방법은 구글 서비스에 아약스 전화를 할 것입니다. 비동기식입니다. 지오 코드 메소드가 호출되면 함수의 나머지 부분은 계속 실행됩니다. 서비스가 응답하면 콜백이 호출되고 결과와 상태가 매개 변수로 전달됩니다. 결과를 저장하려면 외부에서 액세스 할 수있는 모든 컨테이너에 결과를 간단히 추가 할 수 있습니다.

+0

작은 코드 예제를 제공해 주시겠습니까? 나는 당신이 이론에서 말하는 것을 이해하지만 나는 여전히 js에 익숙하지 않고 콜백을 파악하려고 노력 중이다. – FunkyMonk91

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(); 
     }