向量來源的 url
選項是加載向量數據的首選,但當需要特殊的後處理或加載策略時,它就無法工作。
https://openlayers.org/en/latest/apidoc/module-ol_source_Vector-VectorSource.html
加載策略#
首先,我們應該了解 openlayers 中的加載策略。openlayers 中有 3 種標準加載策略。
all
: 在一次請求中加載所有特徵。bbox
: 根據當前視圖的範圍和解析度加載特徵。tile
: 基於瓷磚網格加載特徵,與all
或bbox
的區別在於,它以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
。
現在很清楚,前幾次的範圍包含以下內容,因此當我們不斷增加縮放級別時,向量來源不會調用其加載器,除非範圍超過已加載範圍。