您的位置:首页 > 移动开发 > IOS开发

IOS:GPS位置和地图开发

2014-11-12 18:10 253 查看
有了iPhone,意味着我们不会再迷路了。有了iPhone内建的全球定位系统(Global Positioning System,GPS)硬件,以及一些创新的位置和地图软件,iPhone不仅随时知道你位于何处,而且还能显示给你看。iPhone使用所谓的辅助GPS技术来搞清楚你位于何处。有了内建的GPS接收器,iPhone可以利用通信塔台和Wi-Fi热点之间的三角信息,来增加它发送给应用程序的位置数据的准确性。在本章中,我们首先介绍Core Location,这是让我们快速且轻松地找到当前位置的框架。然后,我们将介绍Map
Kit框架,它使我们能够把流行的Google Maps引擎所支持的地图添加到自己的应用中。我们还将看看如何轻松地执行反向地理编码来获取一个位置的地址,最后,我们把所有这些概念组合到一个地图应 用程序中,它能够再现本地Maps应用程序的很多功能。8.2 Map KitMap Kit是基于Google Maps引擎的地图框架,允许我们能够向应用程序中添加交互式的地图。地图可以滚动或缩放到地球上的任何区域,并且可以有标签或注释,以便向地图添加需要额外显示的信息。向应用程序中添加地图:1)创建一个新的基于视图的应用程序,将其保存为MappingExample。2)在Groups
& Files面板中,展开Targets区域,用鼠标右键点击应用程序目标,并选择Get Info。3)确保选中General标签,点击Linked Libraries列表底部的Add (+),并且添加MapKit.framework(如图8-6所示)。4)打开MappingExampleViewController.h文件,导入MapKit框架,并且创建一个实例变量来保存位置管理器(见程序清单8-6)。 图8-6 向项目中添加Map Kit框架程序清单8-6 地图应用程序的头文件 5)切换到MappingExampleViewController.m文件,取消对viewDidLoad方法的注释,并且添加如下代码:map
= [[MKMapView alloc]→initWithFrame:[self.view bounds]];[self.view addSubview:map];程序清单8-7给出了更新后的代码。6)构建并运行应用程序(如图8-7所示)。这就搞定了,只需要两行代码,就可以有一个地图。你可以在地图上导航,并且使用“收放”手势来实现放大/缩小。图8-7 带有全屏MKMapView的应用程序 程序清单8-7 基本的地图应用程序的完整代码 我们现在更新代码,使其变得更有趣些。在地图上显示你的位置:1)打开MappingExampleViewController.m,并且更新viewDidLoad方法以便把地图类型设置为卫星视图,并告诉它显示当前的位置(用一个动画的蓝色标记表示):map.mapType
= MKMapTypeSatellite;map.showsUserLocation = YES;这个标记上外围的圆圈表示位置数据的精度,圆圈越粗,精确度越低:CLLocationCoordinate2D coords;coords.latitude = 37.331689;coords.longitude = -122.030731;2)接下来,创建一个变量来保存地图中心坐标,在这个例子中,就是Apple公司的总部:float zoomLevel = 0.018;MKCoordinateRegion region
=→MKCoordinateRegionMake(coords,→MKCoordinateSpanMake(zoomLevel,→zoomLevel));[map setRegion:[map regionThatFits:→region] animated:YES];3)要缩放地图,我们需要创建一个MKCoordinateRegion。这个结构不仅包含了地图应该居中的坐标,而且还有一个范围,后者由确定地图应该显示多少(以度为单位)的水平距离和垂直距离组成。较大的范围创建一个缩小的视图,较小的范围创建一个放大的视图(如图8-8所示)。程序清单8-8给出了更新后的viewDidLoad方法。就像iPhone的本地Maps应用程序一样,我们可以使用mapType属性来显示3种可能的地图:·MKMapTypeStandard—显示一个常规地图,包含街道和路名。如果没有指定的话,这是默认的地图类型。·MKMapTypeSatellite—显示卫星视图。·MKMapTypeHybrid—显示两种地图的组合,换句话说,卫星视图上覆盖有路和街道的信息。提示·在设置范围值的时候,根据所使用的地图类型,我们可以放大或缩小到一定的程度。例如,MKMapTypeSatellite的地图通常包含更多的细节,并且允许我们比MKTypeStandard放大更多。图8-8
在地图上显示当前位置 程序清单8-8 更新设置和显示位置的代码8.2.1 添加注释为了让地图应用更加丰富且有趣,我们通常在地图上附加信息,这也是注释的作用。Map Kit包含了添加注释的支持,不仅可以是简单的“标签”注释(正如在本地的iPhone Maps应用程序中所见到的),而且可以是包含自己的感受的定制的注释。为地图添加注释,只需要在我们已经完成的基础上再略作改进。为地图添加注释:1)打开MappingExampleViewController.h,并向@interface:添加MKMapViewDelegate协议声明:@interface
MappingExampleView→Controller : UIViewController→2)在MappingExampleViewController.m文件中,我们需要创建实现MKAnnotation协议的自己的定制类。至少,这个类必须实现coordinate属性。3)在viewDidLoad中,设置委托,并且通过添加如下代码创建自己的注释:customAnnotation *annotation =→[[customAnnotation alloc]→initWithCoordinate:coords];annotation.title
= @”The Title”;annotation.subtitle = @”Subtitle”;[map addAnnotation:annotation];[annotation release];我们已经删除setUserLocation:行,以便可以看到这些注释(否则,位置标记和注释将会出现在地图上的同一位置)。4)最后,实现mapView:viewForAnnotation:委托方法,把注释显示为一个别针:MKPinAnnotationView *pinView =→(MKPinAnnotationView
*) [map→dequeueReusableAnnotationViewWith→Identifier:annotation.title];if (pinView == nil)pinView = [[[MKPinAnnotationView→alloc] initWithAnnotation:→annotation reuseIdentifier:→annotation.title] autorelease];elsepinView.annotation = annotation;程序清单8-9给出更新后的代码。程序清单8-9
添加定制的注释的代码程序清单8-9 (续) mapView:viewForAnnotation:委托返回了一个MKAnnotationView对象。在这个例子中(如图8-9所示),我 们使用MKPinAnnotationView子类,正如其名字所示,它把注释显示为别针。然而,如果希望注释有不同的外观,我们可以返回自己的子类。我们可以在程序清单8-10中看到这个最简单的示例。我们在MKAnnotationView基类上设置image:属性。这将产生如图8-10所示的地图。提示·创建MKAnnotationView对象,以便当注释移动到屏幕外的时候(例如用户缩放或滚动地图)允许地图引擎删除注释,此时会指定一个复用的队列。当注释移动出屏幕的时候,从队列中取出它(也叫做出列)。·我们也可以通过在定制的MKAnnotation
View类中覆盖viewForCalloutAccessory Position:来改变注释的弹出视图(当用户触摸注释的时候出现的视图)的外观。图8-9 在地图上显示一个注释 图8-10 显示图形的一个定制注释 程序清单8-10 把一幅图像显示为注释8.2.2 添加反向地理编码Map Kit提供了一种工具,通过查找纬度和经度坐标来获取地址信息,这个过程叫做反向地理编码(reverse geocoding)。我们通过MKReverseGeocoder类及其委托方法来实现这一点。在前面的例子中,我们手动创建自己的注释,在viewDidLoad中指定坐标标题和子标题。现在,我们将更改自己的代码,以对位置执行反向查找,创建一个注释,在弹出视图中显示地址。添加反向地理编码:1)打开MappingExampleViewController.h,并且向@interface添加MKReverseGeocode
Delegate协议:@interface MappingExampleView→Controller : UIViewController→我们还需要创建一个实例变量来保存反向地理编码器:MKReverseGeocoder *geo;程序清单8-11给出了更新后的代码。程序清单8-11 更新后添加了反向地址编码的头文件 2)回到MappingExampleViewController.m中,更新viewDidLoad方法:geo = [[MKReverseGeocoder alloc]甶nitWithCoordinate:coords];geo.delegate
= self;[geo start];这里,我们创建地理编码器实例,设置委托,并且告诉它开始查找。3)最后,我们需要实现MKReverseGeocode委托方法,如果找到地址的话,添加一个注释:[map addAnnotation:placemark];[geo cancel];如果失败的话,在控制台上显示一条消息:NSLog(@”geo error: %@”,error);[geo cancel];注意,我们在两种情况下都取消地理编码器。程序清单8-12给出了完整的代码。图8-11显示带有地址的应用程序。提示·在reverseGeocoder:didFindPlacemark:委托方法中,我们添加一个MKPlacemark作为注释。这个类包含用
来保存位置信息(如城市或州)的属性。和前面我们自己定制的注释类相似,这个类支持MKAnnotation协议,因此它可以显示在地图上。图8-11 在注释中显示地址程序清单8-12 更新后的代码执行一次反向地理查找,并且把地址作为注释添加到地图上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gps 地图 ios