以下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将导致生成相同的哈希。然后,作者使用这些哈希将所有具有相同哈希的标记分组。

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

用更说明性的词来说:该算法在您的地图上放置一个网格,该网格的每个像元的大小为1°/ 32768 * 1°/ 32768(在赤道上大约为每平方米3,4 * 3,4米,如果坐标系为WGS84,则在德国/美国/加拿大之间的边界处为3,4m * 2,2m。根据地球上的位置,正方形的大小会相差很大),并且一个网格单元中的每个标记都相同哈希值,因此被分组在一起。

08-20 02:09