代码之家  ›  专栏  ›  技术社区  ›  Arjan

OpenLayers 6使用大量点数进行频繁的图层更新

  •  0
  • Arjan  · 技术社区  · 5 年前

    我目前正在使用OpenLayers 6来显示移动地图应用程序生成的地理数据。这包括一个“实时”GPS位置,每秒最多更新10次。通过更新图层上的功能,我可以以这种速度运行我的应用程序,而不会出现任何问题。

    第二个功能是让GPS在地图上留下“面包屑”。这些点每秒添加10次到特定层。我一直在用 WebGLPointsLayer 在我遇到问题之前,展示这些将性能大幅提升到25000分的分数。使用以下代码添加这些点:

    图层初始化:

    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;博士 我需要一种方法来动态增加10点每秒到一个层,可以很容易地上升到100.000点没有明显的性能影响。 网络杀手 帮了我很多忙,但当我达到2万5千分时,速度会变慢。

    0 回复  |  直到 5 年前
        1
  •  0
  •   Emirr    5 年前

    在地图上绘制要素时,我遇到了一个性能问题,通过先将要素添加到阵列中,然后在阵列中的所有要素都添加到源中来解决。我在这里猜测,但是当一次添加一个功能时,可能会有相当大的开销,而一次添加所有功能可以减轻这种开销。

    // Array 
    newFeatures.push(feature);
    

    然后在其他地方将它们同时添加到源中。

    vectorSource.addFeatures(newFeatures);
    

    这有助于我用2000个左右的文本绘制大约25000个特征。