Reputation: 104
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
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
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
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&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
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