2011-02-01 3 views
4

Je voudrais savoir quel est l'algorithme le plus rapide pour les marqueurs de clustering en PHP?clustering sur le serveur google maps marqueurs

La seule chose dont j'ai besoin de la fonction de cluster est une sortie avec un obj de cluster, qui a des propriétés: lat, lng et size.

puis les marqueurs qui n'étaient pas groupés bien sûr, mais je n'arrive pas à trouver de code php pour cela, et il doit y en avoir?

Je cherche le code-behind qui produirait ce genre de résultat? (Ou peut-être mieux performer). http://maps.forum.nu/server_side_clusterer/

Jusqu'à présent, j'ai essayé avec:

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

Mes données est jsonized alors, mais le tableau clustermarkers contient toutes les markerdata, et je me demande comment je effectivement simplement définir une latitude , lng et une taille sans avoir à recalculer à ressourcedemanding chaque fois qu'un nouveau marqueur est ajouté.

+1

Qu'avez-vous à ce jour? – diagonalbatman

+0

@Andy Paton - J'ai édité la question - bon point =) – Jakob

+0

Bien que je ne comprenne pas complètement ce que vous essayez d'atteindre, il serait plus efficace si vous pouviez réécrire votre fonction afin qu'elle ne contienne pas de boucles imbriquées . – Robin

Répondre

4

Fondamentalement, le tableau $clusterMarkers est un groupe de marqueurs en cluster, vous pouvez donc simplement prendre le centroïde des marqueurs contenant au lieu de retourner tous les marqueurs. Avant de retourner le résultat, faites:

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

c'est vraiment bizarre mais cet ajout fait que le serverrequest encombre tout. Firefox et les stands de chrome et je dois tuer le processus si j'utilise cela – Jakob

+0

Combien de marqueurs avez-vous affaire? – Hamish

+0

@Hamish - À l'heure actuelle seulement 500, mais à long terme des millions. – Jakob