Bryanyan
Bryanyan

Reputation: 677

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

Upvotes: 3

Views: 4155

Answers (2)

Utkarsh Goel
Utkarsh Goel

Reputation: 245

No need to convert x,y to lat,long.

GMSCircle *fence = [GMSCircle circleWithPosition:locationCord radius:fenceRadius];
    [fence setFillColor:[UIColor colorWithRed:102.0/255 green:178.0/255 blue:255.0/255 alpha:0.3]];
    [fence setZIndex:100];

    [fence setMap: _map];

Add this code when you are making GMSMapView and geo fence will be shown with your location marker.

Upvotes: 0

Saxon Druce
Saxon Druce

Reputation: 17624

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.

Upvotes: 2

Related Questions