ThinkGeo.com    |     Documentation    |     Premium Support

Number of markers in a cluster

Hi,


I am using ClusterMarkerStyle to reduce the number of markers in the viewport. While clicking on the marker a popup displays. I need to display the number of markers in the cluster within the popup.


Can you please let me know the property to get the number of markers in the cluster as in the link gmaps-utility-library.google...ample.html?



KarunaKaran 
  
 Thank you for your post. 
  
 We have a GetMarkers method in ClusteMarkerStyle, you can use that to get the number of markers in your target feature, then popup it. 
  
 clusterMarkerStyle.GetMarkers(markerOverlay.Features); 
  
 Regards, 
  
 Gary

Hi, 
  
 I tried with GetMarkers method and i get the count as same as the number of features passed. But I need to get the number of markers behind the clustered marker in the view port (ex: Count should be 3 for the first feature and so on). I have attached my sample code below. Can you please get me a sample code to implement the GetMarkers method and direct me in right way to achieve my requirement? 
  
 ClusterMarkerStyle clusterMarkerStyle = new ClusterMarkerStyle(20, 1024, 768);
                clusterMarkerStyle.MarkerStyle = new PointMarkerStyle();
                RectangleShape extent = null;

                for (var i = 0; i < 1000; i++)
                {
                    Random random = new Random(i.GetHashCode());
                    Feature feature = new Feature(-95.28109 + random.Next(1, 10), 38.95363 + random.Next(1, 5));
                    if (extent == null)
                    {
                        extent = feature.GetBoundingBox();
                    }
                    else
                    {
                        extent.ExpandToInclude(feature.GetBoundingBox());
                    }
                    markerOverlay.Features.Add(feature);
                }

                markerOverlay.Features.Add("LA", new Feature(-118.28109, 34.505363));
                markerOverlay.ZoomLevelSet.ZoomLevel01.CustomMarkerStyle = clusterMarkerStyle; 
 
  
 To fetch the number of markers behind the clustered marker, i used the below code in a click event. 
  
 
InMemoryMarkerOverlay markerOverlay = Map1.CustomOverlays["MarkerOverlay"] as InMemoryMarkerOverlay;
            ClusterMarkerStyle cluster = markerOverlay.ZoomLevelSet.ZoomLevel01.CustomMarkerStyle as ClusterMarkerStyle;
            cluster.GetMarkers(markerOverlay.Features);             
 
 
  


KarunaKaran, 



GetMarkers method count the markers in the feature you pass in, if you use the markerOverlay.Features, that means all features in your map. 



Please have a look at the code below, but it still exist a problem that we can't get the right feature contains many markers. 


 protected void Map1_Click(object sender, MapClickedEventArgs e)
        {
            InMemoryMarkerOverlay staticOverlay = (InMemoryMarkerOverlay)Map1.CustomOverlays["MarkerOverlay"];
            staticOverlay.FeatureSource.Open();
            Collection<Feature> selectedFeatures = staticOverlay.FeatureSource.GetFeaturesNearestTo(e.Position, GeographyUnit.DecimalDegree, 1, ReturningColumnsType.AllColumns);
            staticOverlay.FeatureSource.Close();
           
            ClusterMarkerStyle clusterMarkerStyle = new ClusterMarkerStyle();
            clusterMarkerStyle.MarkerStyle = new PointMarkerStyle();
            CloudPopup popup;
            if (Map1.Popups.Count == 0)
            {
                popup = new CloudPopup("Popup", e.Position, string.Empty, 260, 60);
                popup.IsVisible = true;
                Map1.Popups.Add(popup);
            }
            else
            {
                popup = (CloudPopup)Map1.Popups["Popup"];
                popup.Position = e.Position;
            }

            popup.ContentHtml = clusterMarkerStyle.GetMarkers(selectedFeatures).Count.ToString();
        }



I think we can't achieve your requirement just easy use GetMarkers. I will working on this and find a workaround. 



Regards, 



Gary



Hi, 
 On using GetFeaturesNearestTo(…) the number of required features need to defined. But in my case, the numbers of markers are not predicatable. Is there anyway to identify the BoundingBox of the tile that holds the cluster? If so, GetFeaturesInsideBoundingBox(…) can be used to get the number of markers.

KarunaKaran, 
  
 I think you cannot find a fixed collection of marker that is clusted. Because the logic is not what I thought using grid splitting. But they found the distance in range to cluser. So if I click two areas that are very close, there might be a same marker in these two area. So for now we can only buffer the click point with the distance to a circle and do the querying, that’s all. 
  
 Regards, 
  
 Gary

Hi, 
  
 I created an EllipseShape around the point of the clustered marker when clicking on it and i get the numbers of markers within ellipseshape. 
  
  
ClusterMarkerStyle clusterMarkerStyle = new ClusterMarkerStyle(20, 1024, 768);
.
.
.
EllipseShape ellipseShape = new EllipseShape(clickedPosition, radius, Map1.MapUnit, DistanceUnit.Meter);
 
  
 When i zoom in the map and click on clustered marker, the markers count mismatches. It seems that the radius should vary based on the zoomlevel. How to calculate the radius of the Ellipse based on the distanceinpixel for the clustermarkerstyle and the Map.currentscale/zoomlevel. Can you get me some sample code to handle this? 


KarunaKaran, 
  
 Sorry for waiting, I’m working on this and try to find a better way to do. I will post here as soon as I finished it. 
  
 Regards, 
  
 Gary

KarunaKaran, 
  
 Sorry for wait so long. 
  
 in this code: ClusterMarkerStyle clusterMarkerStyle = new ClusterMarkerStyle(20, 1024, 768); the double 20’s unit is pixel not decimal degrees, so every  
  
 time you zoom in the map, the pixel is changing, the way to resolve this is calculate the number using  
  
 ExtentHelper.GetScreenDistanceBetweenTwoWorldPoints method. 
  
 Regards, 
  
 Gary