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

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。