Dinesh
Dinesh

Reputation: 104

Reverse Geocoding using google maps api iOS

I am doing reverse geocoding using following code

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {   
    curLoc=newLocation;
    if (curLoc != nil) {
        latitude=curLoc.coordinate.latitude;
        longitude=curLoc.coordinate.longitude;
        //[self loadMap:latitude second:longitude];
        [self MarkerPoint:latitude+0.04 second:longitude+0.1 third:latitude-0.04 forth:longitude-0.1];

        NSError *error;
        NSString *lookupString = [NSURL URLWithString:[NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=false",latitude,longitude]];
        NSLog(@"URL: %@",lookupString);
        lookupString = [lookupString stringByReplacingOccurrencesOfString:@" " withString:@"+"];

        NSData *jsonResponse = [NSData dataWithContentsOfURL:[NSURL URLWithString:lookupString]];

        NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonResponse options:kNilOptions error:&error];

        self.locationArray = [[jsonDict valueForKey:@"results"] valueForKey:@"formatted_address"];
        int total = self.locationArray.count;
        NSLog(@"locationArray count: %d", self.locationArray.count);

        for (int i = 0; i < total; i++)
        {
            NSString *statusString = [jsonDict valueForKey:@"status"];
            NSLog(@"JSON Response Status:%@", statusString);
            NSLog(@"Address: %@", [self.locationArray objectAtIndex:i]);
        }
    }
}    

now I am getting this error :

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSURL stringByReplacingOccurrencesOfString:withString:]: unrecognized selector sent to instance 0xbce98c0'
*** First throw call stack:
(
    0   CoreFoundation                      0x034551e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x031a98e5 objc_exception_throw + 44
    2   CoreFoundation                      0x034f2243 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
    3   CoreFoundation                      0x0344550b ___forwarding___ + 1019
    4   CoreFoundation                      0x034450ee _CF_forwarding_prep_0 + 14
    5   MatchPoint                          0x00017fad -[ICSViewController locationManager:didUpdateToLocation:fromLocation:] + 813
    6   CoreLocation                        0x0164655e CLLocationCoordinate2DGetDistanceFrom + 18294
    7   CoreLocation                        0x01645af4 CLLocationCoordinate2DGetDistanceFrom + 15628
    8   CoreLocation                        0x01642e40 CLLocationCoordinate2DGetDistanceFrom + 4184
    9   CoreLocation                        0x0163c680 CLClientInvalidate + 996
    10  CoreFoundation                      0x034140b0 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 16
    11  CoreFoundation                      0x033dd339 __CFRunLoopDoBlocks + 361
    12  CoreFoundation                      0x033fb753 __CFRunLoopRun + 2355
    13  CoreFoundation                      0x033fa9d3 CFRunLoopRunSpecific + 467
    14  CoreFoundation                      0x033fa7eb CFRunLoopRunInMode + 123
    15  GraphicsServices                    0x051f05ee GSEventRunModal + 192
    16  GraphicsServices                    0x051f042b GSEventRun + 104
    17  UIKit                               0x01e69f9b UIApplicationMain + 1225
    18  MatchPoint                          0x0001d9fd main + 141
    19  libdyld.dylib                       0x03d206d9 start + 1
    20  ???                                 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

Upvotes: 7

Views: 6291

Answers (4)

amar
amar

Reputation: 185

Pass your lattitude and longitude It will give you correct address...

[[GMSGeocoder geocoder] reverseGeocodeCoordinate:CLLocationCoordinate2DMake(coordinate.latitude, coordinate.longitude) completionHandler:^(GMSReverseGeocodeResponse* response, NSError* error) {
            NSLog(@"reverse geocoding results:");
           for(GMSAddress* addressObj in [response results])
            {
                NSLog(@"%@",[response results]);

                NSLog(@"coordinate.latitude=%f", addressObj.coordinate.latitude);
                NSLog(@"coordinate.longitude=%f", addressObj.coordinate.longitude);
                NSLog(@"thoroughfare=%@", addressObj.thoroughfare);
                NSLog(@"locality=%@", addressObj.locality);
                NSLog(@"subLocality=%@", addressObj.subLocality);
                NSLog(@"administrativeArea=%@", addressObj.administrativeArea);
                NSLog(@"postalCode=%@", addressObj.postalCode);
                NSLog(@"country=%@", addressObj.country);
                NSLog(@"lines=%@", addressObj.lines);
            }
        }];

Upvotes: 5

sig
sig

Reputation: 6054

Firstly, locationManager: didUpdateToLocation: fromLocation: is deprecated in iOS 6 and above. I would recommend you to replace this method with the new one: locationManager: didUpdateLocations: and to use GMSGeocoder reverseGeocodeCoordinate: completionHandler: for retrieving address from 2D-coordinate.

My solution based on using GMSGeocoder:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.activityType = CLActivityTypeFitness;
self.locationManager.distanceFilter = kCLDistanceFilterNone;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.pausesLocationUpdatesAutomatically = NO;
[self.locationManager requestWhenInUseAuthorization];// iOS 8 requirement
[self.locationManager requestAlwaysAuthorization];// iOS 8 requirement

self.locateOnCurrentPosition = YES; // Flag for changing camera once you really needed
[self.locationManager startUpdatingLocation];

#pragma mark - CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    if (self.locateOnCurrentPosition) {
        NSLog(@"CLLocationManager didUpdateLocations: %@", [locations lastObject]);
        self.locateOnCurrentPosition = NO;
        CLLocation *location = [locations lastObject];
        self.mapView.camera = [GMSCameraPosition cameraWithTarget:location.coordinate zoom:16]; // GMSMapView entity
        self.mapMarker.position = self.mapView.camera.target; // GMSMarker entity
        [[GMSGeocoder geocoder] reverseGeocodeCoordinate:location.coordinate completionHandler:
        ^(GMSReverseGeocodeResponse *response, NSError *error){
            NSLog(@"Address: %@", response.firstResult);
        }];
    }
}

Upvotes: 0

Nischal Hada
Nischal Hada

Reputation: 3288

Provide valid latitude and longitude static and check it first. After you got success then only use dynamic latitude and longitude

-(void)getGoogleAdrressFromLatLong : (CGFloat)lat lon:(CGFloat)lon{
    //[self showLoadingView:@"Loading.."];
    NSError *error = nil;

    NSString *lookUpString  = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&amp;sensor=false", lat,lon];

    lookUpString = [lookUpString stringByReplacingOccurrencesOfString:@" " withString:@"+"];

    NSData *jsonResponse = [NSData dataWithContentsOfURL:[NSURL URLWithString:lookUpString]];

    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonResponse options:kNilOptions error:&error];

   // NSLog(@"%@",jsonDict);

    NSArray* jsonResults = [jsonDict objectForKey:@"results"];

   // NSLog(@"%@",jsonResults);

}

Upvotes: 3

John Russel Usi
John Russel Usi

Reputation: 453

Try changing this line

NSString *lookupString = [NSURL URLWithString:[NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=false",latitude,longitude]];

with

NSString *lookupString = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=false",latitude,longitude];

Upvotes: 3

Related Questions