iOS - GeoCoder 地理編碼

weixin_33858249發表於2016-09-12

前言

    NS_CLASS_AVAILABLE(10_8, 5_0)
    @interface CLGeocoder : NSObject
  • 地理編碼

    • 地名 -> 經緯度 等具體位置資料資訊。根據給定的位置(通常是地名)確定地理座標(經、緯度)。
  • 反地理編碼

    • 經緯度 -> 地名。可以根據地理座標(經、緯度)確定位置資訊(街道、門牌等)。

1、GeoCoder 地理編碼

  • 配置

        // 包含標頭檔案
        #import <CoreLocation/CoreLocation.h>
  • 地理編碼

        // 宣告 CLGeocoder 物件
        @property (nonatomic, strong) CLGeocoder *geocoder;
    
        // 例項化 CLGeocoder 物件
        self.geocoder = [[CLGeocoder alloc] init];
    
        // 開始編碼
        [self.geocoder geocodeAddressString:self.addressField.text 
                          completionHandler:^(NSArray *placemarks, NSError *error) {
    
            // 判斷編碼是否成功
            if (error || 0 == placemarks.count) {
    
                NSLog(@"erroe = %@, placemarks.count = %ld", error, placemarks.count);
                self.detailAddressLabel.text = @"你輸入的地址找不到,可能在火星上";
    
            } else {  // 編碼成功(找到了具體的位置資訊)
    
                // 輸出查詢到的所有地標資訊
                for (CLPlacemark *placemark in placemarks) {
    
                    NSLog(@"name = %@, locality = %@, country = %@", placemark.name, placemark.locality, placemark.country);
                }
    
                // 顯示最前面的地標資訊
                CLPlacemark *firstPlacemark = [placemarks firstObject];
    
                self.longitudeLabel.text = [NSString stringWithFormat:@"%.2f", firstPlacemark.location.coordinate.longitude];
                self.latitudeLabel.text = [NSString stringWithFormat:@"%.2f", firstPlacemark.location.coordinate.latitude];
    
                self.detailAddressLabel.text = [NSString stringWithFormat:@"%@,%@,%@", firstPlacemark.name, firstPlacemark.locality, firstPlacemark.country];
            }
        }];
  • 反地理編碼

        // 宣告 CLGeocoder 物件
        @property (nonatomic, strong)CLGeocoder *geocoder;
    
        // 例項化 CLGeocoder 物件
        self.geocoder = [[CLGeocoder alloc] init];
    
        // 建立 CLLocation 物件
        CLLocation *location = [[CLLocation alloc] initWithLatitude:[self.latitudeField.text doubleValue] 
                                                          longitude:[self.longtitudeField.text doubleValue]];
    
        // 開始反編碼
        [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
    
            // 判斷反編碼是否成功
            if (error || 0 == placemarks.count) {
    
                NSLog(@"erroe = %@, placemarks.count = %ld", error, placemarks.count);
                self.reverseDetailAddressLabel.text = @"你輸入的經緯度找不到,可能在火星上";
    
            } else {  // 反編碼成功(找到了具體的位置資訊)
    
                // 輸出查詢到的所有地標資訊
                for (CLPlacemark *placemark in placemarks) {
    
                    NSLog(@"name=%@, locality=%@, country=%@", placemark.name, placemark.locality, placemark.country);
                }
    
                // 顯示最前面的地標資訊
                CLPlacemark *firstPlacemark = [placemarks firstObject];
    
                self.longtitudeField.text = [NSString stringWithFormat:@"%.2f", firstPlacemark.location.coordinate.longitude];
                self.latitudeField.text = [NSString stringWithFormat:@"%.2f", firstPlacemark.location.coordinate.latitude];
    
                self.reverseDetailAddressLabel.text = [NSString stringWithFormat:@"%@,%@,%@", firstPlacemark.name, firstPlacemark.locality, firstPlacemark.country];
            }
        }];
        地理編碼資訊:
    
            placemark.name,                                                    // 地名
            placemark.thoroughfare,                                            // 街道
            placemark.subThoroughfare,                                         // 街道相關資訊,例如門牌等
            placemark.locality,                                                // 城市
            placemark.subLocality,                                             // 城市相關資訊,例如標誌性建築
            placemark.administrativeArea,                                      // 州
            placemark.subAdministrativeArea,                                   // 其他行政區域資訊
            placemark.postalCode,                                              // 郵編
            placemark.ISOcountryCode,                                          // 國家編碼
            placemark.country,                                                 // 國家
            placemark.inlandWater,                                             // 水源、湖泊
            placemark.ocean,                                                   // 海洋
            placemark.areasOfInterest                                          // 關聯的或利益相關的地標
    
            placemark.addressDictionary[@"City"]];                             // 城市
            placemark.addressDictionary[@"Country"]];                          // 國家
            placemark.addressDictionary[@"CountryCode"]];                      // 國家編碼
            placemark.addressDictionary[@"FormattedAddressLines"][0]];         // 街道
            placemark.addressDictionary[@"Name"]];                             // 地名
            placemark.addressDictionary[@"State"]];                            // 州
            placemark.addressDictionary[@"SubLocality"]];                      // 城市相關資訊

相關文章