HERE Maps JS API v3集群提供程序挂起添加许多DataPoints

时间:2016-04-20 13:39:31

标签: javascript here-api

我正在搞乱 HERE Maps JS API v2.5.4 迁移到 v3

我面临的最大问题与H.clustering.Provider有关。虽然v2.x版本就像魅力一样,但v3版本看起来确实很慢。

给出以下代码:

var clusterProvider = new H.clustering.Provider([], {
    clusteringOptions: {
        eps: 32,
        minWeight: 3,
        max: 20,
        min: 10
    }
});

var clusteringLayer = new H.map.layer.ObjectLayer(clusterProvider);

map.addLayer(clusteringLayer);

for(i = 0; i < 1000; i++)
{
    var lat = 43 + (i * 0.001);
    var lng = 13 + (i * 0.001);
    var dp = new H.clustering.DataPoint(lat, lng, null, null);
    clusterProvider.addDataPoint(dp); // <- this line cause hanging
}

在渲染群集之前,页面会挂起很多秒。

在文档中,我读到:

  

addDataPoint(dataPoint)

     

此方法将数据点添加到提供程序。请注意,此方法会引发整个数据集的重新集群。

但是,我无法使用setDataPoints方法,因为我需要在每个地图平移或缩放时刷新群集(而不是重新开始)。

v2 版本中,我会为每个数据点调用群集提供程序的addObject方法,并在末尾调用cluster。这个工作流程立竿见影。

有什么想法吗?

提前致谢

1 个答案:

答案 0 :(得分:2)

因此,根据我从文档和示例here得到的内容,我认为您的问题是,对于您添加的每一点,您都在运行整个数据集的完全重新聚类(无论您有什么已经加入)。因此,当您添加单个数据点时,将有1000个群集操作变得越来越复杂。

在您的情况下,您可以在实例化Provider之前填充数据点数组,或者在稍后阶段使用setDataPoints。聚类操作必须在某个时刻发生。在旧API中,当您调用'cluster'时会发生这种情况,但现在它在呈现对象层时按需发生,并且每次添加数据点或设置数据点时都会发生。

地图已经根据静态群集计算为您更新标记。

总之,过程如下:

  1. 提供程序接收数据集数组作为数据集
  2. 它全局聚类此数据集并生成静态数据集 所有缩放级别的聚类结果
  3. 当地图呈现时,会为每个群集调用主题 已计算的聚类结果中的噪声点为了 为当前地图位置和缩放渲染适当的标记 等级
  4. 数据集更改时重复1-3
  5. 所以给上面链接的例子一个旋转(它聚集了超过一千点,几乎没有任何延迟),看看它是否能满足您的需求。

    编辑:(根据以下评论) 以下是我的建议: 保留两个数组,一个代表整个数据集,一个跟踪更改批次。始终从服务器响应中填充批处理数组。 mapviewchangeend命中后,将批处理数组添加到数据数组,然后在提供程序上设置数据集数组。

    HelloService helloWS = new HelloService();
    HellowServicePort helloPort = helloWS.getHelloServicePort();
    for(String name : names) {
    helloPort.sayHello(name);
    }