banner
陈不易

陈不易

没有技术想聊生活
twitter
medium
tg_channel

使用 openlayers 向量來源加載器

向量來源的 url 選項是加載向量數據的首選,但當需要特殊的後處理或加載策略時,它就無法工作。

https://openlayers.org/en/latest/apidoc/module-ol_source_Vector-VectorSource.html

加載策略#

首先,我們應該了解 openlayers 中的加載策略。openlayers 中有 3 種標準加載策略。

  • all: 在一次請求中加載所有特徵。
  • bbox: 根據當前視圖的範圍和解析度加載特徵。
  • tile: 基於瓷磚網格加載特徵,與 allbbox 的區別在於,它以 TileGrid 作為參數。
    顯然,bbox 是最適合加載器的選擇,因為當我們接受 all 策略時,url 選項似乎是可以的。

誤解#

假設有這樣一個特徵,我們的數據根據縮放級別,當縮放改變時,我們必須再次請求當前縮放級別的數據。

...
loader:function(extent,resolution,projection){
	console.log("在解析度中加載數據",resolution);
	getData(resoluton).then(response=>{
		let features = source.getFormat().readFeatures(response);
		source.clear();
		source.addFeatures(features);
	})
}
...

在示例代碼中,我們期望當視圖的縮放改變時觸發加載器,清除先前的特徵並在新縮放下加載新特徵。但當滾動滑鼠滾輪時,情況並非如此。
日誌消息顯示 loader 只在前幾次觸發,當我們不斷增加縮放級別(解析度)時,loader 不再被觸發。
但為什麼?
範圍是 loader 的主要控制器,當調用 loader(extent...) 時,範圍將添加到來源的已加載範圍中 (代碼 在 Vector.js 中),因此,如果解析度改變但新範圍在已加載範圍內,則不會觸發 loader
現在很清楚,前幾次的範圍包含以下內容,因此當我們不斷增加縮放級別時,向量來源不會調用其加載器,除非範圍超過已加載範圍。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。