我正在搞乱 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
。这个工作流程立竿见影。
有什么想法吗?
提前致谢
答案 0 :(得分:2)
因此,根据我从文档和示例here得到的内容,我认为您的问题是,对于您添加的每一点,您都在运行整个数据集的完全重新聚类(无论您有什么已经加入)。因此,当您添加单个数据点时,将有1000个群集操作变得越来越复杂。
在您的情况下,您可以在实例化Provider之前填充数据点数组,或者在稍后阶段使用setDataPoints。聚类操作必须在某个时刻发生。在旧API中,当您调用'cluster'时会发生这种情况,但现在它在呈现对象层时按需发生,并且每次添加数据点或设置数据点时都会发生。
地图已经根据静态群集计算为您更新标记。
总之,过程如下:
所以给上面链接的例子一个旋转(它聚集了超过一千点,几乎没有任何延迟),看看它是否能满足您的需求。
编辑:(根据以下评论) 以下是我的建议: 保留两个数组,一个代表整个数据集,一个跟踪更改批次。始终从服务器响应中填充批处理数组。 mapviewchangeend命中后,将批处理数组添加到数据数组,然后在提供程序上设置数据集数组。
HelloService helloWS = new HelloService();
HellowServicePort helloPort = helloWS.getHelloServicePort();
for(String name : names) {
helloPort.sayHello(name);
}