Lokesh Chowdary Lokesh Chowdary - 10 months ago 301
Objective-C Question

customize marker icon in marker clustering in iOS

Is there any way to change default marker icon in marker clustering?

Here is my code...

- (void)viewDidLoad {
[super viewDidLoad];

// Set up the cluster manager with a supplied icon generator and renderer.
id<GMUClusterAlgorithm> algorithm = [[GMUNonHierarchicalDistanceBasedAlgorithm alloc] init];
id<GMUClusterIconGenerator> iconGenerator = [[GMUDefaultClusterIconGenerator alloc] init];
id<GMUClusterRenderer> renderer = [[GMUDefaultClusterRenderer alloc] initWithMapView:googleMapView
clusterManager = [[GMUClusterManager alloc] initWithMap:googleMapView

// Register self to listen to both GMUClusterManagerDelegate and
// GMSMapViewDelegate events.
[clusterManager setDelegate:self mapDelegate:self];


- (void)loadView {
// Create a GMSCameraPosition that tells the map to display the
_camera = [GMSCameraPosition cameraWithLatitude:29.3117
googleMapView = [GMSMapView mapWithFrame:CGRectZero camera:_camera];
googleMapView.myLocationEnabled = YES;
googleMapView.settings.compassButton = YES;
googleMapView.settings.myLocationButton = YES;
googleMapView.delegate = self;

self.view = googleMapView;

-(void)setLocation:(CLLocation *)location
CLLocationCoordinate2D center = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude);
[googleMapView animateToLocation:center];
[googleMapView animateToZoom:12];

NSMutableArray *array = [NSMutableArray arrayWithObjects:
@"29.348706, 48.092425",
@"29.340925, 48.088477",
@"29.324912, 48.089850",
@"29.330599, 47.990630",
@"29.300364, 47.960589",
@"29.271917, 47.918017",
@"29.3032,47.936", nil];

//remove all clusters before adding clusters
[clusterManager clearItems];

for (int i = 0; i < [array count]; i++)
center = CLLocationCoordinate2DMake ([[array[i] componentsSeparatedByString:@","][0] floatValue], [[array[i] componentsSeparatedByString:@","][1] floatValue]);

// Add items to the cluster manager.
NSString *name = nil;//[NSString stringWithFormat:@"Item %d", i];
id<GMUClusterItem> item =[[POIItem alloc] initWithPosition:center
[clusterManager addItem:item];
// Call cluster() after items have been added
// to perform the clustering and rendering on map.
[clusterManager cluster];

Please guide me...

Answer Source

I see that you used google-maps-ios-utils. The problem is that there is no API for change marker's icon yet. You can only do it directly in the code of the library. I've pasted my custom code inside the method

- (GMSMarker *)markerWithPosition:(CLLocationCoordinate2D)position
                  clusterIcon:(UIImage *)clusterIcon
    if (clusterIcon != nil) {
        marker.icon = clusterIcon;
        marker.groundAnchor = CGPointMake(0.5, 0.5);
    } else {
    if([[marker.userData class] isSubclassOfClass:[POIItem class]]){
        POIItem *item = (POIItem *)marker.userData;
        MarkerIcon* markerView = (MarkerIcon *)[[NSBundle mainBundle] loadNibNamed:@"MarkerIcon" owner:marker options:nil][0];
        marker.iconView = markerView;
        marker.groundAnchor = CGPointMake(0.5, 0.5);

It is not a good way to change the code like this. But I could not find better solution for that moment.