2

以下 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 有什么特殊用途吗?谁能给我解释一下?

谢谢!

4

1 回答 1

0

该行只是为数组 markerGroups 生成字符串索引(“散列”)的某种方式。您应该从中学到的是“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,则在美国/加拿大之间的边界。正方形的大小会因地球上的位置而有很大差异),并且一个网格单元内的每个标记都相同哈希值,因此被组合在一起。

于 2012-05-20T17:20:45.927 回答