向量源的 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
将不会被触发。
现在很清楚,最初的几次范围包含以下内容,因此当我们不断增加缩放级别时,向量源不会调用其加载器,除非范围超过加载范围。