`
janedoneway
  • 浏览: 582158 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

iphone:GPS位置和地图开发(CLLocation and MKMapView)

 
阅读更多

From:http://www.iblue.cc/2011/05/gps%E4%BD%8D%E7%BD%AE%E5%92%8C%E5%9C%B0%E5%9B%BE%E5%BC%80%E5%8F%91/

 

 

有了iPhone,意味着我们不会再迷路了。有了iPhone内建的全球定位系统(Global Positioning System,GPS)硬件,以及一些创新的位置和地图软件,iPhone不仅随时知道你位于何处,而且还能显示给你看。

iPhone使用所谓的辅助GPS技术来搞清楚你位于何处。有了内建的GPS接收器,iPhone可以利用通信塔台和Wi-Fi热点之间的三角信息,来增加它发送给应用程序的位置数据的准确性。

在本章中,我们首先介绍Core Location,这是让我们快速且轻松地找到当前位置的框架。然后,我们将介绍Map Kit框架,它使我们能够把流行的Google Maps引擎所支持的地图添加到自己的应用中。我们还将看看如何轻松地执行反向地理编码来获取一个位置的地址,最后,我们把所有这些概念组合到一个地图应用程序中,它能够再现本地Maps应用程序的很多功能。

8.2   Map Kit

Map 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

→<MKMapViewDelegate>

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];

else

pinView.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

→<MKMapViewDelegate,

→MKReverseGeocoderDelegate>

我们还需要创建一个实例变量来保存反向地理编码器:

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   更新后的代码执行一次反向地理查找,并且把地址作为注释添加到地图上

 

分享到:
评论

相关推荐

    iPhone MKMAPView画路径

    在iOS开发中,`MKMapView`是苹果地图框架的一部分,用于在地图上显示地理位置和信息。本篇文章将深入探讨如何在`MKMapView`上绘制GPS轨迹路径,并支持类似Google Maps的缩放功能。 首先,我们需要了解`MKMapView`的...

    GPS定位MKMapView,CoreLocation

    在iOS开发中,GPS定位是实现地图应用和位置服务的关键技术。标题提到的"GPS定位MKMapView,CoreLocation"涉及到两个主要的Apple框架:MapKit(MKMapView)和CoreLocation。接下来,我们将深入探讨这两个框架以及在iOS...

    Iphone上GPS跟踪定位的实现

    在iOS平台上,开发一款应用来实现iPhone上的GPS跟踪定位功能是一项关键任务,这涉及到地理定位技术的使用。Objective-C作为苹果官方的原生编程语言,是实现这一目标的基础。在这个项目中,我们将深入探讨如何使用...

    ios5GPS追踪(地图GPS跟踪定位)源文件

    在iOS开发中,GPS追踪和地图定位是移动应用的重要组成部分,尤其对于导航、健身、社交等类型的应用。这里我们关注的是一个针对iOS 5的GPS追踪项目,它涉及到地图服务和定位服务的集成。让我们深入探讨一下这个"ios5...

    iOS地图开发详解

    iOS地图开发详解主要聚焦于如何利用MapKit框架在iPhone应用中集成地图和导航功能。MapKit是Apple提供的一种强大的工具,允许开发者在他们的应用程序中嵌入交互式地图。在这个文档中,我们将深入探讨如何使用...

    Location-and-Map-Sample-master.zip_GPS

    4. `ViewController.swift`:控制器类文件,可能包含了获取GPS位置和更新地图视图的代码。 5. `Info.plist`:项目配置文件,可能包含了请求用户允许访问GPS权限的设置。 6. `MapsViewController.swift`或类似的文件...

    GPS地图源码_ios源码

    开发者需要设置MapView的delegate,以便响应用户交互和地图更新。 7. **定位精度与节能**:通过设置CLLocationManager的desiredAccuracy属性,开发者可以控制定位的精确度,这会影响到电池消耗。此外,`...

    iphone开发地图调用

    本文将详细讲解如何在iPhone开发中调用地图,主要围绕标题“iPhone开发地图调用”展开,结合描述中的“完整的代码希望有用”,我们将探讨地图API的使用,特别是与地图标注相关的知识点。 首先,我们需要引入Apple的...

    CLLocation的基础用法

    #### MKMapView:地图视图 `MKMapView`是iOS中用来显示地图的视图,它可以自定义显示不同类型的地图。 - **MKMapTypeStandard**:标准的街道级地图。 - **MKMapTypeSatellite**:卫星图。 - **MKMapTypeHybrid**:...

    MKMAPVIEW上长按屏幕,添加大头针

    在iOS开发中,`MKMapView`是苹果提供的一个强大的地图视图组件,它允许开发者集成Apple Maps到自己的应用中,展示地理位置信息,并进行各种交互操作。本篇文章将深入讲解如何在`MKMapView`上实现长按屏幕添加大头针...

    IOS MKMapView

    MKMapView在中国显示地图和卫星图存在位置上的偏差,因此很多时侯在定位跟踪的时候常常是卫星定位而标准地图显示,因此常发现位置点不居中显示,当然这个可以使用开启用户位置跟踪模式来进行定位。本DEMO也正是利用...

    ios-地图导航.zip

    - MKMapView:主要视图类,用于展示地图,设置地图类型(标准、卫星、混合),缩放和平移操作。 - MKCoordinateRegion:表示地图的可视区域,包含中心点和跨度。 - MKAnnotation:定义地图上的标注,包括位置坐标...

    iPhone地图定位程序

    首先,你需要在Xcode中创建一个新的iOS项目,选择Single View App模板,然后确保你的项目目标是iOS,并且选中"Include Core Location"和"Include MapKit"库,这两个库分别提供了地理位置服务和地图显示的功能。...

    iPhone4 开发Demo-3

    通过这个"iPhone4 地图位置应用"的Demo,开发者不仅可以学习到iOS地图开发的基本技巧,还能深入理解位置服务的原理和实践,从而在自己的应用中实现类似的功能。记住,理论与实践相结合是提升编程技能的关键,所以...

    FlyoverKit:在 MKMapView 上实现 360° 俯视图.zip

    5. **数据源和地图覆盖物**:为了提供360°的视角,FlyoverKit 可能需要处理来自 Apple Maps 服务的高分辨率卫星图像和其他地理数据,同时支持自定义地图覆盖物,如建筑物模型或地标。 6. **性能优化**:由于3D渲染...

    gps实时定位

    GPS(全球定位系统)是现代科技中的一个重要组成部分,它通过接收来自卫星的信号来确定地球上任何位置的精确坐标。...随着对GPS和地图API的深入理解和实践,你可以实现更多复杂的功能,如路径规划、地理围栏等。

    swift-原生地图自定义开发demo

    在Swift中进行原生地图自定义开发涉及到许多关键知识点,这些知识点可以帮助开发者创建出功能丰富、用户友好的地图应用。以下是一些核心概念和步骤的详细说明: 1. **MapKit框架**:Swift中的MapKit框架是苹果提供...

    MKMapView 同时显示多气泡

    在iOS开发中,`MKMapView` 是苹果提供的地图视图组件,用于展示地图并进行相关交互。本主题聚焦于如何在`MKMapView`上同时显示多个自定义的气泡(callouts),并通过手势来实现这一功能。这在地图应用中非常常见,...

    swift-在一个MKMapView上360°展示一个高架公路

    在Swift开发中,使用ARKit(增强现实框架)与MKMapView(地图视图)结合,可以创建出一种独特的用户体验,即360°展示高架公路。这种技术将虚拟信息与现实世界无缝融合,使用户能够从不同角度观察和了解高架公路的...

    iOS原生地图开发指南1

    使用`MKMapView`的`region`属性可以设置地图的中心位置和显示范围。`MKCoordinateRegion`结构体包含`center`(地图中心的经纬度)和`span`(地图显示的经纬度范围)。`MKCoordinateSpan`则由`latitudeDelta`和`...

Global site tag (gtag.js) - Google Analytics