2014-04-11 3 views
0

나는 마커 미만 5,000이 완벽 작동이 링크 http://www.appelsiini.net/2008/introduction-to-marker-clustering-with-google-maps서버 사이드 마커 클러스터링은 PHP & MongoDB를

의 말씀에 따라 서버 측 마커 클러스터링을 구현했습니다. 그러나 마커가 17,000으로 증가하면 매우 큰 루프가 실행되므로 모든 메모리가 소모됩니다. mongodb를 사용하여 모든 레코드를 lat n 길이로 저장합니다.

클러스터링을 위해 mongodb의 공간 쿼리 기능을 사용할 수 있습니까?

내가 서버 부하마다 사용자가 어떤 도움이 크게 감사합니다

while (count($markers)) { 
     $marker = array_pop($markers); 
     $cluster = array(); 
     /* Compare against all markers which are left. */ 
     foreach ($markers as $key => $target) { 
      $pixels = $this->pixelDistance($marker['lat'], $marker['long'], 
            $target['lat'], $target['long'], 
            $zoom); 
     if ($distance > $pixels && $zoom < 18) { 
      unset($markers[$key]); 
       $cluster[] = $target; 
     } 
     if (count($cluster) > 0) { 
       $cluster[] = $marker; 
       $clustered[] = $cluster; 
      } else { 
       $clustered[] = $marker; 
      } 
     } 
    $newarray = array(); 
    foreach($clustered as $key => $cluster) { 
     $centroid = array('lat' => 0, 'long' => 0, 'count' => 0); 
     if(isset($cluster[0]) && is_array($cluster[0])){    
      foreach($cluster as $marker) {  
      //echo "{$key} =>"; printArray($marker); 
       //if($key != 10){ 
        $centroid['lat'] += $marker['lat']; // Sum up the Lats 
        $centroid['long'] += $marker['long']; // Sum up the Lngs 
        $centroid['count']++; 
       //} 
      } 
      //if($centroid['count'] != 0){ 
       $centroid['lat'] /= $centroid['count']; // Average Lat 
       $centroid['long'] /= $centroid['count']; // Average Lng 
       $clustered[$key] = $centroid; // Overwrite the cluster with the single point. 
      //} 
     } 
    } 
    return $clustered; 

을 다음과 같이 지금까지 내가 클러스터링을하고있어지도, 을 드래그 클러스터를 계산하는 매우 작아야하는 방법을 일부입니다. 미리 감사드립니다.

답변

1

경계 상자를 사용하여 검색 범위를 좁힐 수 있습니다. 경도는 111km입니다 : http://en.m.wikipedia.org/wiki/Longitude. 타일은 3 개의 변수 x, y, z로 계산됩니다. x, y 축 및 줌 레벨 z가있는 2 차원 격자를 사용합니다. 여기에서 읽으십시오 : http://msdn.microsoft.com/en-us/library/bb259689.aspx. 기본적으로 lat-lng 쌍을 픽셀 좌표로 변환해야합니다. 그런 다음 타일 번호를 얻을 수 있습니다. 최대 픽셀은 2의 거듭 제곱입니다. 따라서 최대 줌 레벨에서 큰 수입니다. 당신이 빙 타일링 시스템에서 주장 때문에 :

타일의 색인 및 저장을 최적화하기 위해 2 차원 타일 XY 좌표는 짧게 쿼드 트리 키, 또는 "quadkeys"라는 한 차원 문자열로 결합됩니다. 각 쿼드 키는 특정 상세 수준에서 단일 타일을 고유하게 식별하며 공통 데이터베이스 B- 트리 인덱스에서 키로 사용할 수 있습니다. 타일 ​​좌표를 쿼드 키로 변환하려면 Y 및 X 좌표의 비트가 인터리브되고 그 결과가 4 진수 (선행 0이 유지 된 상태)로 해석되어 문자열로 변환됩니다. 예를 들어, 주어진 타일 XY는 (3, 5) 단계 (3)에서, 쿼드 키를 판정은 다음의 좌표

는 tileX를 = 3 = 011 2

tileY의 = 5 = 101 2

쿼드 키 = 100111 2 = 213 4 = "213"

쿼드 키에는 여러 가지 흥미로운 속성이 있습니다. 첫째, 쿼드 키의 길이 (숫자의 숫자)는 해당 타일의 세부 묘사 수준과 같습니다. 둘째, 모든 타일의 쿼드 키는 상위 타일 (이전 레벨 에있는 포함 타일)의 쿼드 키로 시작합니다.

이것은 쿼드 트리 또는 r- 트리와 매우 유사하며 독자에게는 좋은 연습 일 수 있지만 이미 빙 타일 코드가 있습니다.

+0

http://www.soak.co.uk/blog/technical/server-side-map-marker-clustering/ 이 링크는 유용하지만 다른 줌 레벨에서 Google지도에 타일을 구현하는 방법입니다. – Robin

+0

내 대답이 업데이트되었습니다. 여기를 읽으십시오 : http : //msdn.microsoft.com/en-us/library/bb259689.aspx. – Bytemain

+0

이 사이트를 참조하십시오 : http://www.middlesexcountyhomesearcher.com/results-map 지도의 다른 지역에서 서로 다른 크기의 오버레이를 어떻게 가지고 있습니까? – Robin