2010-05-14 254 views
72

我從v2切換到v3谷歌地圖API,並得到gMap.getBounds()函數的問題。Google Maps Api v3 - getBounds is undefined

我需要在我的地圖的初始化後獲得邊界。

這裏是我的javascript代碼:


var gMap; 
$(document).ready(

    function() { 

     var latlng = new google.maps.LatLng(55.755327, 37.622166); 
     var myOptions = { 
      zoom: 12, 
      center: latlng, 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
     }; 
     gMap = new google.maps.Map(document.getElementById("GoogleMapControl"), myOptions); 

     alert(gMap.getBounds()); 
    } 
); 

所以現在它提醒我,gMap.getBounds()是不確定的。

我試圖在click事件中獲取getBounds值,它對我來說工作正常,但我無法在加載映射事件中獲得相同的結果。

當文檔在Google Maps API v2中加載時,getBounds也能正常工作,但在V3中失敗。

你能幫我解決這個問題嗎?

回答

118

在v3 API早期,getBounds()方法需要地圖圖塊完成加載才能返回正確的結果。但是現在看來,你可以聽bounds_changed事件,這是連tilesloaded事件之前觸發:

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
    <title>Google Maps v3 - getBounds is undefined</title> 
    <script src="http://maps.google.com/maps/api/js?sensor=false" 
      type="text/javascript"></script> 
</head> 
<body> 
    <div id="map" style="width: 500px; height: 350px;"></div> 

    <script type="text/javascript"> 
     var map = new google.maps.Map(document.getElementById("map"), { 
     zoom: 12, 
     center: new google.maps.LatLng(55.755327, 37.622166), 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
     }); 

     google.maps.event.addListener(map, 'bounds_changed', function() { 
     alert(map.getBounds()); 
     }); 
    </script> 
</body> 
</html> 
+1

這正是我需要的!謝謝=)。它解決了我的問題。 – DolceVita 2010-06-04 05:50:17

+0

謝謝....我希望我在一個小時前看過這裏! – kinet 2011-06-21 00:36:26

+0

這對我來說非常有用,我幾乎浪費了2小時這個 – arjuncc 2012-05-22 06:36:46

18

這應該是工作,至少根據對的getBounds()的文檔。儘管如此:

var gMap; 
$(document).ready(function() { 
    var latlng = new google.maps.LatLng(55.755327, 37.622166); 
    var myOptions = { 
     zoom: 12, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    gMap = new google.maps.Map(document.getElementById("GoogleMapControl"), myOptions); 
    google.maps.event.addListenerOnce(gMap, 'idle', function(){ 
     alert(this.getBounds()); 
    }); 
}); 

看到它工作here

+0

謝謝你這個鏈接,真的很好的測試系統 – DolceVita 2010-06-04 05:50:35

+0

這應該是被接受的答案。閒置被稱爲方式早於必須等待所有瓷磚被加載。 – treznik 2010-10-25 00:05:13

+0

@treznik:您是如何確定在'tilesloaded'事件之前發生'idle'事件的?對我來說,'tilesloaded'事件會在'idle'事件之前不斷激發。 – 2010-10-25 00:18:45

14

我在說薩爾曼的解決方案更好,因爲idle事件的調用時間早於tilesloaded,因爲它會等待所有的切片加載。但仔細看,似乎bounds_changed甚至更​​早被調用,它也更有意義,因爲你正在尋找邊界,對吧? :)

所以我的解決辦法是:

google.maps.event.addListenerOnce(gMap, 'bounds_changed', function(){ 
    alert(this.getBounds()); 
}); 
+1

當提出這個問題時,'bounds_changed'不會起作用,因爲'getBounds()'需要加載tile。 +1來暗示它。我會更新我的答案。 – 2010-10-25 00:22:14

9

在這裏的其他意見,它的勸使用了「閒置」了「的bounds_changed」事件,這點我同意。當然,在IE8下,至少會在我的開發機器上的「bounds_changed」之前觸發「空閒」,讓我在getBounds上引用null。

但是,當您拖動地圖時,「bounds_changed」事件將會持續觸發。因此,如果你想使用這個事件來開始加載標記,它將在你的web服務器上很重。

我多瀏覽器解決了這個問題:

google.maps.event.addListenerOnce(gmap, "bounds_changed", function(){ 
    loadMyMarkers(); 
    google.maps.event.addListener(gmap, "idle", loadMyMarkers); 
}); 
+1

這是我使用的方法,出於同樣的原因:-) – oodavid 2012-01-20 16:10:45

1

好了,我不知道如果我太晚了,但這裏的使用gmaps.js插件我的解決方案:

map = new GMaps({...}); 

// bounds loaded? if not try again after 0.5 sec 
var check_bounds = function(){ 

     var ok = true; 

     if (map.getBounds() === undefined) 
      ok = false; 

     if (! ok) 
      setTimeout(check_bounds, 500); 
     else { 
      //ok to query bounds here 
       var bounds = map.getBounds(); 
     } 
    } 

    //call it 
    check_bounds();