2012-05-20 2 views
2

다음 자바 스크립트 기능이 http://sg.openrice.com/js/en/sdmap.js (: http://sg.openrice.com/singapore/restaurant/advancesearch.htm?mapType=1이 외부 JS 파일을 포함 웹 페이지)에서 찍은 스크립트가 실행
클라이언트 측 클러스터링 : 누군가이 행의 기능을 설명 할 수 있습니까?

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); 
    } 
} 

후, 기능이 중복 마커를 클러스터하는 데 사용됩니다. 난 완전히 자바 스크립트 구문을 이해하지만, 나는이 선이 무엇을하는지 이해가 안 : 32768 곱에 대한 특별한 목적이

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

있습니까? 누구든지 내게 설명 할 수 있니?

감사합니다.

답변

0

해당 줄은 배열 markerGroups에 대한 문자열 색인 ("해시")을 생성하는 방법 일뿐입니다. 그것으로부터 배워야 할 것은 "getcs"는 쓸모없는 이름이고, 소스 코드를 더 읽기 어렵게 만들고, 함수가 명확한 의미를 명확히하는 함수를 제공해야합니다.

어쨌든 : 반올림으로 인해 자릿수가 잘립니다. 저자는 아마도 많은 자릿수를 자르고 싶지 않으므로 위도/경도에 효과를 줄이기 위해 충분히 큰 값을 곱해야합니다. 32768은 다소 임의의 선택입니다 (2^15이며 여전히 임의의 것으로 보입니다).

이제는 서로 충돌합니다. 서로 매우 가까운 두 좌표 ... 0.000001,0.000001 및 0.000002,0.000002라고하면 같은 해시가 생성됩니다. 그런 다음이 해시를 사용하여 해시가 동일한 모든 마커를 그룹화합니다.

이것은 매우 단순한 알고리즘입니다. 문자 그대로 서로 옆에있는 두 개의 마커 (밀리미터 사이의 거리)가 있지만 해시 값이 변경되는 경계에있는 경우 알고리즘에서 해당 마커를 그룹화하지 않습니다.

알고리즘은지도 위에 격자를 둡니다. 각 격자의 크기는 1 °/32768 * 1 °/32768입니다 (즉, 까지 3,4 * 3,4 적도의 평방당 미터, 독일의 경우 3,4m * 2,2m, 좌표계가 WGS84 인 경우 미국/캐나다 경계에서. 사각형의 크기는 지구상의 위치에 따라 많이 달라질 수 있습니다. 하나의 격자 셀은 동일한 해시 값을 가져오고 결과적으로 함께 그룹화됩니다.

+0

감사합니다 양키. 귀하의 설명은 매우 분명합니다. – GosseMan

관련 문제