客户端群集:有人可以解释一下这行吗?

时间:2012-05-20 16:54:23

标签: javascript maps cluster-analysis marker

以下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有什么特殊目的吗?有谁可以向我解释一下?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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

更多说明性的话:算法在地图上铺设网格,网格的每个单元格大小为1°/ 32768 * 1°/ 32768(大约高达3,4 *赤道每平方3,4米,德国境内3,4m * 2,2m /美国/加拿大边境,如果坐标系为WGS84。广场的大小根据地球上的位置而变化很大)并且一个网格单元格中的每个标记都获得相同的哈希值,因此组合在一起。