Markers

Select platform: Android iOS JavaScript

Markers indicate single locations on the map.

By default, markers use a standard icon that has the common Google Maps look and feel. If you want to customize your marker, you can change the color of the default marker, or replace the marker image with a custom icon, or change other properties of the marker.

In response to a click event on a marker, you can open aninfo window.An info window displays text or images in a dialog window above the marker. You can use a default info window to display text, or create your own custom info window to completely control its content.

Adding a marker

To add a marker, create aGMSMarkerobject that includes apositionand title,and set itsmap.

The following example demonstrates how to add a marker to an existing GMSMapViewobject. The marker is created at coordinates10,10,and displays the string "Hello world" in an info window when clicked.

Swift

let position = CLLocationCoordinate2D(latitude: 10, longitude: 10)
let marker = GMSMarker(position: position)
marker.title = "Hello World"
marker.map = mapView

Objective-C

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10);
GMSMarker *marker = [GMSMarker markerWithPosition:position];
marker.title = @ "Hello World";
marker.map = mapView;

You can animate the addition of new markers to the map by setting the marker.appearAnimationproperty to:

  • kGMSMarkerAnimationPopto cause the marker to pop from itsgroundAnchor when added.
  • kGMSMarkerAnimationFadeInto cause the marker to fade in when added.

Removing a marker

You can remove a marker from the map by setting themapproperty of the GMSMarkertonil.Alternatively, you can remove all of the overlays (including markers) currently on the map by calling theGMSMapViewclear method.

Swift

let camera = GMSCameraPosition.camera(
withLatitude: -33.8683,
longitude: 151.2086,
zoom: 6
)
let mapView = GMSMapView.map(withFrame:.zero, camera: camera)
//...
mapView.clear()

Objective-C

GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.8683
longitude:151.2086
zoom:6];
mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
//...
[mapView clear];

If you wish to make modifications to a marker after you've added it to the map, ensure that you keep hold of theGMSMarkerobject. You can modify the marker later by making changes to this object.

Swift

let position = CLLocationCoordinate2D(latitude: 10, longitude: 10)
let marker = GMSMarker(position: position)
marker.map = mapView
//...
marker.map = nil

Objective-C

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10);
GMSMarker *marker = [GMSMarker markerWithPosition:position];
marker.map = mapView;
//...
marker.map = nil;

Changing the marker color

You can customize the color of the default marker image by requesting a tinted version of the default icon withmarkerImageWithColor:,and passing the resulting image to theGMSMarker's icon property.

Swift

marker.icon = GMSMarker.markerImage(with:.black)

Objective-C

marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];

Customizing the marker image

If you want to change the default marker image you can set a custom icon, using the marker'siconoriconViewproperty. IficonViewis set, the API ignores theiconproperty.

Using the marker'siconproperty

The following snippet creates a marker with a custom icon provided as a UIImagein theiconproperty. The icon is centered at London, England. The snippet assumes that your application contains an image named "house.png".

Swift

let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let london = GMSMarker(position: positionLondon)
london.title = "London"
london.icon = UIImage(named: "house" )
london.map = mapView

Objective-C

CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *london = [GMSMarker markerWithPosition:positionLondon];
london.title = @ "London";
london.icon = [UIImage imageNamed:@ "house" ];
london.map = mapView;

If you are creating several markers with the same image, use the same instance ofUIImagefor each of the markers. This helps improve the performance of your application when displaying many markers.

This image may have multiple frames. Additionally, thealignmentRectInsets property is respected, which is useful if a marker has a shadow or other unusable region.

Using the marker'siconViewproperty

The following snippet creates a marker with a custom icon by setting the marker'siconViewproperty, and animates a change in the color of the marker. The snippet assumes that your application contains an image named "house.png".

Swift

import CoreLocation
import GoogleMaps

class MarkerViewController: UIViewController, GMSMapViewDelegate {
var mapView: GMSMapView!
var london: GMSMarker?
var londonView: UIImageView?

override func viewDidLoad() {
super.viewDidLoad()

let camera = GMSCameraPosition.camera(
withLatitude: 51.5,
longitude: -0.127,
zoom: 14
)
let mapView = GMSMapView.map(withFrame:.zero, camera: camera)
view = mapView

mapView.delegate = self

let house = UIImage(named: "House" )!.withRenderingMode(.alwaysTemplate)
let markerView = UIImageView(image: house)
markerView.tintColor =.red
londonView = markerView

let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let marker = GMSMarker(position: position)
marker.title = "London"
marker.iconView = markerView
marker.tracksViewChanges = true
marker.map = mapView
london = marker
}

func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {
UIView.animate(withDuration: 5.0, animations: { () -> Void in
self.londonView?.tintColor =.blue
}, completion: {(finished) in
// Stop tracking view changes to allow CPU to idle.
self.london?.tracksViewChanges = false
})
}
}

