【问题标题】:How to know zoom level to display a marker inside google marker cluster如何知道缩放级别以在谷歌标记集群中显示标记
【发布时间】:2014-02-24 14:20:06
【问题描述】:

嗯,几乎所有内容都在标题中:

  • 我有数千个带有 google 标记簇的标记(不是 google 标记簇 plus:如果有帮助,请告诉我)
  • 一切正常

但是

  • 当我触发与特定标记相关的事件时,我想单独显示此标记(不再显示在集群中)。
  • 由于标记的空间重新分区不均匀:在某些地方,缩放级别为 9 会单独显示它,但在另一个地方,我必须将缩放级别设置为 15。

所以

  • 最终的问题是:给一个特定的制造商,如何“查询”标记集群来知道:
    1. 可能是距离最近的制造商的距离(假设我应该能够计算相应的缩放级别)
    2. 任何其他我当时仍然应该错过的有用信息......

【问题讨论】:

    标签: google-maps-api-3 zooming markerclusterer


    【解决方案1】:

    我已经使用了这个解决方案。它检查所选标记是否在集群中。如果是则增加缩放级别。

     var zoom = 15;
     this.map.setCenter(marker.getPosition());   
    
     var zoomInterval = setInterval($.proxy(function() {
         if(!marker.map) {
             this.map.setZoom(zoom++);
         } else {
             clearInterval(zoomInterval);
         }
     }, this), 400);
    

    请注意,如果标记在集群中,则它的“地图”属性为“空”。

    【讨论】:

      【解决方案2】:

      一些代码;)

      /**
       * Computes scale in meters per pixel for given zoom and latitute.
       *
       * @param {Object} opt optional parameters
       *      - zoom
       *      - lat
       *      - precision
       *
       * @returns {Number} scale in meters per pixel
       */
      google.maps.Map.prototype.getMapScale = function (opt){
          var circumference = 40075040,
              zoom, lat, scale;
      
          if (typeof(opt['zoom']) == 'number' && typeof(opt['lat']) == 'number') {
              zoom = opt['zoom'];
              lat = opt['lat'];
          } else {
              zoom = this.getZoom();
              lat = this.getCenter().lat();
          }
      
          scale = (circumference * Math.cos(lat) / Math.pow(2, zoom + 8));
      
          if (typeof(opt['precision']) == 'number') {
              scale = Number(scale.toFixed(opt['precision']));
          }
      
          return scale;
      }
      
      
      function calculateZoomLevelMarkerAloneInCluster(VigneronID){
          var distance = 1000000000;
          var found_marker_in_cluster = false;
          /* GET ALL CLUSTERS FROM GMAP MARKER CLUSTER */
          var clustersArray = mc.getClusters();
          /* FOR ALL CLUSTERS */
          $.each(clustersArray, function(key, cluster){
              var markersClusterArray = cluster.getMarkers();
              /* FOR ALL MARKERS IN THIS CLUSTER */
              $.each(markersClusterArray, function(key, marker){
                  /* IF I FIND MY MARKER */
                  if(marker.VigneronID === VigneronID){
                      /* MARKER IS IN CLUSTER : no need to process all markers */
                      found_marker_in_cluster = true;
                      /* THEN AGAIN : FOR ALL MARKERS IN THIS CLUSTER */
                      var distance_tmp = 0;
                      /* FOR ALL MARKERS IN THIS CLUSTER */
                      $.each(markersClusterArray, function(key, marker2){
                          /* ALL MARKERS EXCEPT MINE (otherwise distance will always be 0 :-) ) */
                          if(marker.VigneronID !== marker2.VigneronID){
                              /* CALCULATE DISTANCE BETWEEN MY MARKER : http://stackoverflow.com/questions/1502590/calculate-distance-between-two-points-in-google-maps-v3 */
                              distance_tmp = google.maps.geometry.spherical.computeDistanceBetween(marker.getPosition(), marker2.getPosition());
                              /* KEEP MIN DISTANCE */
                              if(distance_tmp < distance && distance_tmp!==0){
                                  distance = distance_tmp;
                              }
                          }
                      });
                      /* NO REASON TO CONTINUE PROCESS : BREAK */
                      return false;
                  }
              });
          });
      
          if(found_marker_in_cluster === false){
              var markersClusterArray = mc.getMarkers()
              $.each(markersClusterArray, function(key, marker){
                  if(marker.VigneronID === VigneronID){
                      var distance_tmp = 0;
                      /* FOR ALL MARKERS IN THIS CLUSTER */
                      $.each(markersClusterArray, function(key, marker2){
                          /* ALL MARKERS EXCEPT MINE (otherwise distance will always be 0 :-) ) */
                          if(marker.VigneronID !== marker2.VigneronID){
                              /* CALCULATE DISTANCE BETWEEN MY MARKER : http://stackoverflow.com/questions/1502590/calculate-distance-between-two-points-in-google-maps-v3 */
                              distance_tmp = google.maps.geometry.spherical.computeDistanceBetween(marker.getPosition(), marker2.getPosition());
                              /* KEEP MIN DISTANCE */
                              if(distance_tmp < distance && distance_tmp!==0){
                                  distance = distance_tmp;
                              }
                          }
                      });
                  }
              });
          }
      
          var mapScale = map.getMapScale({}); /* meters / pixels */
          var gridSizePixels = mc.getGridSize(); /* in pixels */
          var gridSizeMeters = gridSizePixels * mapScale;
      
          if(distance!==1000000000 && distance!==0){
              if(distance < gridSizeMeters){
                  var factor = get2Factor(gridSizeMeters, distance);
                  map.setZoom(map.getZoom() + factor);
              } else{
                  var factor = get2Factor(distance, gridSizeMeters);
                  map.setZoom(map.getZoom() - factor + 1);
              }
      
          }
          /*alert(distance);*/
      }
      
      function get2Factor(grid, distance){
          var count = 0;
          while(distance < grid){
              count++;
              grid = grid / 2;        
          }
          return count;
      }
      

      一些解释:

      首先代码被高度评价,所以请阅读它

      其次:

      • 第一个函数getMapScale在网上找到

      • 在我使用这些函数之前,我需要先设置我的标记一个标识符(这里:marker.VigneronID),然后再推入标记集群

      • 我在集群中进行第一次迭代以找到我的标记和到最近标记的距离(以米为单位)

      • 如果我没有找到我的标记,这意味着它不在集群中,所以我对标记集群管理的所有标记进行第二次迭代,并获取到最近标记的距离(以米为单位)

      • 然后我以米为单位计算 gridSize(感谢函数 getMapScale 以米为单位转换像素)

      • 知道每个缩放级别是之前缩放级别的 2 倍,我计算我最近的标记和我的集群网格大小之间的距离,以了解我可以添加或减去多少缩放级别到当前缩放级别

      是的!

      【讨论】:

        猜你喜欢
        • 2011-01-22
        • 2023-03-19
        • 1970-01-01
        • 2020-07-01
        • 2019-11-26
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多