кластеризация серверов маркеры карт Google - PullRequest
4 голосов
/ 01 февраля 2011

Я хотел бы знать, какой самый быстрый алгоритм кластеризации маркеров в PHP?

Единственное, что мне нужно от функции cluster, - это вывод с кластером obj, который имеет свойства: lat, lng и size.

и затем маркеры, которые не были кластеризованы, конечно, но я не могу найти 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 содержит все маркерные данные, и я 'Мне интересно, как я мог бы эффективно установить значения lat, lng и размер без необходимости пересчитывать ресурсы, требующие каждый раз, когда добавляется новый маркер.

Ответы [ 2 ]

4 голосов
/ 25 февраля 2011

В основном массив $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 голосов
/ 25 февраля 2011

Я использую класс JavaScript MarkerClusterer от Xiaoxi Wu.

Возможно, вы захотите взглянуть и адаптировать его к PHP:

http://googlegeodevelopers.blogspot.com/2009/04/markerclusterer-solution-to-too-many.html

...