最近学习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
实现效果如下: