2016-03-03 107 views
0

我知道有一個bounds_changed事件,如果邊界已經改變,則觸發,但是我需要知道fitBounds何時完成(當邊界已更改或邊界保持不變)。谷歌地圖fitBounds回調

谷歌有某種寬容,如果邊界變化很小,它實際上不會改變邊界/調用bounds_changed。我需要知道這是什麼時候發生的。

我已經用超時功能成功完成了這項工作,但它似乎很難做,而且在bounds_changed需要超過100ms觸發時可能會出現一些錯誤。

見例如:http://jsbin.com/hipavurilo/3/edit?js,console,output

沒有更好的辦法?

編輯:如果您認爲只是檢查map.getBounds()是否與您發送的fitBounds()相同,那麼您會很失望知道擬合界限的結果通常並不接近你發送的界限。我寫了這個功能想這可能是可能

function boundsAreIdentical(bounds1, bounds2) { 
     if (!bounds1 || !bounds2) return false; 

     var tolerance = 0.00001; 
     console.log(bounds1.getNorthEast().lat(), bounds2.getNorthEast().lat()); 
     console.log(bounds1.getNorthEast().lng(), bounds2.getNorthEast().lng()); 
     console.log(bounds1.getSouthWest().lat(), bounds2.getSouthWest().lat()); 
     console.log(bounds1.getSouthWest().lng(), bounds2.getSouthWest().lng()); 
     if (
      (Math.abs(bounds1.getNorthEast().lat() - bounds2.getNorthEast().lat()) <= tolerance) && 
      (Math.abs(bounds1.getNorthEast().lng() - bounds2.getNorthEast().lng()) <= tolerance) && 
      (Math.abs(bounds1.getSouthWest().lat() - bounds2.getSouthWest().lat()) <= tolerance) && 
      (Math.abs(bounds1.getSouthWest().lng() - bounds2.getSouthWest().lng()) <= tolerance)) { 
      return true; 
     } 
     return false; 
    } 

回答

1

來解決這個問題(當界限完成更改知道)的第一部分,最簡單的方法是使用idle event listener

如何改變邊界,在即將改變它們之前設置此事件。這樣,當界限全部結算後,地圖將被註冊爲空閒狀態,空閒事件觸發,在這裏你可以做你的shiz。爲了防止事件相互堆疊,請同時清除它。你可能不得不隨意擺弄一下。說到擺弄,這裏是一個小提琴。在這撥弄我剛纔設置的警報發生的每一次:

https://jsbin.com/kapimov/edit?js,output單擊「更改邊界」,你會看到它在發生,在:)

編輯:要檢查是否fitBounds()當它失敗時觸發,比較發射前後的中心fitBounds()。

即使嘗試將邊界設置爲相同的座標兩次,中心似乎也會發生變化並可以進行比較。中心檢查似乎在地圖實際移動之前發生,但總是在調用該函數時發生變化。

點擊「Fit Current Bounds」按鈕兩次以查看它的行動;第一次'bounds_changed'被觸發,第二次它不但中心仍然正確檢查。註釋掉fitBounds()函數以查看沒有它的情況下中心如何更改。

+0

調用'fitBounds'不能修改地圖的邊界,這就是這個問題的關鍵所在 –

+0

嗯,我知道,當fitBounds()不能成功移動地圖時。我用一個確定的失敗案例更新了小提琴,將界限定爲當前界限。然後我用另一個屬性 - 中心 - 來檢查邊界是否總是改變它。事實證明它確實!編輯我的答案以反映新的解決方案。 – tempranova

+0

擬合電流界限按鈕無法正常工作,去海洋。當我使它工作時,它從不觸發bounds_changed。值得注意的是,getCenter會立即觸發,而不會在邊界可能發生變化之後觸發。也就是說,getCenter會在fitBounds之後0.1毫秒觸發,但邊界的更改通常在10毫秒內發生。爲了使中心技巧正常工作,您需要知道fitBounds何時完成(您需要回調),以回到原始問題。 – ParoX