2015-12-16 113 views
4

我正在使用OpenLayers 3實現地圖導出功能。OpenLayers:如何檢測地圖視圖是否完全加載?

但有一個問題:無法確定地圖視圖是完全加載還是幾個圖塊缺失。

似乎沒有這樣的API或事件。緊密的一個是tileloadstart - tileloadend對。但OpenLayers異步加載tile,並且在tile實際加載之前tileloadstart不會被觸發 - 也就是說,在tile tile隊列中排隊的tile在實際加載之前不會觸發事件。

熱我可以檢測地圖視圖是完全加載?

回答

2

我最終成功實現了導出功能。以下是粗略的解釋。

  1. 註冊tileloadstarttileloadend,使用ol.source.on()ol.source小號tileloaderror事件處理程序,並開始管理瓦負載計數。
  2. 註冊postcompose事件處理程序在ol.Map使用ol.Map.once()
  3. 請致電ol.Map.renderSync()。這會觸發圖塊加載,所以從現在開始如果沒有圖塊加載,這將意味着所有圖塊都已加載。
  4. postcompose事件處理程序中,使用event.context.canvas.toDataURL()event.context捕獲地圖內容,並使用event.frameState.postRenderFunctions.push()(有點hacky)註冊postrender函數。
  5. 在已註冊的postrender函數上,檢查tile加載計數(可由tileload*事件處理程序管理)。如果計數不爲零,則放棄捕獲的內容。否則,捕獲完成。
  6. tileloadendtileloaderror上,如果瓦片負載計數變爲零,則從上述步驟3重試。
+0

您應該添加一個代碼示例。 – Geuis

1

基本上要確保在地圖上呈現的所有內容都需要監聽地圖上每個圖層的加載事件。對於wms和wfs圖層來說,這很清楚,我想你知道該怎麼做。 對於瓷磚層,檢查這個例子here

+1

tileload *事件不適用於此問題。由於瓦片隊列管理器異步加載瓦片隊列,如果沒有加載瓦片,事件不一定意味着所有瓦片都加載。 – zeodtr

1

postrender事件似乎這樣的伎倆,這樣的:從3.8.2的OpenLayers至少

map.once('postrender', function(event) { 
    doyourmagic(); 
}); 

作品。有關該主題的正確答案there