IOS Augmented Reality增强现实学习笔记 -基于位置

2024-04-23 05:38

本文主要是介绍IOS Augmented Reality增强现实学习笔记 -基于位置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

地图编程和定位是增强现实技术的基础,因此首先学习Location Services
1标准定位(standard location service)
 有两种方式可以监控我们的位置,首先是标准定位。这是一种很普遍的方式,因为所有的ios设备都支持标准定位。首先我们要导入Core Location Framework到我们的工程中,然后把Core Location Framework加入到头文件中,如下所示:


#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface FirstViewController : UIViewController <CLLocationManagerDelegate> {UITextView *locationTextView;
}
@property (nonatomic, retain) IBOutlet UITextView *locationTextView;
@end 

CLLocationManagerDelegate 会将定位信息传给locationManager:didUpdateToLocation:fromLocation: 方法,如果发生错误则会传给
locationManager:didFailWithError:  方法,将这些方法的实现加入到.m文件中


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation*)newLocation
fromLocation:(CLLocation *)oldLocation{


       //Apple建议检查新位置的时间戳,因为有时调用代理方法会有延迟
NSDate* eventDate = newLocation.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];if (abs(howRecent) < 15.0)



locationTextView.text = [NSString stringWithFormat:@"latitude %+.6f, longitude%+.6f\n", 
newLocation.coordinate.latitude,newLocation.coordinate.longitude]; 
       }else{


locationTextView.text = @"Update was old";


      }
}



ok,现在让我们实现启动服务的方法


- (void)startStandardUpdates{
CLLocationManager *locationManager = [[CLLocationManager alloc] init];locationManager.delegate = self; 
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
locationManager.distanceFilter = 500;
[locationManager startUpdatingLocation];  

最后我们在viewDidLoad方法中调用 startStandUpdates方法


- (void)viewDidLoad{
[self startStandardUpdates];
[super viewDidLoad];

这样运行就可以获取到latitude和longitude信息了
1显著位置变化定位(significant-change location service)
 从iOS 4.0之后新加入了significant-change location service服务,它更省电,但是精确度会差一些。
它使用cellular radio代替GPS radio来定位.
使用的方式和标准定位很相似,它也会调用delegate的locationManager:didUpdateToLocation:fromLocation: 方法来传递位置信息。下面是启动significant-change location service的方法:
- (void)startSignificantChangeUpdates {
CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 
locationManager.delegate = self;
[locationManager startMonitoringSignificantLocationChanges];
}

然后在viewDidLoad方法中加入调用:
- (void)viewDidLoad{
//[self startStandardUpdates];
[self startSignificantChangeUpdates];
[super viewDidLoad];

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
两种位置定位总结完后,下面学习地理位置监控服务(Geographic Region Monitoring Service),即当我们进入某一个区域后,系统会识别到,并调用didEnterRegion和didExitRegion方法来处理事件。直接上代码:
- (void)startRegionMonitoring {
NSLog(@"Starting region monitoring");
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(37.787359, -122.408227);
CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:coord radius:1000.0 identifier:@"San Francisco"];
[locationManager startMonitoringForRegion:region desiredAccuracy:kCLLocationAccuracyKilometer];


}
此方法设置(37.787359, -122.408227)为中心,半径1000米的范围为检测区域.之后我们就可以实现didEnterRegion和dieExitRegion方法完成对于进入区域和离开区域的事件的处理了:
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { 
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"区域检测"
message:@"你进入此区域" 
delegate:self
cancelButtonTitle:@"OK" 
otherButtonTitles:nil, nil];
[alert show];
[alert release];
 }

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Region Alert"
message:@"你离开此区域" 
delegate:self
cancelButtonTitle:@"OK" 
otherButtonTitles:nil, nil];
[alert show];
[alert release];
 }

最后一步,即在viewDidLoad中调用startRegionMonitoring方法
- (void)viewDidLoad {
[self startStandardUpdates];
//[self startSignificantChangeUpdates];
if ([CLLocationManager regionMonitoringAvailable]) { // 检查服务是否可用
[self startRegionMonitoring];
} // else do something
[super viewDidLoad]; 
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
本帖最后讲述如何计算改变的距离。此方法只需要将前面standard location service中的方法做稍许改变即可
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
 NSDate* eventDate = newLocation.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow]; 
if (abs(howRecent) < 15.0){
      //locationTextView.text = [NSString stringWithFormat:@"latitude %+.6f, longitude %+.6f\n",newLocation.coordinate.latitude,  newLocation.coordinate.longitude]; 
     CLLocationDistance dist=[newLocation distanceFromLocation:oldLocation]/1000;
     locationTextView.text=[NSString stringWithFormat:@"distance %5.1f traveled"];
         }else{
    locationTextView.text = @"Update was old";
        }
}

这样即可获取到位置的改变值了。










这篇关于IOS Augmented Reality增强现实学习笔记 -基于位置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

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

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

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识