如何在IOS中使用经度和经度通过CLlocationManager获取城市名称?

时间:2014-07-22 13:20:08

标签: ios cllocationmanager city

我试图通过CLLocationManager使用纬度和经度来获取地址,但它只返回州和国家名称,我也想要城市,我附加我的代码可以任何人告诉我,我怎么能改变我的代码以获得城市名称.Below是我的代码

- (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);
                       }

                   }];
}

3 个答案:

答案 0 :(得分:7)

试试这个..

-(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;
}

发送逗号分隔的纬度经度..并试试它工作正常

参考链接Get Address From Latitude Longitude using Apple Function in iOS & iPad

答案 1 :(得分:0)

您正在使用来自AddressBook框架的ABPerson类的k-constants来获取CLGeocoder对象键。虽然有些人可能会匹配,但我很确定其他人不会。

你可以试试......

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

答案 2 :(得分:0)

我们将根据纬度和经度获得完整的地址。这是示例代码。

 - (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);

     }];
 }

在下面我提到了不同的类型。很容易就可以查看它们。这些都属于 CLPlacemark 类对象。这个类可以在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;

你想要的只是添加它并得到结果。这里是参考link