【问题标题】:serverside clustering google maps markers服务器端集群谷歌地图标记
【发布时间】:2011-06-19 06:39:56
【问题描述】:

我想知道PHP中最快的聚类标记算法是什么?

我只需要集群函数的输出是带有集群 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); 
  }

然后我的数据被 json 化,但 clustermarkers 数组包含所有标记数据,我想知道如何有效地简单地设置纬度、经度和大小,而不必在每次添加新标记时重新计算资源需求。

【问题讨论】:

  • @Andy Paton - 我编辑了这个问题 - 好点 =)
  • 虽然我不完全理解您要实现的目标,但如果您可以重写您的函数以使其不包含嵌套循环,则效率会更高。
  • @Robin - 我从别人那里拿到了这个 sn-p,所以实际上我自己并不能 100% 理解它。我也更喜欢一种替代解决方案,它会输出带有大小、lat 和 lng 的聚集标记,然后是带有所有数据的非聚集标记。

标签: php mysql google-maps cluster-analysis


【解决方案1】:

基本上$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.
}

【讨论】:

  • 这真的很奇怪,但是那个插件让服务器请求阻塞了一切。 Firefox 和 chrome 停止,如果我使用它,我必须终止该进程
  • @Hamish - 现在只有 500 个,但长期来看是数百万个。
  • @Hamish - 但是线程块真的很奇怪 - 为什么无论数据如何阻塞系统,异步调用都会发生。也许这是一个 javascript 错误,也许你的脚本正在运行。
  • 如果是数百万,那么您可能应该看看更强大的 GIS 解决方案,例如使用空间列和聚合查询,而不是尝试在 PHP 中构建输出。不知道为什么这会阻塞 - 你有示例代码吗?
  • @Hamish - 请详细说明“更坚固的 GIS 解决方案”是否有任何链接可以查看以了解如何创建更好的解决方案?
【解决方案2】:

我使用的是吴小西的 MarkerCluster JavaScript 类。

您可能想看一下并将其改编为 PHP:

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

【讨论】:

  • 嘿 - 是的,但是有很多 google 功能,而且插件似乎相对难以剖析。似乎更容易找到一些可以为我执行此请求的代码。
猜你喜欢
  • 2011-08-09
  • 2013-03-24
  • 1970-01-01
  • 2016-04-03
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
相关资源
最近更新 更多