最近學習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
實現效果如下:
實現解析效果