2010-06-07 145 views
56

我在地圖上繪製了一系列標記(使用地圖API的v3)。谷歌地圖v3:實施分鐘。使用fitBounds時的縮放級別

在v2中,我有以下代碼:

bounds = new GLatLngBounds(); 

    ... loop thru and put markers on map ... 
    bounds.extend(point); 
    ... end looping 

    map.setCenter(bounds.getCenter()); 
    var level = map.getBoundsZoomLevel(bounds); 
    if (level == 1) 
    level = 5; 
    map.setZoom(level > 6 ? 6 : level); 

這做工精細,以確保總有在地圖上顯示的細節的適當的水平。

我試圖複製在V3此功能,但setZoom和fitBounds似乎並沒有被合作:

... loop thru and put markers on the map 
    var ll = new google.maps.LatLng(p.lat,p.lng); 
    bounds.extend(ll); 
... end loop 

var zoom = map.getZoom(); 
map.setZoom(zoom > 6 ? 6 : zoom); 
map.fitBounds(bounds); 

我已經嘗試了不同的置換(該setZoom之前移動fitBounds,爲例如),但是我用setZoom做的事情似乎並沒有影響地圖。我錯過了什麼嗎?有沒有辦法做到這一點?

回答

105

我正好在看同樣的事情:)

在上Google Groups這個討論中我發現,基本上當你做一個fitBounds,縮放,所以你需要捕獲變焦和邊界的變化事件發生異步。最後一篇文章中的代碼對我進行了小小的修改......因爲它阻止了你完全縮放超過15個,所以使用第四篇文章中的想法來設置標誌只在第一次做。

// Do other stuff to set up map 
var map = new google.maps.Map(mapElement, myOptions); 
// This is needed to set the zoom after fitbounds, 
google.maps.event.addListener(map, 'zoom_changed', function() { 
    zoomChangeBoundsListener = 
     google.maps.event.addListener(map, 'bounds_changed', function(event) { 
      if (this.getZoom() > 15 && this.initialZoom == true) { 
       // Change max/min zoom here 
       this.setZoom(15); 
       this.initialZoom = false; 
      } 
     google.maps.event.removeListener(zoomChangeBoundsListener); 
    }); 
}); 
map.initialZoom = true; 
map.fitBounds(bounds); 

希望幫助,

安東尼。

+0

謝謝!我一直在爲此奮鬥了幾個小時! 雖然它看起來像一個錯誤。 – chris 2010-06-07 14:47:48

+3

這是一個好方法。另一種方法是檢查當前邊界並擴展邊界,即http://stackoverflow.com/questions/3334729/google-maps-v3-fitbounds-zoom-too-close-for-single-marker/5345708#5345708 。雖然這裏的鏈接答案只是將邊界擴大一個分數,但可以使用相同的方法將邊界擴大一個較大的數字;我發現在所有角落都加上7就能很好地工作。 – 2011-08-28 22:34:45

+0

這是一個很酷的解決方案。然而,我注意到,它在Chrome中可以正常工作,也就是說,在沒有使用map.initialZoom的情況下,firefox也可以正常工作。 – Andrew 2011-11-20 18:53:17

43

沒有嘗試它,我會說你應該能夠做到這一點單單是fitBounds()你縮放級別之前,即

map.fitBounds(bounds); 
var zoom = map.getZoom(); 
map.setZoom(zoom > 6 ? 6 : zoom); 

如果你做了嘗試,並沒有奏效,你可以設置你與minZoom地圖在MapOptions(api-reference)這樣的:

var map = new google.maps.Map(document.getElementById("map"), { minZoom: 6 }); 

使用fitBounds()時,這將保持在地圖縮放從任何更遠。

+0

不錯的簡潔優雅的解決方案! – Falantar014 2013-03-13 19:48:46

+0

對Flygenring的簡短感謝 – 2013-07-26 07:42:16

+2

設置minZoom和maxZoom值限制了用戶的縮放超出了這些值,所以如果您只想將初始縮放設置爲合理的東西(這是我認爲的OP在談論) – Izazael 2014-01-08 05:17:14

13

安東尼的解決方案非常好。我只需要修復變焦功能inital頁面加載(確保你不是太遠放大以開始),這爲我做的伎倆:

var zoomChangeBoundsListener = 
    google.maps.event.addListener(map, 'bounds_changed', function(event) { 
     google.maps.event.removeListener(zoomChangeBoundsListener); 
     map.setZoom(Math.min(15, map.getZoom())); 
    }); 


map.fitBounds(zoomBounds); 
+5

除了刪除監聽器,您可以使用'addListenerOnce',但我正在使用此解決方案。 – 2014-10-30 21:02:30

6

就我而言,我只是想將縮放級別設置爲小於Google地圖在fitBounds中爲我選擇的縮放級別。目的是使用fitBounds,但也確保在任何地圖工具下沒有標記等。

我的地圖是早期創建的,然後頁面的其他許多動態組件都有機會添加標記,之後調用fitBounds每增加一項。

這在最初創建地圖對象的初始塊...

var mapZoom = null; 

然後這個被添加到其中標記加入時,map.fitBounds被稱爲右之前的每個塊.. 。

google.maps.event.addListenerOnce(map, 'bounds_changed', function() { 
    if (mapZoom != map.getZoom()) { 
     mapZoom = (map.getZoom() - 1); 
     map.setZoom(mapZoom); 
    } 
}); 

當使用「的bounds_changed」不到位檢查,地圖爲每個標記縮小一次不管它是否需要與否。相反,當我使用'zoom_changed'時,我有時會在地圖工具下放置標記,因爲縮放並沒有真正改變。現在它總是被觸發,但檢查確保它只在需要時才縮小一次。

希望這會有所幫助。

+0

這似乎是唯一應該實際使用'addListener'而不是在每個map.fitBounds()之前重複(並依賴記憶)到'addListenerOnce'的唯一答案。 – Flygenring 2017-01-25 09:01:10

9

當您在一個項目上調用map.fitBounds()時,地圖可能放得太近。爲了解決這個問題,只需添加「MAXZOOM」來的MapOptions ...

var mapOptions = { 
    maxZoom: 15 
}; 
2

由於谷歌地圖V3是事件驅動的,你可以告訴API變焦設置回適量當部分zoom_changed事件觸發器:

var initial = true 
google.maps.event.addListener(map, "zoom_changed", function() { 
    if (initial == true){ 
     if (map.getZoom() > 11) { 
     map.setZoom(11); 
     initial = false; 
     } 
    } 
}); 

我以前初始使當最終fitBounds是permorfed沒有放大太多的地圖,但就像他/她想要讓用戶變焦。如果沒有這種情況,用戶可能會有超過11的任何縮放事件。

11

您也可以打電話只是fitBounds之前設置選項MAXZOOM(),然後再切值:

if(!bounds.isEmpty()) { 
    var originalMaxZoom = map.maxZoom; 
    map.setOptions({maxZoom: 18}); 
    map.fitBounds(bounds); 
    map.setOptions({maxZoom: originalMaxZoom}); 
} 
相關問題