標籤:style blog class code java c
上節我們通過定位擷取了經度和緯度數值,但是一般人很難看懂這些數字。
地理資訊反編碼:就是根據這些經緯數字返回地點的相關文字描述資訊,這些文字描述資訊被封裝在CLPlacemark類中,我們稱這個類為“地標”類。
地理資訊反編碼使用CLGeocoder類實現,這個類能夠實現在地理座標與地理文字描述資訊之間的轉換。
CLGeocoder類中進行地理資訊反編碼的方法是:reverseGeocodeLocation: completionHandler:
location:是要定位的地理位置對象
completionHandler:指定了一個代碼塊,用於地理位置反編碼之後的回調。
-(IBAction)reverseGeocode:(id)sender{ CLGeocoder *geoCoder = [[CLGeocoder alloc] init]; [geoCoder reverseGeocodeLocation:_currLocation completionHandler:^(NSArray *placemarks, NSError *error) { //得到的數組placemarks就是CLPlacemark對象數組,這裡只取第一個就行 CLPlacemark *mark = nil; if([placemarks count] > 0){ id tempMark = [placemarks objectAtIndex:0]; if([tempMark isKindOfClass:[CLPlacemark class]]) { mark = tempMark; } //具體商務邏輯,CLPlacemark的屬性有很多,包括了街道名等相關屬性 NSDictionary *addressDict = mark.addressDictionary; NSString *address = [addressDict objectForKey:(NSString)kABPersonAddressStreetKey]; address = address == nil ? @"" : address; NSString *state = [addressDict objectForKey:(NSString)kABPersonAddressStateKey]; state = state == nil ? @"" : state; NSString *city = [addressDict objectForKey:(NSString)kABPersonAddressCityKey]; city = city == nil ? @"" : city; // 擷取地標對應的可讀的文字資訊,一般返回到UI顯示 NSString *streetInfo = [NSString stringWithFormat:@"%@\n%@\n%@\n",state,address,city]; } }];}
【說明】:
_currLocation是CLLocation類型的成員變數,是在委託方法locationManager:didUpdateLocations:中獲得的。
completionHandler:^(NSArray *plackmrks , NSError *error)參數placemarks是反編碼成功的地標集合。如果使用者要查看所有的地標資訊,需要迴圈遍曆。
下面這些鍵是在AddressBook架構中定義的常量,需要引入AddressBook.framework架構:
kABPersonAddressStreetKey鍵:可以從字典中取出地標的街道資訊
kABPersonAddressStateKey鍵:可以從字典中取出地標所在的州、省等資訊
kABPersonAddressCityKey鍵:可以從字典中取出地標所在的城市等資訊