Download presentation
Presentation is loading. Please wait.
1
《IOS应用开发基础教程》 QQ学习群:
2
第十二章 GPS位置服务与地图编程 QQ学习群:
3
2.掌握MKMapView定位的基本使用方法, 3.掌握IOS地图编程中的大头针放置方法。
教学目标: 1.了解MKMapView框架的基本知识。 2.掌握MKMapView定位的基本使用方法, 3.掌握IOS地图编程中的大头针放置方法。 QQ学习群:
4
12.1GPS位置服务编程 在学习如何使用MapKit类之前,我们还要了解一下在IOS设备中一个重要 的类CLLocation,它的作用就是定位设备的当前位置,这个功能也会用于我们 在使用MapKit类中。CLLocation类位于CoreLocation.framework框架中, 所以如果我们要使用CLLocation类,我们还需要将CoreLocation.framework 导入到项目中,这里我们还是在将导入方法讲述一遍,助于读者掌握。 在左侧项目栏中,点击项目名称,然后XCode的中间区域会出现一排选项 卡,然后选择Build Phases选项卡,接下来选择Link Binary With Libraries 标签,在这个标签里就能添加我们所需要的框架了,如图所示。 QQ学习群:
5
QQ学习群:
6
接下来,我们就通过一个简单例子来学习如何通过定位系统获取到当前设备所在的地理位置的坐标信息。
在XCode中新建一个Single View Application项目模板,然后使用上述导入框架的方法导入CoreLocation.framework框架,接着我们还要在AppDelegate.h头文件中导入CoreLocation框架的头文件,并且使用CLLocationManagerDelegate这个用于定位的协议。 1.#import <UIKit/UIKit.h> 2.#import <CoreLocation/CoreLocation.h> AppDelegate : UIResponder 4.<UIApplicationDelegate,CLLocationManagerDelegate> QQ学习群:
7
然后我们在AppDelete.m文件的初始化方法中使用CLLocationManager类来获取当前设备的地理位置信息。
5.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 6.{ 7. self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 8. self.window.backgroundColor = [UIColor whiteColor]; 9. [self.window makeKeyAndVisible]; CLLocationManager *locationManager = [[CLLocationManager alloc]init]; locationManager.delegate = self; [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; [locationManager startUpdatingLocation]; return YES; 15.} QQ学习群:
8
在代码中,我们首先创建了一个CLLocationManager的实例,然后对它进 行初始化,并设置了实例的代理为本身,这样才可以使用相应的代理方法。 setDesiredAccuracy方法是用来设置定位的精确度,它包含了5种不同精确度的 值。 kCLLocationAccuracyBest : 精确度最高 kCLLocationAccuracyNearestTenMeters : 精确度为10米 kCLLocationAccuracyHundredMeters : 精确度为100米 kCLLocationAccuracyKilometer : 精确度为1000米 kCLLocationAccuracyThreeKilometers : 精确度为3000米 如果在项目中对地理位置定位的精确度要求比较高,就将值设置为 kCLLocationAccuracyBest,一般情况下是设置为10米。 然后通过CLLocationManager的实例调用startUpdatingLocation方法,开始 更新当前的地理位置信息,这个方法是实时更新的,也就是说每秒更新一次, 我们知道开启定位服务是非常耗电和耗流量的,所以一旦我们获取了当前的地 理位置信息之后,我们还需要通过实例调用stopUpdatingLocation方法去停止更 新地理位置信息。 QQ学习群:
9
下面我们要实现CLLocationManagerDelegate协议中的代理方法。获取地理位置信息坐标是通过CLLocationCoordinate2D类来实现,CLLocationCoordinate2D是一个结构体,结构体中包含了两个值,latitude和longitude纬度和经度。通过这个两个值就能显示地理位置的坐标信息。 1. - (void)locationManager:(CLLocationManager *)manager 2. didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 4. { CLLocationCoordinate2D coordinate = newLocation.coordinate; 6. , %f",coordinate.longitude,coordinate.latitude); [manager stopUpdatingLocation]; 8. } 这个代理方法中的3个参数分别代表了CLLocationManager实例、新的位置信息和旧的位置信息。构建并运行,可以看到在控制台上输出了当前设备的地理位置坐标的信息。 :47: CLLocation[655:c07] Application windows are expected to have a root view controller at the end of application launch :47: CLLocation[655:c07] 当前位置坐标为: , QQ学习群:
10
在读取完地理位置坐标信息之后,比如我们又到了另一个地方,或者说想要去另一 个地方,我们还可以通过CLLocationDistance类来获取到两个地点之间的距离。 24.- (void)locationManager:(CLLocationManager *)manager 25. didUpdateToLocation:(CLLocation *)newLocation 26. fromLocation:(CLLocation *)oldLocation 27.{ 28. ………… 29. CLLocationDistance distance = [newLocation distanceFromLocation:oldLocation]; } oldLocation是上一次定位的地理位置的坐标信息,读者也可以重新定义一个准 确的地理位置。最后构建并运行程序,可以在控制台上看到两的地理位置距离的信 息。因为我们的设备并没有移动,所以两个坐标信息是一致的。 CLLocation[655:c07] 两地之间的距离为: QQ学习群:
11
12.2MKMapView编程 和安卓相比,iOS的地图使用更为方便,我们只需要创建一个 MKMapView类的实例然后将它添加到视图当中即可。XCode中自带的MapKit 框架是基于Google地图的框架,它调用了一些Google地图的基本功能。 MKMapView类是属于MapKit.framework框架中,所以我们在使用地图之 前还是要将MapKit框架导入到项目中,并在头文件中添加框架的头文件。 在XCode中新建一个Single View Application项目模板,首先我们把MapKit框架 和CoreLocation框架都加入到项目中,接着我们将头文件和相应的协议添加到 项目中。MapKit类库中也提供了很多代理方法,都遵循MKMapViewDelegate 协议。还要添加定位的CLLocationManagerDelegate协议。首先在 ViewController.h中引入相关头文件以及协议方法。 QQ学习群:
12
QQ学习群:262779381 1.#import <UIKit/UIKit.h>
2.#import <CoreLocation/CoreLocation.h> 3.#import <MapKit/MapKit.h> ViewController : UIViewController<MKMapViewDelegate,CLLocationManagerDelegate> 接下来我们将UIViewController的实例添加到窗口上,并将它设置为窗口的根视图控制器。 AppDelegate.m 6.#import "AppDelegate.h" 7.#import "ViewController.h" 8.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 9. // Override point for customization after application launch. ViewController *vc = [[ViewController alloc]init]; self.window.rootViewController = vc; vc.view.backgroundColor = [UIColor whiteColor]; [vc release]; return YES; 15.} QQ学习群:
13
一切准备工作就绪后就可以开始添加我们的地图信息了。我们在ViewController.h文件中创建一个MKMapView的实例。
ViewController : UIViewController<MKMapViewDelegate,CLLocationManagerDelegate> 17.{ MKMapView *mapView; 19.} QQ学习群:
14
接下来我们在实现文件中对MKMapView的实例进行初始化的操作,并设置相关的属性。
ViewController.m 21.- (void)viewDidLoad 22.{ [super viewDidLoad]; mapView = [[MKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)]; mapView.showsUserLocation = YES; mapView.delegate = self; mapView.mapType = MKMapTypeStandard; CLLocationCoordinate2D coords = CLLocationCoordinate2DMake( , ); //北京故宫坐标点 MKCoordinateSpan Span = {0.1, 0.1}; MKCoordinateRegion region = MKCoordinateRegionMake(coords, Span); [mapView setRegion:[mapView regionThatFits:region] animated:YES]; [self.view addSubview:mapView]; 34.} QQ学习群:
15
代码中用到了很多MKMapView中的属性,showsUserLocation属性是用于显示用户 定于的大头针信息,我们会在下一小节的内容中学习到如何在地图中添加大头针信 息。IOS中提供的地图有3类: MKMapTypeStandard :普通地图 MKMapTypeSatellite :卫星地图 MKMapTypeHybrid :混合地图 MKCoordinateSpan方法是用来定义地图的精度,精度越小,在地图上返回的地理 位置信息会越精确。MKCoordinateRegion方法用来确定地图显示的范围,它的两个 参数分别代表了坐标和精度。最后通过setRegion方法将地图信息显示在mapView实 例中。这样就完成了一个对特定坐标位置的地理位置的显示。 构建并运行,可以看到最后的北京故宫的地图的信息已经显示在屏幕上,如图所 示。 QQ学习群:
16
上面的方法是显示特定坐标点的地理位置信 息,那么我们如何将设备现在所处的位置的地 理位置信息显示在地图上呢?这里就还是要用 到我们在12
上面的方法是显示特定坐标点的地理位置信 息,那么我们如何将设备现在所处的位置的地 理位置信息显示在地图上呢?这里就还是要用 到我们在12.1小节中提到的CLLocation类来实 现了。在viewDidLoad方法中添加一个 CLLocationManager类的实例,并设置代理, 最后开启定位功能。 QQ学习群:
17
35. - (void)viewDidLoad 36. { 37. [super viewDidLoad]; 38
35.- (void)viewDidLoad 36.{ 37. [super viewDidLoad]; 38. // Do any additional setup after loading the view. 39. CLLocationManager *locationManager = [[CLLocationManager alloc]init]; 40. locationManager.delegate = self; 41. [locationManager startUpdatingLocation]; 42. mapView = [[MKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)]; 43. mapView.showsUserLocation = YES; 44. mapView.delegate = self; 45. mapView.mapType = MKMapTypeStandard; 46. CLLocationCoordinate2D coords = CLLocationCoordinate2DMake( , ); 47. MKCoordinateSpan Span = {0.1, 0.1}; 48. MKCoordinateRegion region = MKCoordinateRegionMake(coords, Span); 49. [mapView setRegion:[mapView regionThatFits:region] animated:YES]; 50. [self.view addSubview:mapView]; 51.} QQ学习群:
18
然后通过定位的代理方法去定位到当前位置的坐标信息,并将坐标信息在地 图中显示。 52
然后通过定位的代理方法去定位到当前位置的坐标信息,并将坐标信息在地 图中显示。 52.- (void)locationManager:(CLLocationManager *)manager 53. didUpdateToLocation:(CLLocation *)newLocation 54. fromLocation:(CLLocation *)oldLocation 55.{ 56.CLLocationCoordinate2D coordinate = 57.CLLocationCoordinate2DMake(newLocation.coordinate.latitude,newLocation.coo rdinate.longitude); 58. MKCoordinateSpan Span = {0.1,0.1}; 59. MKCoordinateRegion region = MKCoordinateRegionMake(coordinate, Span); 60. [mapView setRegion:[mapView regionThatFits:region] animated:YES]; 61. , %f",coordinate.longitude,coordinate.latitude); 62. [manager stopUpdatingLocation]; 63.} QQ学习群:
19
首先我们定义了以newLocation为坐标的新坐标作为当前的地理位置信息,然后同样的设置了地图的精度为0
首先我们定义了以newLocation为坐标的新坐标作为当前的地理位置信息,然后同样的设置了地图的精度为0.1,开启定位系统之后,就可以定位到我们所在位置的地理位置信息了。因为IOS模拟器上的坐标位置选择的时Apple苹果公司总部的位置,所以构建并运行程序,可以看到最后在地图上显示的时苹果公司总部的地理位置。 QQ学习群:
20
12.3 MKAnnotation标注的使用 当我们在使用地图应用时,经常需要在地图上做一些标注以起到一个提醒 的作用,这就是地图大头针。在本节的内容中,我们会在上节内容的基础上, 在地图中添加北京故宫博物院的大头针信息。 大头针的信息都定义在NSObject类中的一个名为MKAnnotation的协议 中,我们在XCode中查看它的API,可以看到它有1个必须实现的属性和2个可 选的属性,还有一个设置坐标的方法,这个方法也是可选的,用户也可以自己 定义。 (nonatomic, readonly) CLLocationCoordinate2D coordinate; 66.// Title and subtitle for use by selection UI. (nonatomic, readonly, copy) NSString *title; (nonatomic, readonly, copy) NSString *subtitle; 69.// Called as a result of dragging an annotation view. 70.-(void)setCoordinate:(CLLocationCoordinate2D)newCoordinate NS_AVAILABLE(NA, 4_0); QQ学习群:
21
coordinate属性是一个必须定义的一个属性,因为没有坐标,那么就无法在地图中创建大 头针了,其它两个可选的属性分别是对大头针的解释,比如可以添加该大头针对应的地址的 名称和一些详细的信息。 我们打开上小节内容的例子,在项目中新建一个以NSObject为父类的文件,并且将 MKAnnotation协议添加到头文件中,还要定义一下协议中声明的属性和方法。 这里还要注意,如果在头文件中没有包含<MapKit/MapKit.h>头文件,那么MKAnnotation 协议也是无法包含进来的,因为这个协议也是属于MapKit框架中的,所以我们还要在头文件 中引入MapKit头文件。 71.#import <Foundation/Foundation.h> 72.#import <MapKit/MapKit.h> CustomAnnotation : NSObject<MKAnnotation> 74.{ 75. CLLocationCoordinate2D coordinate; 76. NSString *title; 77. NSString *subtitle; 78.} 79.- (id)initWithCoordinate:(CLLocationCoordinate2D)coords; (nonatomic, readonly) CLLocationCoordinate2D coordinate; (nonatomic, copy) NSString *title; (nonatomic, copy) NSString *subtitle; QQ学习群:
22
同时我们还使用了property语法,自动生成Getter和Setter方法,但是因为 coordinate属性我们在定义的时候使用的readonly,那么我们就无法对它生 成Getter方法,这就要求我们自己对coordinate属性进行初始化操作。 CustomAnnotation.m #import "CustomAnnotation.h" CustomAnnotation coordinate,title,subtitle; 87.- (id)initWithCoordinate:(CLLocationCoordinate2D)coords 88.{ 89. if (self = [super init]) { 90. coordinate = coords; 91. } 92. return self; 93.} QQ学习群:
23
这样我们就创建好了一个用于显示大头针信息的类,接下来我们就要在 ViewController
这样我们就创建好了一个用于显示大头针信息的类,接下来我们就要在 ViewController.m文件中去创建一个大头针类的实例,并将实例显示在地图当中 。 我们实现一个创建大头针的方法。 ViewController.m (void)createAnnotationWithCoords:(CLLocationCoordinate2D)coords 96.{ 97. CLLocationCoordinate2D Coords = CLLocationCoordinate2DMake( , ); 98. CustomAnnotation *Annotation = [[CustomAnnotation alloc]initWithCoordinate:Coords]; 99. Annotation.title 100. Annotation.subtitle Palace Museum"; 101. [mapView addAnnotation:Annotation]; 102.} QQ学习群:
24
首先我们还是要定义一个坐标点,用于插入大头针,然后创建并初始化一 个大头针实例,并将开始创建的坐标信息作为大头针的坐标,添加相应的 标题和副标题,最后将大头针信息添加到地图中。 在viewDidLoad方法中调用我们的创建大头针方法,就可将大头针显 示在地图中。因为我们是创建一个特定坐标位置的大头针信息,所以我们 需要将上节例子中的定位系统关闭,[locationManager startUpdatingLocation];删除这行代码。 (void)viewDidLoad 104.{ 105. ………… 106. [mapView setRegion:[mapView regionThatFits:region]animated:YES]; 107. [self.view addSubview:mapView]; 108. [self createAnnotationWithCoords:coords]; 109.} QQ学习群:
25
QQ学习群:
26
本章小结 本章通过讲解MKMapView与MKAnnotation讲解了IOS中地图位置的编程方法。 QQ学习群:
27
课后习题 1.在本章内容的基础上,实现即时定位功能,当手持手机走动时,能够即时获得设备的位置,并显示在地图上。 2.在第一题的基础上,增加大头针,用于标注设备位置改变的情况。 QQ学习群:
Similar presentations