以下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有什么特殊目的吗?有谁可以向我解释一下?
谢谢!
答案 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。广场的大小根据地球上的位置而变化很大)并且一个网格单元格中的每个标记都获得相同的哈希值,因此组合在一起。