Javascript 客户端集群:有人能解释一下这条线的作用吗?

Javascript 客户端集群:有人能解释一下这条线的作用吗?,javascript,maps,cluster-analysis,marker,Javascript,Maps,Cluster Analysis,Marker,以下JavaScript函数取自 (包含此外部JS文件的网页:): 乘以32768有什么特殊用途吗?谁能给我解释一下吗 谢谢 该行只是为数组markerGroups生成字符串索引(“hash”)的某种方式。您应该从中了解到,“getcs”是一个非描述性名称,它使源代码阅读更加困难,您应该为函数提供更清晰的名称,使其含义更清晰 无论如何:四舍五入去掉了一些数字。由于作者可能不想削减到许多数字,他必须将lat/long乘以足够大的值以减少影响。看起来32768或多或少是一个随机选择(它是2^15,似

以下JavaScript函数取自 (包含此外部JS文件的网页:):

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


谢谢

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

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

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

这是一个非常简单的算法。它接受这样一种情况:如果有两个标记彼此相邻(就像它们之间有一毫米的距离),但只是在散列值将改变的边界处,算法将不会对它们进行分组


更具说明性的是:该算法在地图上放置一个网格,网格的每个单元格大小为1°/32768*1°/32768(如果坐标系为WGS84,赤道上约为3,4*3,4米/平方米,德国为3,4米*2,2米/美国/加拿大边界处。根据地球上的位置,正方形的大小会有很大变化)一个网格单元中的每个标记都会得到相同的散列值,并因此被分组在一起。

该行只是为数组标记组生成字符串索引(“散列”)的一种方式。您应该从中学习的是“getcs”是一个非描述性的名称,它使源代码更难阅读,您应该为函数提供更清晰的名称,使其含义更清晰

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

好,现在来看看冲突:两个彼此非常接近的坐标…比如0.000001,0.000001和0.000002,0.000002将生成相同的散列。然后作者使用这些散列对具有相同散列的所有标记进行分组

这是一个非常简单的算法。它接受这样一个事实:如果两个标记彼此相邻(就像它们之间有一毫米的距离),但只是在散列值将发生变化的边界处,算法将不会对它们进行分组

更具说明性的是:该算法在地图上放置一个网格,网格的每个单元格大小为1°/32768*1°/32768(如果坐标系为WGS84,赤道上每平方米的面积约为3,4*3,4米,德国为3,4*2,2米/美国/加拿大边境。根据地球上的位置,正方形的大小会有很大的变化)并且一个网格单元内的每个标记都会得到相同的散列值,因此被分组在一起

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);
    }
}
return '' + Math.round(lat * 32768) + Math.round(lng * 32768);