`
ming_fanglin
  • 浏览: 223529 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
如今,配备GPS功能的移动设备越来越普遍了,使用GPS定位系统,可以精确地定位你当前所在的地理位置,但由于GPS接收机需要对准天空才能工作,因此在室内环境基本无用。

  另一个找到自己所在位置的有效方法是使用手机基站,手机开机时,它会与周围的基站保持联系,如果你知道这些基站的身份,就可以使用各种数据库(包含基站的身份和它们的确切地理位置)计算出手机的物理位置。基站不需要卫星,和GPS不同,它对室内环境一样管用。但它没有GPS那样精确,它的精度取决于基站的密度,它在基站密集型区域的准确度最高。

  提示:第一代iPhone并没有配置GPS接收器,基站方式不能应用到iPod Touch上,因为它不是手机。

  第三种方法是依赖Wi-Fi,使用这种方法时,设备连接到Wi-Fi网络,通过检查服务提供商的数据确定位置,它既不依赖卫星,也不依赖基站,因此这个方法对于可以连接到Wi-Fi网络的区域有效,但它的精确度也是这三个方法中最差的。

  定位框架内核

  在iPhone上,苹果提供了定位框架内核,以帮助你确定你的物理位置,这个框架的美妙之处在于它使用了前面提到的所有三种方法,具体使用的是哪种方法对于开发者来说是透明的,开发人员只需要指定所需要的精度,定位内核将会以最佳方式确定定位结果。

  你一定感到很吃惊吧?!本文其余部分将向你展示这是如何做到的。

  获取位置坐标

  使用Xcode,创建一个新的基于视图的应用程序项目,取名为LBS,在新项目中,双击LBSViewController.xib文件,在界面设计工具中编辑它。使用下面的组件填充视图窗口,如图1所示。

  l Label

  l TextField

   
  图 1 位置视图实例:用Label和TextFiled填充这个窗口

  在Xcode中框架组上点击右键,选择“添加”*“现有框架”,选择 “Framework/CoreLocation.framework”,向LBSViewController.h文件中添加以下粗体字显示的代码:
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface LBSViewController : UIViewController
    <CLLocationManagerDelegate> {
    IBOutlet UITextField *latitudeTextField;
    IBOutlet UITextField *longitudeTextField;
    IBOutlet UITextField *accuracyTextField;
    CLLocationManager *lm;
}
@property (retain, nonatomic) UITextField *latitudeTextField;
@property (retain, nonatomic) UITextField *longitudeTextField;
@property (retain, nonatomic) UITextField *accuracyTextField;
@end

  若要使用CLLocationManager类,需要在你的视图控制器类中实现CLLocationManagerDelegate协议,还需要创建三个出口用于连接视图窗口中的三个TextFiled视图。

  回到界面编辑器,单击并拖动文档的所有者项目到三个TextField视图,然后分别选择latitudeTextField,longitudeTextField和accuracyTextField。

  在 LBSViewController.m文件中查询以下代码中的粗体部分:
#import "LBSViewController.h"
@implementation LBSViewController
@synthesize latitudeTextField, longitudeTextField, accuracyTextField;
- (void) viewDidLoad {
    lm = [[CLLocationManager alloc] init];
    if ([lm locationServicesEnabled]) {
        lm.delegate = self;
        lm.desiredAccuracy = kCLLocationAccuracyBest;
        lm.distanceFilter = 1000.0f;
        [lm startUpdatingLocation];
    }
}

- (void) locationManager: (CLLocationManager *) manager
    didUpdateToLocation: (CLLocation *) newLocation
    fromLocation: (CLLocation *) oldLocation{
    NSString *lat = [[NSString alloc] initWithFormat:@"%g",
        newLocation.coordinate.latitude];
    latitudeTextField.text = lat;
    
    NSString *lng = [[NSString alloc] initWithFormat:@"%g",
        newLocation.coordinate.longitude];
    longitudeTextField.text = lng;
    
    NSString *acc = [[NSString alloc] initWithFormat:@"%g",
        newLocation.horizontalAccuracy];
    accuracyTextField.text = acc;    
    
    [acc release];
    [lat release];
    [lng release];
}
- (void) locationManager: (CLLocationManager *) manager
    didFailWithError: (NSError *) error {
    NSString *msg = [[NSString alloc]
       initWithString:@"Error obtaining location"];
    UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"Error"
                          message:msg
                          delegate:nil
                          cancelButtonTitle: @"Done"
                          otherButtonTitles:nil];
    [alert show];    
    [msg release];
    [alert release];
}
- (void) dealloc{
    [lm release];
    [latitudeTextField release];
    [longitudeTextField release];
    [accuracyTextField release];
    [super dealloc];
}

  前面的代码创建了 CLLocationManager类的一个实例,在使用对象之前,你应该检查用户是否开启了设备的定位服务,如果开启了,你可以使用 desiredAccuracy属性指定想要的精度,使用下面的常量指定想要的精度:

  l kCLLocationAccuracyBest

  l kCLLocationAccuracyNearestTenMeters

  l kCLLocationAccuracyHundredMeters

  l kCLLocationAccuracyKilometer

  l kCLLocationAccuracyThreeKilometers

  distanceFilter属性让你指定设备必须移动多少距离位置信息才会更新,这个属性的单位是米。如果你想得到所有移动的通知,可以使用kCLDistanceFilterNone常量,最后,使用 startUpdatingLocation方法启动位置管理器。

  要获得位置信息,需处理下面两个事件:

  l locationManager:didUpdateToLocation:fromLocation:

  l locationManager:didFailWithError:

  当获得一个新的定位值时,设备触发 locationManager:didUpdateToLocation:fromLocation:事件,如果位置管理器不能确定位置信息,就会触发 locationManager:didFailWithError:事件。

  当设备可以确定位置时,你可能想显示经纬度值和精度,这时你可以使用CLLocation对象,它的horizontalAccuracy属性可以指定精度范围,单位是米。

  按Command- r在iPhone模拟器上测试该程序,图2显示了模拟器显示的位置经纬度值,同时显示了精度。

   
  图 2 定位测试:当你在iPhone模拟器上测试该示例程序时,总会显示这些固定的值




显示地图

  如果能将位置坐标定位到地图上显示将会更有趣,幸运的是,iPhone 3.0 SDK包括了Map Kit API,它可以让你在程序中显示Google Map,下面以一个例子进行说明。

  还是使用前面创建的项目,在 LBSViewController.xib文件中视图窗口上增加一个按钮,如图3所示。

   
  图 3 View Map按钮:增加按钮后的样子

  在Xcode中框架组上点击右键,增加一个新的框架MapKit.framework。在 LBSViewController.h文件中添加下列代码中的粗体部分:

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
@interface LBSViewController : UIViewController
    <CLLocationManagerDelegate> {
    IBOutlet UITextField *accuracyTextField;
    IBOutlet UITextField *latitudeTextField;
    IBOutlet UITextField *longitudeTextField;
    CLLocationManager *lm;
  
    MKMapView *mapView;
}
@property (retain, nonatomic) UITextField *accuracyTextField;
@property (retain, nonatomic) UITextField *latitudeTextField;
@property (retain, nonatomic) UITextField *longitudeTextField;

-(IBAction) btnViewMap: (id) sender;

@end


  回到界面编辑器,拖动按钮到文件的所有者项目上,然后选择btnViewMap:。

  在LBSViewController.m文件中,添加下列代码中的粗体部分:

-(IBAction) btnViewMap: (id) sender {
    [self.view addSubview:mapView];
}
- (void) viewDidLoad {
    lm = [[CLLocationManager alloc] init];
    lm.delegate = self;
    lm.desiredAccuracy = kCLLocationAccuracyBest;
    lm.distanceFilter = 1000.0f;
    [lm startUpdatingLocation];
    
    mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
    mapView.mapType = MKMapTypeHybrid;
}
- (void) locationManager: (CLLocationManager *) manager
    didUpdateToLocation: (CLLocation *) newLocation
    fromLocation: (CLLocation *) oldLocation{
    NSString *lat = [[NSString alloc] initWithFormat:@"%g",
        newLocation.coordinate.latitude];
    latitudeTextField.text = lat;
    
    NSString *lng = [[NSString alloc] initWithFormat:@"%g",
        newLocation.coordinate.longitude];
    longitudeTextField.text = lng;
    
    NSString *acc = [[NSString alloc] initWithFormat:@"%g",
        newLocation.horizontalAccuracy];
    accuracyTextField.text = acc;    
    
    [acc release];
    [lat release];
    [lng release];
    
    MKCoordinateSpan span;
    span.latitudeDelta=.005;
    span.longitudeDelta=.005;
    
    MKCoordinateRegion region;
    region.center = newLocation.coordinate;
    region.span=span;
    
    [mapView setRegion:region animated:TRUE];
}
- (void) dealloc{
    [mapView release];
    [lm release];
    [latitudeTextField release];
    [longitudeTextField release];
    [accuracyTextField release];
    [super dealloc];
}

  代码解释:

  l 当视图载入时创建一个MKMapView类的实例,设置显示的地图类型。

  l 当用户点击View Map按钮时,在当前视图上增加mapView对象。

  l 当位置信息得到更新时,使用mapView对象的setRegion:方法放大地图。

  在iPhone模拟器中按Command-r测试该程序,点击View Map按钮将会显示一个包含位置管理器返回位置的地图。如图4所示。

   
  图 4 地图位置:通过定位内核框架显示地图位置

  因为模拟器始终显示的是相同的位置,如果你有一部iPhone手机也可以真实地感受一下,当你移动位置时,你会看到地图会自动更新。将 distanceFilter属性设置得小一点,这样可以增强跟踪体验。

  正如你所看到的,iPhone SDK的定位内核框架让你可以很容易实现基于位置的设备,此外,MapKit(包括在iPhone SDK中)可以在地图上显示位置信息。如果没有创建过基于位置的应用,我想你看完本文就应该动手一试,还等什么呢?
5
0
分享到:
评论
2 楼 xupf1977 2010-07-14  
写得太棒了
1 楼 shanghaif 2010-07-09  
敲了一遍,模拟器里面运行正常,不错!

相关推荐

    iphone 百度定位Demo

    《iPhone上的百度定位服务实战指南》 在移动应用开发中,地理位置信息的获取是一项至关重要的功能,它为用户提供个性化服务,如导航、周边查询、活动推荐等。在iOS平台上,开发者常常选择集成百度地图SDK来实现精准...

    iPhone与iPad开发实战(iPhone and iPad in Action )

    - **GPS与定位服务**:利用GPS定位功能提供地理位置相关的服务。 - **罗盘**:利用罗盘传感器确定设备的方向。 #### 五、媒体与图形处理 - **音频处理**:学习如何播放和录制音频文件,以及如何使用AVFoundation...

    iPhone与iPad开发实战——精通iOS开发2.rar

    除此之外,iOS应用还涉及到推送通知、多任务处理、本地通知、GPS定位、地图服务等。Apple Push Notification Service(APNs)允许开发者向用户的设备发送实时通知,而Core Location框架则提供了获取和处理地理位置...

    《iPhone开发实战》.(Christopher Allen).pdf

    1.4.3 输入和iphone定位机制10 1.5 小结11 第2章 web还是sdk12 2.1 比较两种编程风格12 .2.2 核心思想:编程的连续性13 2.3 优点和缺点14 2.3.1 web开发14 2.3.2 sdk开发15 2.3.3 程序平台16 2.4...

    iphone、ipad应用开发-iOS5剖析(新增IOS5项目实战秦朝史话小

    iphone、ipad应用开发-iOS5剖析(新增IOS5项目实战秦朝史话小教程内容:IOS5精品系列课程专题讲座:1.ios5精品系列课程专题讲座之开篇引言(Mac平台的使用)2.ios5精品系列课程专题讲座之开发之旅(Xcode的使用)3.ios5...

    iPhone开发秘籍(第2版) 高清带书签 下载地址

    “人物”通常指的是通讯录管理,“位置”则是指GPS定位功能。本书通过实例展示了如何使用iPhone内置的API来访问用户的通讯录数据和获取地理位置信息。 #### 三、高级特性与实践 **3.1 iPhone 3.0 SDK新增特性** ...

    iPhone CookBook 中文版

    本书还会涉及iOS特有的功能,如GPS定位、推送通知、多媒体处理、多任务处理等,让你能够创建出功能丰富的移动应用。同时,你将学习到如何利用Core Animation和Auto Layout来实现流畅的动画效果和自适应布局,以确保...

    iOS6 编程实战(英)

    9. 位置服务和地图:学习如何在应用中集成和使用GPS定位和MapKit框架。 10. 网络编程:包括使用URL Sessions进行HTTP通信以及如何处理JSON和XML数据。 11. 并发和多线程编程:指导如何在iOS开发中有效管理多任务,...

    AMap_iOS_Loc_SDK_Demo

    1. **高德地图iOS定位SDK**:高德地图为开发者提供的服务,用于获取用户的地理位置信息,支持GPS、WiFi、基站等多种定位方式,具有定位精度高、功耗低的特点。 2. **实时定位**:SDK允许应用获取用户实时的位置信息...

    智能手机维修入门篇定义.pdf

    - 分析包括主处理、存储、蓝牙、移动数字电视、FM收音机、GPS、照相机、显示背光、通话振铃、电源、USB接口、键盘、SIM卡与SD卡、天线开关、射频功放、收发处理、基带处理和时钟电路等关键单元。 7. **品牌智能...

    从零开始学iOS7开发系列3-我的地盘我做主-Cha11

    获取GPS坐标后,通过`CLGeocoder`进行**反向地理编码(reverse geocoding)**,将坐标转换为人类可读的街道地址。 2. **Map Kit**:Map Kit框架允许开发者在应用中集成地图功能,包括显示地图、标注地点、导航等。在...

    Android程序设计基础

     如今,市场上已经有了许多移动平台,包括Symbian、iPhone、Windows Mobile、BlackBerry、Java Mobile Edition和Linux Mobile(LiMo)等。当我向别人说起Android时,他们的第一个疑问通常是:我们为什么还需要另一...

    IOS 4 COOKBOOK

    《iOS 4 Cookbook》是一本专注于iOS 4开发的实战指南,旨在为开发者提供一系列具体的示例和解决方案。这本书以实例驱动的方式,深入浅出地介绍了如何在iOS平台上构建应用程序,特别适合那些希望通过实践来学习iOS...

Global site tag (gtag.js) - Google Analytics