6

我正在尝试使用纬度和经度通过 CLLocationManager 获取地址,但它只返回州和国家/地区名称,我也想要城市,我正在附上我的代码,任何人都可以告诉我如何更改我的代码以获取城市名称。下面是我的代码

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

                   }];
}
4

3 回答 3

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

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

参考链接在 iOS 和 iPad 中使用 Apple 函数从纬度经度获取地址

于 2014-07-22T13:23:37.163 回答
0

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

你可以试试 ...

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
于 2014-07-22T16:57:21.510 回答
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;

您想要什么,只需添加它并获得结果。这里是参考链接

于 2016-03-23T12:42:09.417 回答