如何从核心位置返回的位置检索地址
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 更好的方法?返回的位置错误