如何从核心位置返回的位置检索地址

Posted

技术标签:

【中文标题】如何从核心位置返回的位置检索地址【英文标题】:How to retrieve the address from a location returned by Core Location 【发布时间】:2012-02-17 09:33:45 【问题描述】:

有没有办法将经度/纬度位置(由核心位置返回)转换为地址(街道和城市)?

【问题讨论】:

How to reverse geocode? 的可能重复项 【参考方案1】:

最好的方法是使用反向地理编码,它在CLGeocoder 类中可用。要从地理位置获取人类可读的地址,您必须使用reverseGeocodeLocation 方法。

这里是小样本:

-(NSString *)getAddressFromLocation:(CLLocation *)location 
    NSString *address;
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error)
     
         if(placemarks && placemarks.count > 0)
         
             CLPlacemark *placemark= [placemarks objectAtIndex:0];

             address = [NSString stringWithFormat:@"%@ %@,%@ %@", [placemark subThoroughfare],[placemark thoroughfare],[placemark locality], [placemark administrativeArea]];

             NSLog(@"%@",address);
         

     ];

    [geocoder release];
    return address;

【讨论】:

这会返回一个无效的 CFStringRef。有想法该怎么解决这个吗?谢谢!! 我得到“将块内的变量分配给块外的变量”错误,但我可以通过这样做来修复它,“__block NSString *address;” 为什么不使用完成而不是块变量?【参考方案2】:

使用闭包的粗略 Swift 3 实现:

import CoreLocation

func getAddressFrom(location: CLLocation, completion:@escaping ((String?) -> Void)) 
    let geocoder = CLGeocoder()
    geocoder.reverseGeocodeLocation(location)  (placemarks, error) in
        if let placemark = placemarks?.first,
            let subThoroughfare = placemark.subThoroughfare,
            let thoroughfare = placemark.thoroughfare,
            let locality = placemark.locality,
            let administrativeArea = placemark.administrativeArea 
            let address = subThoroughfare + " " + thoroughfare + ", " + locality + " " + administrativeArea

            placemark.addressDictionary

            return completion(address)

        
        completion(nil)
    

用法:

getAddressFrom(location: location)  (address) in
    print(address)

您还可以查看placemark.addressDictionary,它是包含地址簿键和地标值的字典。这些键在通讯簿框架中定义。

【讨论】:

以上是关于如何从核心位置返回的位置检索地址的主要内容,如果未能解决你的问题,请参考以下文章

检索核心位置的授权状态

从 Firebase 为每个特定帖子检索特定数据的比 datasnapshot 更好的方法?返回的位置错误

使用 MKMapView、核心位置和核心数据

如何从 SQLite 数据库中的用户位置检索特定范围内的一组位置

如何通过 SMS 检索 GPS 位置

如何从 GeoFire 中检索持续更新的位置数据并将其放在 Google 地图上?