2012-03-20 49 views
3

。 我有50個來自sql的地址。每個地址將在div LocationAddress內呈現。我循環瀏覽每個地圖,並在地圖上繪製標記。但它只顯示11個。我知道這是因爲地理編碼器成爲瓶頸。我如何使用setinterval或settimeout來控制它?我研究,並且看到了setTimeout的處理this..please有人指導我的人......setinterval或settimeout谷歌地圖v3

var geocoder; 
     var map; 
     function initialize() { 
     geocoder = new google.maps.Geocoder(); 
     var latlng = new google.maps.LatLng(42.095287, -79.3185139); 
     var myOptions = { 
      maxZoom: 14, 
      zoom: 9, 
      center: latlng, 
      mapTypeId: google.maps.MapTypeId.ROADMAP, 
     }; 
     map = new google.maps.Map(document.getElementById("map_canvas"), 
      myOptions); 

     } 

    function codeAddress() { 
     var infowindow = new google.maps.InfoWindow({}); 

     $('.LocationAddress').each(function() { 

      var addy = $(this).text(); 
      geocoder.geocode({ 'address': addy}, function(results, status) { 
       if (status == google.maps.GeocoderStatus.OK) { 
         map.setCenter(results[0].geometry.location); 
         var marker = new google.maps.Marker({ 
         position: results[0].geometry.location, 
         map: map,    
         title:addy, 
        }); 

       //Adding a click event to the marker 
       google.maps.event.addListener(marker, 'click', function() { 
        infowindow.setContent('<div id=\"infowindow\" style=" height:100px;>' 
              +'<div id=\"LeftInfo\">'+ "Hello World!" 
              +'</div>'+'</div>'); 
        infowindow.open(map, this); 
       }); 
      } 

      });//Geocoder END 

     }); 
    } 

回答

1

我實際上它編碼和測試,這一工作:

var geocoder; 
var map; 
var addresses = new Array(); 
var infowindow; 
var theInterval; 

function initialize() { 
    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(42.095287, -79.3185139); 
    var myOptions = { 
     maxZoom: 14, 
     zoom: 9, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP, 
    }; 
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
    infowindow = new google.maps.InfoWindow({}); 
} 

$(document).ready(function() { 
    getAddresses(); 
    theInterval = setInterval("codeAddress()", 1000); 
}); 

function getAddresses() { 
    $('.LocationAddress').each(function() { 
     addresses.push($(this).text()); 
    }); 
} 

function codeAddress() { 
    if (addresses.length == 0) { 
     clearInterval(theInterval); 
    } 
    var addy = addresses.pop(); 
    geocoder.geocode({ 
     'address': addy 
    }, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      map.setCenter(results[0].geometry.location); 
      var marker = new google.maps.Marker({ 
       position: results[0].geometry.location, 
       map: map, 
       title: addy, 
      }); 

      //Adding a click event to the marker 
      google.maps.event.addListener(marker, 'click', function() { 
       infowindow.setContent('<div id=\"infowindow\" style=" height:100px;>' + '<div id=\"LeftInfo\">' + "Hello World!" + '</div>' + '</div>'); 
       infowindow.open(map, this); 
      }); 
     } 

    }); //Geocoder END 
} 
+0

我在哪裏使用setInterval函數?在CodeAddress()裏面?或codeAddress(){}之後 – 2012-03-21 00:43:48

+0

你在外面做。無論如何,我只是編輯它的部分addresses.length == 0來清除我們所做的時間間隔。 – Mikko 2012-03-21 00:47:08

+0

其中getAddress()被調用?某事破壞了,所以我的地圖根本沒有顯示...當你說'在頂部聲明一個包含我們地址和infowindow的變量:'你的意思是讓這些全局變量?所以它們可用於任何功能? – 2012-03-21 00:59:27

0

你可以序列化的請求,以便你一次處理一個地址。當那個完成時,你處理下一個。這可以這樣做:

function codeAddress() { 
    var infowindow = new google.maps.InfoWindow({}); 

    var addresses = $('.LocationAddress'); 
    var addressIndex = 0; 

    function next() { 
     if (addressIndex < addresses.length) { 
      var addy = addresses.eq(addressIndex).text(); 
      ++addressIndex; 
      geocoder.geocode({ 'address': addy}, function(results, status) { 
       if (status == google.maps.GeocoderStatus.OK) { 
         map.setCenter(results[0].geometry.location); 
         var marker = new google.maps.Marker({ 
         position: results[0].geometry.location, 
         map: map,    
         title:addy, 
        }); 

       //Adding a click event to the marker 
       google.maps.event.addListener(marker, 'click', function() { 
        infowindow.setContent('<div id=\"infowindow\" style=" height:100px;>' 
              +'<div id=\"LeftInfo\">'+ "Hello World!" 
              +'</div>'+'</div>'); 
        infowindow.open(map, this); 
       }); 
       next(); 
      } 

      });//Geocoder END 
     } 
    } 
    next(); 
} 
+0

這仍然只給了我11個標記? – 2012-03-21 00:57:01

+0

@AnjanaSharma - 那麼,肯定會在某個地方出現錯誤。您需要查看錯誤控制檯並在狀態代碼上執行'console.log(status)'以查明確切地處理了哪些地址以及爲什麼。這聽起來像是一些元素調試的時間。 – jfriend00 2012-03-21 00:59:22