以下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。根据地球上的位置,正方形的大小会相差很大),并且一个网格单元中的每个标记都相同哈希值,因此被分组在一起。