关于iphone定位的基本知识

每个CLLocation对象都有一个叫verticalAccuracy的属性来判断精确度。海拔数值可能会有verticalAccuracy大小的偏差,当verticalAccuracy为负值时,那是Core Location在通知你不能获取海拔高度。  git

1.Getting theUser’s Current Location网络

  获取用户当前位置。iphone

  获取位置的方式有三种:GPS, cell towertriangulation(蜂窝站点), 和 Wi-FiPositioning Service (WPS).其中GPS是最精确的定位方式,可是在第一代iphone上没有。GPS是经过读取不少卫星微波信号来肯定当前位置的。蜂窝站点经过 iphone周围的站点计算出来的,在蜂窝站点密集的地方使用这种技术能够达到一个准确的值,好比在城市但在蜂窝站点不密集的地方效果就没那么好了。最后一个WPS使用的是链接到Wi-Fi网络的IP地址来肯定位置,这将会有较大的偏差。这三种方式都会消耗大量的电。怎么才能即实现定位功能又省电呢?下面的方法就能够解决:当使用Core Location时,能够选择精确度,谨慎的选择你所须要的准确度,能够帮助你省不少电。Core Location使用的技术隐藏在应用程序中。咱们无需选择使用GPS、蜂窝站点技术仍是WPS,咱们只要告诉它咱们须要的准确度它会本身决定选什么技术 来知足咱们的需求。代理

2.The Location Managerrest

Core Location的接口是很容易使用的。主要用到的类是CLLocationManager,就是一般说的Location Manager。为了使用Core Location咱们须要建立Location Manager的实体:对象

CLLocationManager *locationManager =[[CLLocationManager alloc] init];接口

  这样咱们就建立了 Location Manager的实体,可是咱们尚未开始定位。咱们须要指派一个代理给Location Manager。当定位信息改变时Location Manager将调用代理方法。定位的过程会花一段时间平均几秒钟。代理方法必须遵循CLLocationManagerDelegate协议。ip

3.Setting the Desired Accuracyget

  设置代理后,你还要设置须要的准确度。就像咱们刚刚说的精确度越高越耗电。若是你只是要是应用程序肯定是哪一个国家或是哪一个州那么就不要设置很高的精确度。记住一点有时候你并不能获得你须要的精确度。it

  下面说一个设置代理和设置精确度的例子:

locationManager.delegate = self;

locationManager.desiredAccuracy =kCLLocationAccuracyBest;

  精确度使用的是一个double类型的常量。单位是米,因此若是你设置desiredAccuracy=10那么精确度就是10米,这就告诉 Location Manager尽量达到10米的精确度。还能够设置为其余常量:

[cpp]

extern const CLLocationAccuracykCLLocationAccuracyBestForNavigation ;

extern const CLLocationAccuracykCLLocationAccuracyBest;

extern const CLLocationAccuracykCLLocationAccuracyNearestTenMeters;

extern const CLLocationAccuracykCLLocationAccuracyHundredMeters;

extern const CLLocationAccuracykCLLocationAccuracyKilometer;

extern const CLLocationAccuracykCLLocationAccuracyThreeKilometers;4.Setting the Distance Filter

4.Setting the Distance Filter

  默认状况是这样的,每当位置改变时Location Manager就调用一次代理。

  经过设置distance filter能够实现当位置改变超出必定范围时Location Manager才调用相应的代理方法。这样能够达到省电的目的。

  例如:locationManager.distanceFilter =1000.0f;

  若是设置默认值:

locationManager.distanceFilter =kCLDistanceFilterNone;

5.Starting the Location Manager

  开始定位

  当你转备好为定位消耗电池时咱们能够调用

[locationManagerstartUpdatingLocation];

  来告诉 Location Manager开始定位

6.Using the Location Manager Wisely

  若是你只须要肯定当前位置而不须要进一步定位,当LocationManager查询到当前位置时须要通知代理中止定位。

  中止方法: [locationManagerstopUpdatingLocation];

7.The Location Manager Delegate

Location Manager必须遵照CLLocationManagerDelegate协议,CLLocationManagerDelegate协议定义了两个方法,而且这两个方法都是可选的。其中一个方法是当肯定当前位置或是位置信息改变时调用。另外一个方法是当遇到错误信息时调用

8.Getting Location Updates

  当Location Manager想通知它的代理当前位置时,它会调用

locationManager:didUpdateToLocation:fromLocation:方法。

  这个方法有3个参数第一个参数LocationManager。第二个参数是一个CLLocation对象用来肯定当前位置,第三个是CLLocation 对象用来肯定最近一次更新的位置。该方法调用时,先前的location对象会被置空。

9.Getting Latitude and Longitude UsingCLLocation

  经纬度

  位置信息是经过使用CLLocation类的实例从Location Manager那里获得的。这个类有5各属性。latitude和longitude被封装在coordinate属性中。

  获取方式以下:

CLLocationDegrees latitude =theLocation.coordinate.latitude;

CLLocationDegrees longitude =theLocation.coordinate.longitude;

CLLocation对象还能够告诉你精确度。

horizontalAccuracy属性描述调整的中心点。horizontalAccuracy值越大越不精确。

CLLocation 还有一个叫altitude的属性用来表示海拔

CLLocationDistance altitude =theLocation.altitude;

  每个CLLocation对象都有一个叫verticalAccuracy的属性来判断精确度。海拔数值可能会有verticalAccuracy大小的偏差,当verticalAccuracy为负值时,那是Core Location在通知你不能获取海拔高度。

CLLocation的另外一个属性timestamp用来告诉Location Manager是何时定位的。CLLocation还有一个实例方法来告诉你的两个CLLocation对象之间的距离。这个方法叫:getDistanceFrom:

  它是这样工做的:

CLLocationDistance distance =[fromLocation getDistanceFrom:toLocation];

  返回两个时间段内的距离,有时候它是不考虑海拔的,因此要本身计算距离。

10.Error Notifications

  若是Core Location不能指定你当前的位置,它将调用CLLocation的第二个代理方法:locationManager:didFailWithError:,最多见的是用户取消使用定位信息。

相关文章
相关标签/搜索