Skip to content

Forward Geocode in iOS with CLGeocoder

Screen Shot 2014-01-07 at 4.16.22 PMSimilar to the post about reverse geocoding, the forward geocoded uses CLGeocoder.

I wrote a quick static method that takes an address string (e.g., “4700 Louisiana 22 #1, Mandeville, LA 70471”) and a completion handler. All this method does is create the CLGeocoder for you and make the call.

It’s mostly just a way to keep the code contained…

+(void)forwardGeocode:(NSString*)addressString 
  completionHandler:(void (^)(NSArray *placemarks, NSError *error))completionHandler;
{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:addressString 
      completionHandler:completionHandler];
}

If you’re going to call this a lot, you can make the geocoder a static variable so it’s not created each time.

So to call this method, assuming it’s in a class called Constants, you’d call it w/ the address and a completion handler…

-(void)forwardGeocode:(NSString*)addressString;
{
    addrPlacemark = nil;
    [Constants forwardGeocode:addressString 
      completionHandler:^(NSArray *placemarks, NSError *error) {
        if (error)
            NSLog(@"Geocode error: %@", error);
        else if (placemarks.count > 0)
        {
            addrPlacemark = [placemarks firstObject];
            NSLog(@"fwd geocode: %f %f", 
              addrPlacemark.location.coordinate.latitude, 
              addrPlacemark.location.coordinate.longitude);
        }
    }];
}

I’m using addrPlacemark as an instance variable to store the value. I nil it out to start and then call our help method above passing in the address string and completion handler.

I handle the error OR get the first object and log out the lat/lng.

If you used the code from the reverse geocoding post, you could send in the result of the reverse geocoding into this method and test a round trip.