Objective-C

@import CoreLocation;
@import GoogleMaps;

@interface MarkerViewController: UIViewController <GMSMapViewDelegate>
@property (strong, nonatomic) GMSMapView *mapView;
@end

@implementation MarkerViewController {
GMSMarker *_london;
UIImageView *_londonView;
}

- (void)viewDidLoad {
[super viewDidLoad];

GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:51.5
longitude:-0.127
zoom:14];
_mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
self.view = _mapView;

_mapView.delegate = self;

UIImage *house = [UIImage imageNamed:@ "House" ];
house = [house imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
_londonView = [[UIImageView alloc] initWithImage:house];
_londonView.tintColor = [UIColor redColor];

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
_london = [GMSMarker markerWithPosition:position];
_london.title = @ "London";
_london.iconView = _londonView;
_london.tracksViewChanges = YES;
_london.map = self.mapView;
}

- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position {
[UIView animateWithDuration:5.0
animations:^{
self->_londonView.tintColor = [UIColor blueColor];
}
completion:^(BOOL finished) {
// Stop tracking view changes to allow CPU to idle.
self->_london.tracksViewChanges = NO;
}];
}

@end

BecauseiconViewaccepts aUIView,you can have a hierarchy of standard UI controls defining your markers, each view having the standard set of animation capabilities. You can include changes to the marker size, color, and alpha levels, as well as applying arbitrary transformations. TheiconViewproperty supports animation of all animatable properties ofUIViewexceptframeand center.

Please note the following considerations when usingiconView:

  • TheUIViewcan be demanding on resources whentracksViewChangesis set toYES,which may result in increased battery usage. In comparison, a single frameUIImageis static and does not need to be re-rendered.
  • Some devices may struggle to render the map if you have many markers on screen, and each marker has its ownUIView,and all markers are tracking changes at the same time.
  • AniconViewdoes not respond to user interaction, as it is a snapshot of the view.
  • The view behaves as ifclipsToBoundsis set toYES,regardless of its actual value. You can apply transforms that work outside the bounds, but the object you draw must be within the bounds of the object. All transforms/shifts are monitored and applied. In short: subviews must be contained within the view.

To decide when to set thetracksViewChangesproperty, you should weigh up performance considerations against the advantages of having the marker redrawn automatically. For example:

  • If you have a series of changes to make, you can change the property to YESthen back toNO.
  • When an animation is running or the contents are being loaded asynchronously, you should keep the property set toYESuntil the actions are complete.

Changing the marker opacity

You can control the opacity of a marker with itsopacityproperty. You should specify the opacity as a float between 0.0 and 1.0, where 0 is fully transparent and 1 is fully opaque.

Swift

marker.opacity = 0.6

Objective-C

marker.opacity = 0.6;

You can animate the marker opacity with [Core Animation]Core AnimationusingGMSMarkerLayer.

Flattening a marker

Marker icons are normally drawn oriented against the device's screen rather than the map's surface, so rotating, tilting or zooming the map does not necessarily change the orientation of the marker.

You can set the orientation of a marker to be flat against the earth. Flat markers rotate when the map is rotated, and change perspective when the map is tilted. As with regular markers, flat markers retain their size when the map is zoomed in or out.

To change the orientation of the marker, set the marker'sflatproperty to YESortrue.

Swift

let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let londonMarker = GMSMarker(position: positionLondon)
londonMarker.isFlat = true
londonMarker.map = mapView

Objective-C

CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *londonMarker = [GMSMarker markerWithPosition:positionLondon];
londonMarker.flat = YES;
londonMarker.map = mapView;

Rotating a marker

You can rotate a marker around its anchor point by setting therotation property. Specify the rotation as aCLLocationDegreestype, measured in degrees clockwise from the default position. When the marker is flat on the map, the default position is North.

The following example rotates the marker 90°. Setting thegroundAnchor property to0.5,0.5causes the marker to be rotated around its center, instead of its base.

Swift

let degrees = 90.0
londonMarker.groundAnchor = CGPoint(x: 0.5, y: 0.5)
londonMarker.rotation = degrees
londonMarker.map = mapView

Objective-C

CLLocationDegrees degrees = 90;
londonMarker.groundAnchor = CGPointMake(0.5, 0.5);
londonMarker.rotation = degrees;
londonMarker.map = mapView;

Handling events on markers

You can listen to events that occur on the map, such as when a user taps a marker. To listen to events, you must implement the GMSMapViewDelegateprotocol. Seemarker events and gesturesto learn how to handle specific marker events. Theguide to eventsalso provides a list of methods on GMSMapViewDelegate. For Street View events, see GMSPanoramaViewDelegate.