HERE 映射 JS API v3 集群提供程序挂起,添加许多数据点
HERE Maps JS API v3 cluster provider hangs adding many DataPoints
我搞砸了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
。此工作流是即时的。
知道吗?
提前致谢
因此,从我从文档和此处的示例中获得的信息来看,我认为您的问题是,对于您添加的每个点,您都在运行整个数据集的完整重新聚类(无论您已经添加的任何内容)。因此,随着您添加单个数据点,您将有 1000 个聚类分析操作变得越来越复杂。
在您的情况下,您应该可以在实例化提供程序之前填充数据点数组,或者在稍后阶段使用 setDataPoint。群集操作必须在某个时候发生。在旧的 API 中,当您调用"cluster"时会发生这种情况,但现在它会在渲染对象层时按需发生,并且每次添加数据点或设置数据点时都会发生。
地图已负责根据静态聚类计算为您更新标记。
总之,该过程如下:
- 提供程序接收数据点数组作为数据集
- 它对此数据集进行全局聚类并生成静态所有缩放级别的聚类结果
- 当地图渲染时,将为每个聚类调用主题,并且已计算的聚类结果中的噪声点,以便为当前地图位置渲染正确的标记并缩放水平
- 每当数据集更改时重复 1-3
因此,给上面链接的示例一个旋转(它聚集了一千多个点,对我来说几乎没有任何延迟),看看它是否做到了你要找的。
编辑:(基于下面的评论)以下是我的建议:保留两个数组,一个表示整个数据集,一个跟踪更改批次。始终从服务器响应中填充批处理数组。一旦 mapviewchangeend 命中,将批处理数组添加到数据数组中,然后在提供程序上设置数据集数组。
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);
var clusterSet = [],
batchSet = [],
maxDataSetSize = 5000;
map.addEventListener('mapviewchangeend', function() {
// if we added any points between mapviewchangestart / end
if(batchSet.length > 0) {
// we add the data and slice take a subset of 5000 points to keep
// the data set at manageable size (adjust to your liking)
clusterSet = batchSet.concat(clusterSet).slice(0, maxDataSetSize);
clusteringProvider.setDataPoints(clusterSet);
}
batchSet = [];
});
//whereever you receive your data:
function onReceiveData(dataPoints) {
// always push to the batch set
batchSet = batchSet.concat(dataPoints);
}
- JavaScript执行暂时挂起页面
- 是定义的操作系统睡眠/挂起期间setTimeout的行为
- Chrome浏览器“;挂起”;同时在循环中执行AJAX请求
- fullcalendar在删除导致浏览器挂起的多个事件时速度较慢
- 应用将图表转换为图像的jqplot代码时Chrome挂起
- 如何在不使用Internet Explorer的情况下从未挂起的HTML文件执行程序
- 使用子字符串方法时应用程序挂起的原因
- 从node.js应用程序调用Mongoose Model.save()时挂起
- HERE 映射 JS API v3 集群提供程序挂起,添加许多数据点
- 在javascript中使用.replacement()函数时,请避免取消挂起事件处理程序
- 是避免IE内存泄漏所需的取消挂起事件处理程序
- Sencha Touch应用程序在Android和iOS上运行良好,但在Windows 8.1上挂起
- ng-show挂起我的整个应用程序
- 调用javascript函数的flash应用程序在调用javascript alert()时停止挂起处理
- PhoneGap条形码扫描仪导致iOS应用程序挂起
- 电子应用程序经常挂起
- 在Windows 8 html5的挂起状态事件处理程序中写入文本文件
- Node.js:程序意外退出或只是挂起
- Phonegap应用程序因网络连接不良而挂起
- 如何在应用程序挂起后立即触发Windows 8的后台任务