IOS Core Location 定位功能

2024-06-01 15:48
文章标签 功能 core 定位 ios location

本文主要是介绍IOS Core Location 定位功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Core Location可以利用三种技术来实现该功能:

  1. 蜂窝基站三角网定位根据手机所属范围内的手机基站的位置进行计算来确定当前位置。蜂窝基站三角网定位在城市和其他手机基站密度较高的区域非常准确,而在基站较为稀疏的区域则不太精确。
  2. GPS是三种技术中最为精确的,任何具有3G数据链接的设备还包含一个GPS单元,GPS读取来自多个卫星的微波信号来确定当前位置。
  3. Wi-Fi定位服务(WPS)使用Wi-Fi连接的MAC地址,通过参考已知服务提供商及其服务区域的大型数据库来猜测你的位置。WPS是不精确的,并且有时会有数英里的误差。
根据程序的需要,挑选合适的方法。

  • 位置管理器
Core Location API实际上非常易于使用。我们将使用的主类是CLLocationManager,通常称为位置管理器。
 创建一个位置管理器实例
CLLocationManager *locationManager = [[CLLocationManager alloc] init];

要求的Core Location的精度越高,消耗的电量就会越多。
  • 设置所需的精度
下面设置委托和请求指定精度级别的实例:
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.desiredAccuracy该值的单位为米,如果你指定它为10,
则希望尝试确定当前位置10米范围之内的区域。
  • 设置距离筛选器
默认情况下,位置管理器将通知委托任何检测到的在位置方面的更改。
距离筛选器也是以米为单位进行设置的。
locationManager.distanceFilter = 1000.0f;
  • 启动位置管理器
[locationManager startUpdatingLocation];
  • 更明智地使用位置管理器
如果只需要确定当前位置而不需要连续轮询位置,则当它获取应用程序所需的信息之后,
你应该让位置委托停止位置管理器。
只要你从位置管理器获得更新,就会消耗拥用户的电池。
位置管理器停止向其委托发送更新:
[locationManager stopUpdatingLocation];
  • 位置管理器委托
位置管理器委托必须符合CLLocationManagerDelegate协议,该协议定义了两种方法, 
当位置管理器已经确定位置或者 当它检测到位置的更改时将调用其中一个方法,
当位置管理器遇到错误时将调用另一个方法。
  • 获取位置更新
当位置管理器希望通知其委托当前位置时,它将调用locationManager:didUpdateToLocation:fromLocation:方法。
该方法接受3个参数。
第一个参数是调用该方法的位置管理器。
第二个参数是定义设备的当前位置的一个CLLocation对象。
第三个参数是上次更新定义之前的位置的一个CLLocation对象。第一次调用该方法时,以前的位置对象将为nil;
  • 使用CLLocation获取纬度和经度
纬度和经度存储在一个名为coordinate的属性中。
CLLocationDegrees latitude = theLocation.coordinate.latitude;
CLLocationDegrees longitude = theLocation.coordinate.longitude;

horizontalAccuracy属性描述以coordinate作为其圆的半径,值越大,Core Location所确定的位置就越不确定。

altitude属性是海平面以上或以下多少米:
CLLocationDegreesaltitude = theLocation.altitude;

除了这些属性之外,CLLocation还有一个非常有用的实例方法,该方法将允许你确定两个CLLocation对象之间的距离。
CLLocationDegrees distance = [fromLocation distanceFromLocation : toLocation];
返回的distance值将是大圆计算的结果,该计算忽略了海波属性,并且假设这两个点处于同一海平面来计算该距离。
  • 错误通知
如果Core Location无法确定你的当前位置,它会调用另一个名为locationManager:didFailwithError:的委托方法。
最有可能的错误原因是用户拒绝访问。 位置管理器的使用必须由用户进行授权。


在xcode工程Frameworks文件夹种添加CoreLocation.framework


上代码。。。

先在BIDViewController_iPhone.xib中创建12个label

BIDViewController.h

