By default, points of interest (POIs) appear on the base map along with their
corresponding icons. POIs include parks, schools, government buildings, and
more. In addition, business POIs appear by default on the map when the map
type is kGMSTypeNormal
. Business POIs represent businesses such as shops,
restaurants, hotels, and more.
A POI corresponds to a place, as defined in the Google Places API. For example, recreational parks are POIs, but things like water fountains are generally not POIs (unless they're of national or historic significance).
Listen for click events on POIs
If you want to respond to a user tapping on a POI, implement GMSMapViewDelegate
, and implement the
mapView(_:didTapPOIWithPlaceID:name:location:)
method, as shown in the following example:
Swift
import UIKit
import GoogleMaps
class ViewController: UIViewController, GMSMapViewDelegate {
...
override func loadView() {
let camera = GMSCameraPosition.camera(withLatitude: 47.603,
longitude:-122.331,
zoom:14)
let mapView = GMSMapView.map(withFrame: .zero, camera: camera)
mapView.delegate = self
self.view = mapView
}
func mapView(_ mapView: GMSMapView, didTapPOIWithPlaceID placeID: String,
name: String, location: CLLocationCoordinate2D) {
print("You tapped \(name): \(placeID), \(location.latitude)/\(location.longitude)")
}
}
Objective-C
#import "ViewController.h"
#import <GoogleMaps/GoogleMaps.h>
@interface ViewController ()
@end
@implementation ViewController
...
- (void)loadView {
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:47.603
longitude:-122.331
zoom:14];
GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
mapView.delegate = self;
self.view = mapView;
}
#pragma mark - GMSMapViewDelegate
- (void)mapView:(GMSMapView *)mapView
didTapPOIWithPlaceID:(NSString *)placeID
name:(NSString *)name
location:(CLLocationCoordinate2D)location {
NSLog(@"You tapped %@: %@, %f/%f", name, placeID, location.latitude, location.longitude);
}
@end
For the preceding example it is assumed that you have implemented the
GMSMapViewDelegate
protocol in the header for your view controller. For more
information, see Events.
Show details in an info window
POIs appear on the map by default, but there is no default on-click UI (the API does not automatically display an info window or any other user interface when the user taps a POI). The following example shows how to use a marker to display an info window for a POI:
Swift
// Declare GMSMarker instance at the class level.
let infoMarker = GMSMarker()
// Attach an info window to the POI using the GMSMarker.
func mapView(_ mapView: GMSMapView, didTapPOIWithPlaceID placeID: String,
name: String, location: CLLocationCoordinate2D) {
infoMarker.snippet = placeID
infoMarker.position = location
infoMarker.title = name
infoMarker.opacity = 0;
infoMarker.infoWindowAnchor.y = 1
infoMarker.map = mapView
mapView.selectedMarker = infoMarker
}
Objective-C
// Declare a GMSMarker instance at the class level.
GMSMarker *infoMarker;
// Attach an info window to the POI using the GMSMarker.
- (void)mapView:(GMSMapView *)mapView
didTapPOIWithPlaceID:(NSString *)placeID
name:(NSString *)name
location:(CLLocationCoordinate2D)location {
infoMarker = [GMSMarker markerWithPosition:location];
infoMarker.snippet = placeID;
infoMarker.title = name;
infoMarker.opacity = 0;
CGPoint pos = infoMarker.infoWindowAnchor;
pos.y = 1;
infoMarker.infoWindowAnchor = pos;
infoMarker.map = mapView;
mapView.selectedMarker = infoMarker;
}
Stop POIs from showing on the map
You can hide points of interest (POIs) by applying custom styles to all POIs or to specific categories of POIs.
The following JSON style declaration hides all business POIs on the map:
[
{
"featureType": "poi.business",
"stylers": [
{ "visibility": "off" }
]
}
]
As another example, the following JSON simplifies the display of all categories of POIs:
[
{
"featureType": "poi",
"stylers": [
{ "visibility": "simplified" }
]
}
]
For more details, see the guide to hiding map features with styling.