javascript - OpenLayers 6 具有大量点的高频率层更新
问题描述
我目前正在使用 OpenLayers 6 来显示由移动地图应用程序生成的地理数据。这包括每秒更新多达 10 次的“实时”GPS 位置。通过更新图层上的功能,我可以毫无问题地以这种速度运行我的应用程序。
第二个功能是让 GPS 在地图上留下“面包屑”。这些点每秒添加 10 次到特定层。在我遇到问题之前,我一直在使用WebGLPointsLayer
这些点来显示这些点,这些点将性能大幅提高到稳定的 25.000 点。使用以下代码添加点:
层初始化:
this.gpsBreadcrumbsLayer = new WebGLPointsLayer({
source: new Vector({}),
style: {
symbol: {
symbolType: 'circle',
size: 10,
color: 'rgba(0,0,255,1)'
}
}
});
根据接收到的 lonLat ([lon, lat]) 添加特征
const source = this.gpsBreadcrumbsLayer.getSource();
source.addFeature(new Feature(new Point(fromLonLat(lonLat))));
我正在寻找一种高性能解决方案,它允许我在地图上绘制超过 ±25k 点,而不会影响地图的性能和响应能力。我见过可以轻松处理 ±250k 点的示例,但是这些点是一次性加载的,并且这些点不会以每秒 10 次的速度动态添加。
我也不确定 OpenLayers 在底层是如何工作的,但从性能方面来看,当添加一个特性时,OpenLayers 似乎正在重绘整个层,因为它会随着时间的推移逐渐降低性能。每当我停止添加点时,我都会看到性能恢复,即使已经生成的点仍在地图上。
TL;DR我需要一种方法来每秒动态地将 10 点添加到可以轻松达到 100.000 点而不会显着影响性能的图层。WebGLPointsLayer
对我有很大帮助,但在达到 20/25 千分时会减慢我的速度。
解决方案
我在地图上绘制要素时遇到了性能问题,并通过首先将它们添加到数组中来解决它,然后在所有要素都在数组中之后将它们全部添加到源中。我在这里猜测,但是一次添加每个功能可能会产生相当大的开销,而通过一次添加所有功能可以缓解这种情况。
// Array
newFeatures.push(feature);
然后在其他地方一次将它们全部添加到源中。
vectorSource.addFeatures(newFeatures);
这有助于让我用大约 2000 个文本绘制大约 25000 个特征。
推荐阅读
- python - 为什么我的可以直接运行的代码添加%timeit后运行失败并提示ValueError?
- flutter - 在 Flutter 中循环遍历列表数据
- laravel - 如何检查 Laravel 查询中哪个条件有数据
- jmeter - JMeter - OutOfMemoryError 如何更改 Jmeter 中的堆大小?
- tkinter - 如何在 Tkinter 中设置火柴盒,所以“匹配所有”有效,但是当我想按下集合中的任何火柴盒时,我可以打破规则吗?
- postgresql - 将日期从日期时间转换为 JPA 查询中的文本
- python - 如何将 f-String 添加到 URL?特金特
- scala - 如何自动将修改应用于Scala中案例类的所有/部分字段?
- python - 通过使用按钮调用类来更新变量 - tkinter
- r - 我需要更新一个包