//
//  BIDViewController.h
//  CoreLocationTest
//
//  Created by ex next on 13-8-8.
//  Copyright (c) 2013年 ex next. All rights reserved.
//#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>@interface BIDViewController : UIViewController<CLLocationManagerDelegate>@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *startingPoiont;
@property (strong, nonatomic) IBOutlet UILabel *latitudeLabel;
@property (strong, nonatomic) IBOutlet UILabel *longitudeLabel;
@property (strong, nonatomic) IBOutlet UILabel *horizontalAccuracyLabel;
@property (strong, nonatomic) IBOutlet UILabel *altitudeLabel;
@property (strong, nonatomic) IBOutlet UILabel *verticalAccuracyLabel;
@property (strong, nonatomic) IBOutlet UILabel *distanceTraveledLabel;@end

BIDViewController.m

//
//  BIDViewController.m
//  CoreLocationTest
//
//  Created by ex next on 13-8-8.
//  Copyright (c) 2013年 ex next. All rights reserved.
//#import "BIDViewController.h"@interface BIDViewController ()@end@implementation BIDViewController
@synthesize locationManager;
@synthesize startingPoiont;
@synthesize latitudeLabel;
@synthesize longitudeLabel;
@synthesize horizontalAccuracyLabel;
@synthesize altitudeLabel;
@synthesize verticalAccuracyLabel;
@synthesize distanceTraveledLabel;- (void)viewDidLoad
{[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.//配置位置管理器self.locationManager = [[CLLocationManager alloc] init];locationManager.delegate = self;locationManager.desiredAccuracy = kCLLocationAccuracyBest;[locationManager startUpdatingLocation];
}- (void)viewDidUnload
{//清除输出口[self viewDidUnload];self.locationManager = nil;self.latitudeLabel = nil;self.longitudeLabel = nil;self.horizontalAccuracyLabel = nil;self.altitudeLabel = nil;self.verticalAccuracyLabel = nil;self.distanceTraveledLabel = nil;
}- (void)didReceiveMemoryWarning
{[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}#pragma mark -
#pragma mark CLLocationManagerDelegate Methods
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{if (startingPoiont == nil) {self.startingPoiont = newLocation;}NSString *latitudeString = [NSString stringWithFormat:@"%g\u00B0",newLocation.coordinate.latitude];latitudeLabel.text = latitudeString;NSString *longitudeString = [NSString stringWithFormat:@"%g\u00B0",newLocation.coordinate.longitude];longitudeLabel.text = longitudeString;NSString *horizontalAccuracyString = [NSString stringWithFormat:@"%gm",newLocation.horizontalAccuracy];horizontalAccuracyLabel.text = horizontalAccuracyString;NSString *altitudeString = [NSString stringWithFormat:@"%gm",newLocation.altitude];altitudeLabel.text = altitudeString;NSString *verticalAccuracyString = [NSString stringWithFormat:@"%gm",newLocation.verticalAccuracy];verticalAccuracyLabel.text = verticalAccuracyString;CLLocationDistance distance = [newLocation distanceFromLocation:startingPoiont];NSString *distanceString = [NSString stringWithFormat:@"%gm",distance];distanceTraveledLabel.text = distanceString;
}- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{NSString *errorType = (error.code == kCLErrorDenied)?@"Access Denied" : @"Unknown Error";UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error getting Locatin"message:errorTypedelegate:nilcancelButtonTitle:@"Okay" otherButtonTitles: nil];[alert show];
}@end



这篇关于IOS Core Location 定位功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021435

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

GNSS CTS GNSS Start and Location Flow of Android15

目录 1. 本文概述2.CTS 测试3.Gnss Flow3.1 Gnss Start Flow3.2 Gnss Location Output Flow 1. 本文概述 本来是为了做Android 14 Gnss CTS 的相关环境的搭建和测试,然后在测试中遇到了一些问题,去寻找CTS源码(/cts/tests/tests/location/src/android/locat

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

Spring+MyBatis+jeasyui 功能树列表

java代码@EnablePaging@RequestMapping(value = "/queryFunctionList.html")@ResponseBodypublic Map<String, Object> queryFunctionList() {String parentId = "";List<FunctionDisplay> tables = query(parent

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序