2012-06-24 148 views
8

我想設置OpenLayers在縮放開始前不顯示矢量圖層,並在縮放結束後重新顯示。我有變焦結束已經建立這樣的部分:使用Javascript OpenLayers縮放事件監聽器

map = new OpenLayers.Map('map_element', { eventListeners: { "zoomend": mapEvent}}); 

function mapEvent(event) { 
    if(event.type == "zoomend") { 
     hide_vector_layer(); 
     } 
} 

但我看不出有什麼樣的事件偵聽器的說明文檔中的一個放大的開始。有一個「movestart」涵蓋移動,平移和縮放。不幸的是,我不能使用「movestart」,因爲我不希望圖層在平底鍋中消失。你會認爲會有一個「zoomstart」,因爲有一個「zoomend」。

我嘗試這樣做的原因是因爲我不喜歡使用Google地圖作爲基礎層時矢量圖以不同的速率放大。它看起來是錯誤的,看起來像所有的功能都不準確,即使它們在變焦完成後降落在正確的位置。

有什麼建議嗎?

回答

2

爲此,您應該重寫OpenLayers.Map的moveTo和moveByPx方法,以消除除縮放以外的任何操作的movestart事件觸發。

+0

謝謝,這是有效的。 – renosis

2

我有同樣的問題,OP有,並試圖用drnextgis的解決方案解決它。但不幸的是,它並沒有完全工作:: OpenLayers.Map.move中的zoomChanged屬性不僅在縮放級別發生變化時,而且在地圖已調整大小時,它的求值爲true

我的地圖是用戶瀏覽器窗口的100%,所以如果他們調整窗口大小,事件將被觸發。這對我來說是不理想的,因爲如果縮放級別實際發生了變化,我只想觸發事件。我的解決方案是創建一個名爲「zoomstart」的新事件,我將其插入到OpenLayers.Map.moveTo的頂部。下面的代碼:

var getZoom = this.getZoom(); 
if (!!getZoom && !!zoom && this.isValidZoomLevel(zoom) && getZoom != zoom) 
    this.events.triggerEvent("zoomstart", zoom); 

此代碼將通過新的縮放等級註冊到zoomstart事件偵聽器,並在我的情況下,我確定地圖的restrictedExtent並做基於新的縮放級別其他的東西。

和平與你同在。

8

以下是向OpenLayers添加'BeforeZoom'事件的簡單方法。只需將以下代碼添加到您創建地圖對象的位置即可。

map.zoomToProxy = map.zoomTo; 
map.zoomTo = function (zoom,xy){ 
    //Your Before Zoom Actions 

    //If you want zoom to go through call 
    map.zoomToProxy(zoom,xy); 
    //else do nothing and map wont zoom 
}; 

這是如何工作的:

任何一種縮放活動的,API的OpenLayers最終調用稱爲zoomTo功能。因此,在覆蓋它之前,我們將該函數複製到一個名爲「zoomToProxy」的新函數中。我們覆蓋它並添加我們的條件縮放邏輯。如果我們希望縮放發生,我們只需調用新的代理功能:)

+0

這種方法可行,但爲了更安全起見,您應該將函數內部的行替換爲map.zoomToProxy。適用(this,arguments);所以如果他們向zoomTo添加新參數,它們也會傳遞。 – Hoffmann

+0

啊我也忘了提到OpenLayers API在實際執行縮放之前調用zoomTo,所以你可以在第一個評論之前使用代碼來做事情,就好像它是一個'zoomstart'事件。例如,您可以防止發生縮放。 – Hoffmann

+0

這兩個都對。謝謝! – Shaunak

0

「Shaunak」的解決方案對我來說效果很好。 我想限制縮放低於11,編輯他的代碼爲

if (zoom > 11) { 
    map.zoomToProxy(zoom, xy); 
} 
+2

這應該作爲*評論發佈在Shaunak的答案上,而不是作爲一個單獨的答案。 – colllin

1

「movestart」處理「zoomstart」。要檢測是否zoomstart,請嘗試:

map.events.register("movestart",map, function(e) { 
     if(e.zoomChanged) 
     { 
     //zoom start code here 
     } 

    });