2012-05-20 5 views
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); 
    } 
} 

После выполнения скрипта, функция используется для кластера перекрывающихся маркеров. Я полностью понимаю яваскрипт синтаксиса, но я не понимаю, что делает эта строка:

return '' + Math.round(lat * 32768) + Math.round(lng * 32768); 

Есть ли какие-либо специальные цели, для умножения на 32768? Может ли кто-нибудь объяснить мне?

Спасибо!

ответ

0

Эта строка является лишь способом генерации индекса строки («хеш») для группы маркеров. То, что вам следует извлечь из этого, заключается в том, что «getcs» является неписаным именем, он усложняет чтение исходного кода, и вы должны давать функции более ясным именам, которые делают смысл понятным.

В любом случае: округление сокращает некоторые цифры. Поскольку автор, вероятно, не хочет сокращать до многих цифр, он должен умножать lat/long с достаточно большим значением, чтобы уменьшить эффект. Похоже, что 32768 - это более или менее случайный выбор (это 2^15, кажется еще случайным).

ОК, теперь к столкновениям: две координаты, которые очень близки друг к другу ... Скажите, что 0.000001,0.000001 и 0,000002,0.000002 будут вызывать одинаковый хеш. Затем автор использует эти хеши для группировки всех маркеров, имеющих один и тот же хеш.

Это очень упрощенный алгоритм. Он соглашается с тем, что если у вас есть два маркера, которые буквально находятся рядом друг с другом (например, расстояние в миллиметр между ними), но оно находится только на границе, где значение хеша будет изменяться, алгоритм не будет группировать их.

В более иллюстративных словах: Алгоритм лежит сетку над картой, каждая ячейка сетки с размером 1 °/32768 * 1 °/32768 (то есть примерно до 3,4 * 3,4 метров на квадрат на экваторе, 3,4 м * 2,2 м в Германии/на границе между США и Канадой, если система координат - WGS84. Размер квадрата будет сильно варьироваться в зависимости от положения на земле) и каждый маркер в пределах одна ячейка сетки получает одно и то же значение хеша и, следовательно, группируется вместе.

+0

Спасибо, янки. Ваше объяснение очень ясное. – GosseMan