Search code examples
iosobjective-cgoogle-mapsmarkerclusterer

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
                                                                    clusterIconGenerator:iconGenerator];
    clusterManager = [[GMUClusterManager alloc] initWithMap:googleMapView
                                                  algorithm:algorithm
                                                   renderer:renderer];

    // 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
                                          longitude:47.4818
                                               zoom:8];
    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.0827,48.1363",
                             @"29.2679,47.9927",
                             @"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
                                                              name:name];
        [clusterManager addItem:item];
    }
    // Call cluster() after items have been added
    // to perform the clustering and rendering on map.
    [clusterManager cluster];
}

Please guide me...


Solution

  • 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
                             from:(CLLocationCoordinate2D)from
                         userData:(id)userData
                      clusterIcon:(UIImage *)clusterIcon
                         animated:(BOOL)animated{
    //...
        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.