How to get city name through CLlocationManager using latitude and longitude in iOS?

I try to get the address through CLLocationManager using latitude and longitude, but it only returns the state and country name, I want the city too, I attach my code, can someone tell me how I can change my code to get the name cities .Below - my code

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { currentLocation = [locations objectAtIndex:0]; CLGeocoder *geocoder1 = [[CLGeocoder alloc] init]; NSLog(@"Detected Location : %f, %f", currentLocation.coordinate.latitude, currentLocation.coordinate.longitude); //CLLocation *newLocation = [[CLLocation alloc]initWithLatitude:26.9260 longitude:75.8235]; CLLocation *newLocation = [[CLLocation alloc]initWithLatitude:currentLocation.coordinate.latitude longitude:currentLocation.coordinate.longitude]; [geocoder1 reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) { if (error) { NSLog(@"Geocode failed with error: %@", error); return; } if (placemarks && placemarks.count > 0) { CLPlacemark *placemark = placemarks[0]; NSDictionary *addressDictionary = placemark.addressDictionary; NSLog(@"%@ ", addressDictionary); NSString *address = [addressDictionary objectForKey:(NSString *)kABPersonAddressStreetKey]; NSString *city = [addressDictionary objectForKey:(NSString *)kABPersonAddressCityKey]; NSString *state = [addressDictionary objectForKey:(NSString *)kABPersonAddressStateKey]; NSString *zip = [addressDictionary objectForKey:(NSString *)kABPersonAddressZIPKey]; NSLog(@"%@ %@ %@ %@", address,city, state, zip); } }]; } 
+6
source share
3 answers

Try it.

 -(NSString*)getAddressFromLatLong : (NSString *)latLng { // NSString *string = [[Address.text stringByAppendingFormat:@"+%@",cityTxt.text] stringByAppendingFormat:@"+%@",addressText]; NSString *esc_addr = [latLng stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *req = [NSString stringWithFormat:@"http://maps.google.com/maps/api/geocode/json?sensor=false&address=%@", esc_addr]; NSString *result = [NSString stringWithContentsOfURL:[NSURL URLWithString:req] encoding:NSUTF8StringEncoding error:NULL]; NSMutableDictionary *data = [NSJSONSerialization JSONObjectWithData:[result dataUsingEncoding:NSUTF8StringEncoding]options:NSJSONReadingMutableContainers error:nil]; NSMutableArray *dataArray = (NSMutableArray *)[data valueForKey:@"results" ]; if (dataArray.count == 0) { UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error" message:@"Please Enter a valid address" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; [alert show]; }else{ for (id firstTime in dataArray) { NSString *jsonStr1 = [firstTime valueForKey:@"formatted_address"]; return jsonStr1; } } return nil; } 

Give a comma, a distant latitude longitude .. and try to make it work fine

Link Link Get address from longitude latitude using Apple function in iOS and iPad

+7
source

You are using k-constants from the ABPerson class from the AddressBook structure for CLGeocoder object keys. Although some may be the same, I am sure that others will not.

You can try...

 NSMutableArray *addrArray = [[NSMutableArray alloc] init]; //to return address line(s) addrArray = [NSMutableArray arrayWithArray: [p.addressDictionary objectForKey:@"FormattedAddressLines"]]; [addrArray removeLastObject]; //country name NSString *addressString = [addrArray componentsJoinedByString:@" ,"]; #if DEBUG NSLog(@"Address: %@", addressString); #endif 
0
source

We will get the Full Address based on latitude and longitude. Here is a sample code.

  - (void) getAddressFromLatLon:(CLLocation *)location { CLGeocoder *geocoder = [[CLGeocoder alloc] init] ; [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *array, NSError *error){ if (error){ NSLog(@"Geocode failed with error: %@", error); return; } CLPlacemark *placemark = [array objectAtIndex:0]; NSLog(@"City %@",placemark.subAdministrativeArea); NSLog(@"State %@",placemark.administrativeArea); }]; } 

Below I mentioned different types. This can easily be verified. All of them relate to objects of the CLPlacemark class. This class may be available on CoreLocation .

 @property (nonatomic, readonly, copy, nullable) NSString *name; // eg. Apple Inc. @property (nonatomic, readonly, copy, nullable) NSString *thoroughfare; // street name, eg. Infinite Loop @property (nonatomic, readonly, copy, nullable) NSString *subThoroughfare; // eg. 1 @property (nonatomic, readonly, copy, nullable) NSString *locality; // city, eg. Cupertino @property (nonatomic, readonly, copy, nullable) NSString *subLocality // neighborhood, common name, eg. Mission District @property (nonatomic, readonly, copy, nullable) NSString *administrativeArea; // state, eg. CA @property (nonatomic, readonly, copy, nullable) NSString *subAdministrativeArea; // City, eg. Santa Clara @property (nonatomic, readonly, copy, nullable) NSString *postalCode; // zip code, eg. 95014 @property (nonatomic, readonly, copy, nullable) NSString *ISOcountryCode; // eg. US @property (nonatomic, readonly, copy, nullable) NSString *country; // eg. United States @property (nonatomic, readonly, copy, nullable) NSString *inlandWater; // eg. Lake Tahoe @property (nonatomic, readonly, copy, nullable) NSString *ocean; // eg. Pacific Ocean @property (nonatomic, readonly, copy, nullable) NSArray<NSString *> *areasOfInterest; 

Whatever you want, just add it and get the result. Here's a link .

0
source

Source: https://habr.com/ru/post/972651/


All Articles