gpt4 book ai didi

javascript - 客户端集群 : Could someone explain what this line does?

转载 作者:行者123 更新时间:2023-11-30 06:41:45 24 4
gpt4 key购买 nike

以下 JavaScript 函数取自 http://sg.openrice.com/js/en/sdmap.js(包含此外部 JS 文件的网页:http://sg.openrice.com/singapore/restaurant/advancesearch.htm?mapType=1):

function showAllMarkers(data, options) {
var markerGroups = {};
var getcs = function (lat, lng) {
return '' + Math.round(lat * 32768) + Math.round(lng * 32768);
}
for (var i = 0; i < data.length; i++) {
if (markerList[data[i].id]) continue;
if (!(data[i].lat == 0 && data[i]['long'] == 0)) {
var xy = getcs(data[i].lat, data[i]['long']);
if (markerGroups[xy]) {
markerGroups[xy].push(data[i]);
} else {
markerGroups[xy] = [data[i]];
}
}
}
for (var i in markerGroups) {
updateGroupMarker(markerGroups[i], options);
}
}

脚本运行后,该函数用于对重叠的标记进行聚类。我完全理解 javascript 语法,但我不明白这一行的作用:

return '' + Math.round(lat * 32768) + Math.round(lng * 32768);

乘以32768有什么特殊用途吗?谁能给我解释一下?

谢谢!

最佳答案

该行只是为数组 markerGroups 生成字符串索引(“散列”)的某种方式。您应该从中了解到“getcs”是一个非描述性的名称,它使源代码阅读起来更加困难,您应该为函数起更清晰的名称,使含义清楚。

无论如何:四舍五入会去掉一些数字。由于作者可能不想削减很多数字,他必须将纬度/经度乘以足够大的值以减少影响。看起来 32768 或多或少是一个随机选择(它是 2^15,看起来仍然是随机的)。

好的,现在开始碰撞:两个非常接近的坐标...假设 0.000001,0.000001 和 0.000002,0.000002 将导致生成相同的散列。然后,作者使用这些哈希值对具有相同哈希值的所有标记进行分组。

这是一个非常简单的算法。它接受如果您有两个标记实际上彼此相邻(例如它们之间的毫米距离),但它恰好在哈希值会改变的边界处,算法不会将它们分组。

用更具说明性的话来说:该算法在您的 map 上放置一个网格,网格的每个单元格的大小为 1°/32768 * 1°/32768(即大约最大 3,4 *如果坐标系为 WGS84,赤道上每平方 3.4 米,德国 3.4m * 2.2m/美国/加拿大边界。正方形的大小会因地球上的位置而有很大差异)并且一个网格单元中的每个标记都获得相同的哈希值,因此被组合在一起。

关于javascript - 客户端集群 : Could someone explain what this line does?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10675349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com