Search code examples
iosgoogle-mapsgoogle-maps-api-3google-maps-sdk-ios

Geo-Fencing using Google Map in iPhone


I am trying to Geo-fence using Google Map for iPhone app. A lot of tutorials can be found for MKMapView. But can't find for the GMSMapView. The basic thing is how to convert the screen coordinate (x,y) to the MapCoordinate lat/lng. Is there any API available for Google Map in iOS for that conversion? Thanks


Solution

  • You can use something like this:

    GMSMapView* mapView = ...;
    CGPoint point = ...;
    ...
    CLLocationCoordinate2D coordinate = 
        [mapView.projection coordinateForPoint: point];
    

    UPDATE:

    The comments on the projection property in GMSMapView.h are:

    /**
     * The GMSProjection currently used by this GMSMapView. This is a snapshot of
     * the current projection, and will not automatically update when the camera
     * moves. The projection may be nil while the render is not running (if the map
     * is not yet part of your UI, or is part of a hidden UIViewController, or you
     * have called stopRendering).
     */
    @property (nonatomic, readonly) GMSProjection *projection;
    

    Therefore you can only access the .projection property after the map has rendered. It will be nil if you try to access it during loadView or viewDidLoad.

    I don't know if there is a better way to tell if the map has been rendered, but I noticed that the mapView:didChangeCameraPosition: method is called once after the map view is first displayed, and that the map's projection property is valid there.

    So, in your view controller's header, add GMSMapViewDelegate:

    @interface ViewController : UIViewController <GMSMapViewDelegate>
    

    When you allocate the map view, assign the delegate:

    _map = [GMSMapView mapWithFrame: CGRectMake(0, 0, width, height) camera: camera]; 
    _map.delegate = self;
    [self.view addSubview: _map];
    

    Then add the delegate method:

    - (void)mapView: (GMSMapView*)mapView
        didChangeCameraPosition: (GMSCameraPosition*)position
    {
        CGPoint point = CGPointMake(x, y); 
        CLLocationCoordinate2D coordinate = 
            [_map.projection coordinateForPoint: point];
    }
    

    Note that mapView:didChangeCameraPosition: is called every time the user changes the camera, so you'd probably need to use a flag, so that you only do your calculations the first time mapView:didChangeCameraPosition: is called.