iOS地圖解析經緯度過程

最近學習iOS地圖比較多,所以做筆記記錄一下,作為總結

對于地圖和定位,蘋果公司提供給了兩個框架:
MapKit:用于地圖展示
Core Location :用于地理定位

首先我們把用于地理定位的系統庫導入工程:

地理定位系統庫

然后導入頭文件:

#import <CoreLocation/CoreLocation.h>

CoreLocation框架使用須知
CoreLocation框架中所有數據類型的前綴都是CL
CoreLocation中使用CLLocationManager對象來做用戶定位

然后使用拖拽控件方式:

解析和反解析控件

CLGeocoder (地理編碼,反地理編碼)

使用CLGeocoder可以完成“地理編碼”和“反地理編碼”
地理編碼:根據給定的地名,獲得具體的位置信息(比如經緯度、地址的全稱等)
反地理編碼:根據給定的經緯度,獲得具體的位置信息

地理編碼方法
- (void)geocodeAddressString:(NSString*)addressStringcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;
反地理編碼方法
- (void)reverseGeocodeLocation:(CLLocation*)locationcompletionHandler:(CLGeocodeCompletionHandler)completionHandler

代碼如下:

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *DiZhiTF;
@property (weak, nonatomic) IBOutlet UITextField *JingDUTF;
@property (weak, nonatomic) IBOutlet UITextField *WeiDu;
@property (weak, nonatomic) IBOutlet UITextView *ZhanShi;
//地理編碼
@property(strong,nonatomic)CLGeocoder *geocoder;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //創建地址解析器
    self.geocoder= [[CLGeocoder alloc]init];
}

- (IBAction)KSJieXi:(id)sender
{
    // 獲取用戶輸入的地址字符串
    NSString *Dz = self.DiZhiTF.text;
    if(Dz != nil && Dz.length > 0)
    {
        [self.geocoder geocodeAddressString:Dz
                          completionHandler: ^(NSArray *placemarks, NSError *error)
         {
             // 如果解析結果的集合元素的個數大于1,表明解析得到了經度、緯度信息
             if (placemarks.count > 0)
             {
                 // 只處理第一個解析結果,實際項目中可使用列表讓用戶選擇
                 CLPlacemark *placemark = placemarks[0];
                 CLLocation *location = placemark.location;
                 self.ZhanShi.text = [NSString stringWithFormat:
                                         @"%@的經度為:%g,緯度為:%g",Dz,
                                         location.coordinate.longitude,
                                         location.coordinate.latitude];
             }
             else
             {
                 NSLog(@"您輸入的地址不正確");
             }
         }];
    }
    
}



    


- (IBAction)KSFanXiang:(id)sender
{
    NSString *longitudeStr = self.JingDUTF.text;
    NSString *latitudeStr = self.WeiDu.text;
    if(longitudeStr != nil && longitudeStr.length > 0
       && latitudeStr != nil && latitudeStr.length > 0)
    {
        // 將用戶輸入的經度、緯度封裝成CLLocation對象
        CLLocation* location = [[CLLocation alloc]initWithLatitude:[latitudeStr floatValue]
                                longitude:[longitudeStr floatValue]];
        
        [self.geocoder reverseGeocodeLocation:location completionHandler:
         ^(NSArray *placemarks, NSError *error)
         {
             // 如果解析結果的集合元素的個數大于1,表明解析得到了經度、緯度信息
             if (placemarks.count > 0)
             {
                 // 只處理第一個解析結果,實際項目可使用列表讓用戶選擇
                 CLPlacemark* placemark = placemarks[0];
                 // 獲取詳細地址信息
                 NSArray* addrArray = [placemark.addressDictionary
                                       objectForKey:@"FormattedAddressLines"];
                 // 將詳細地址拼接成一個字符串
                 NSMutableString *Dz = [[NSMutableString alloc] init];
                 for(int i = 0 ; i < addrArray.count; i ++)
                 {
                     [Dz appendString:addrArray[i]];
                 }
                 self.ZhanShi.text = [NSString stringWithFormat:
                                         @"經度:%g,緯度:%g的地址為:%@",
                                         location.coordinate.latitude,
                                         location.coordinate.longitude,Dz];
             }
             // 沒有得到解析結果。
             else
             {
                 NSLog(@"您輸入的地址無法解析");
             }
         }];
    }

}


@end

實現效果如下:

實現解析效果
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容