2011-02-01 3 views
4

PHPでマーカをクラスタリングする最も速いアルゴリズムは何ですか?サーバサイドクラスタリングGoogleマップマーカ

クラスター関数から必要なものは、プロパティーlat、lng、およびsizeを持つクラスターobjの出力です。

その後、もちろんクラスタ化されていないマーカーが、私はこれのためのPHPコードを見つけることができないようであり、いくつかあるでしょうか?

このような結果をもたらすコードビハインドを探していますか? (または、おそらくより良い実行)。 http://maps.forum.nu/server_side_clusterer/

は、これまで私が試してみた:

function ClusterMarkers($markers,$ZOOM) 
    { 
    $this->load->library('firephp');  
    $singleMarkers = array(); 
    $clusterMarkers = array(); 

    // Minimum distance between markers to be included in a cluster, at diff. zoom levels 
    $DISTANCE = (10000000 >> $ZOOM); 
    // Loop until all markers have been compared. 
    while (count($markers)) { 
     $marker = array_pop($markers); 
     $cluster = array(); 

     // Compare against all markers which are left. 
     foreach ($markers as $key => $target) { 
      $pixels = abs($marker['lat']-$target['lat']) + abs($marker['lng']-$target['lng']); 
      $this->firephp->log('pix :'.$pixels); 
      if ($pixels < $DISTANCE) { 
       unset($markers[$key]); 
       $cluster[] = $target; 
      } 
     } 

     // If a marker has been added to cluster, add also the one we were comparing to. 
     if (count($cluster) > 0) { 
      $cluster[] = $marker; 
      $clusterMarkers[] = $cluster; 
     } else { 
      $singleMarkers[] = $marker; 
     } 
    } 
    return array('singlemarkers' => $singleMarkers, 'clustermarkers' => $clusterMarkers); 
    } 

私のデータはjsonizedされますが、clustermarkers配列はすべてmarkerdataが含まれている、と私は効果的に単純に緯度を設定する方法を思ったんだけど、lng、およびサイズを再計算しなくても、新しいマーカーが追加されるたびにリソースを保存することができます。

+1

は、あなたがこれまで持っていますか? – diagonalbatman

+0

@Andy Paton - 質問を編集しました - 良い点=) – Jakob

+0

達成しようとしていることを十分に理解していませんが、ネストされたループを含まないように関数を書き直すことができれば、 。 – Robin

答えて

4

基本的に$clusterMarkersの配列はクラスタ化されたマーカーのグループなので、すべてのマーカーを返す代わりに、そのマーカーの重心をとるだけで済みます。結果を返す前に、実行します。

foreach($clusterMarkers as $key => $cluster) { 
    $centroid = array('lat' => 0, 'lng' => 0, 'count' => 0); 
    foreach($cluster as $marker) {  
     $centroid['lat'] += $marker['lat']; // Sum up the Lats 
     $centroid['lng'] += $marker['lng']; // Sum up the Lngs 
     $centroid['count']++; 
    } 
    $centroid['lat'] /= $centroid['count']; // Average Lat 
    $centroid['lng'] /= $centroid['count']; // Average Lng 
    $clusterMarkers[$key] = $centroid; // Overwrite the cluster with the single point. 
} 
+0

それは本当に変だけど、そのアドオンによってserverrequestがすべてを詰まらせる。 FirefoxとChromeが停止していて、それを使用すればプロセスを終了する必要があります – Jakob

+0

扱うマーカーの数はいくつですか? – Hamish

+0

@ハミッシュ - 今はわずか500で、長期的には何百万という。 – Jakob

関連する問題