当前位置: 首页 > news >正文

融合多元定位技术,帮助应用破解精准定位难题

从查阅天气到记录运动轨迹,从打车到路径规划等,移动终端已深入人们日常生活的方方面面,看似简单的操作背后,都依赖于精准的定位技术。对于应用开发者,位置数据的实时性与准确性直接决定用户体验。当前主流定位技术正面临两难选择:GPS等卫星定位虽能实现<5米的高精度,却需长时间开启硬件模块,导致设备耗电量激增,且冷启动时受卫星信号搜索、数据计算影响,等待时长普遍达10-30秒;而基站/Wi-Fi定位虽能秒级响应并降低功耗,但精度可能扩大至百米级,难以支撑精准导航等深度场景。

HarmonyOS SDK位置服务(Location Kit)的位置子系统使用多种定位技术提供服务,如GNSS定位、基站定位、WLAN/蓝牙定位(基站定位、WLAN/蓝牙定位后续统称"网络定位技术");通过这些定位技术,无论用户设备在室内或是户外,都可以较为准确地确定设备位置。

Location Kit除了提供基础的定位服务之外,还提供了地理围栏、地理编码、逆地理编码、国家码等功能和接口。

开发步骤

  1. 获取设备的位置信息,需要有位置权限,位置权限申请的方法和步骤见申请位置权限开发指导。

  2. 导入geoLocationManager模块,所有与基础定位能力相关的功能API,都是通过该模块提供的。

    import { geoLocationManager } from ‘@kit.LocationKit’;

  3. 调用获取位置接口之前需要先判断位置开关是否打开。

查询当前位置开关状态,返回结果为布尔值,true代表位置开关开启,false代表位置开关关闭,示例代码如下:

import { geoLocationManager } from '@kit.LocationKit';
try {let locationEnabled = geoLocationManager.isLocationEnabled();
} catch (err) {console.error("errCode:" + err.code + ", message:"  + err.message);
}

如果位置开关未开启,可以拉起全局开关设置弹框,引导用户打开位置开关,具体可参考拉起全局开关设置弹框。

  1. 单次获取当前设备位置。多用于查看当前位置、签到打卡、服务推荐等场景。

方式一:获取系统缓存的最新位置。

如果系统当前没有缓存位置会返回错误码。

推荐优先使用该接口获取位置,可以减少系统功耗。

如果对位置的新鲜度比较敏感,可以先获取缓存位置,将位置中的时间戳与当前时间对比,若新鲜度不满足预期可以使用方式二获取位置。

import { geoLocationManager } from '@kit.LocationKit';
import { BusinessError } from '@kit.BasicServicesKit'
try {let location = geoLocationManager.getLastLocation();
} catch (err) {console.error("errCode:" + JSON.stringify(err));
}

方式二:获取当前位置。

首先要实例化SingleLocationRequest对象,用于告知系统该向应用提供何种类型的位置服务,以及单次定位超时时间。

  1. 设置LocatingPriority:

如果对位置的返回精度要求较高,建议LocatingPriority参数优先选择PRIORITY_ACCURACY,会将一段时间内精度较好的结果返回给应用。

如果对定位速度要求较高,建议LocatingPriority参数选择PRIORITY_LOCATING_SPEED,会将最先拿到的定位结果返回给应用。

两种定位策略均会同时使用GNSS定位和网络定位技术,以便在室内和户外场景下均可以获取到位置结果,对设备的硬件资源消耗较大,功耗也较大。

  1. 设置locatingTimeoutMs:

因为设备环境、设备所处状态、系统功耗管控策略等的影响,定位返回的时延会有较大波动,建议把单次定位超时时间设置为10秒。

以快速定位策略(PRIORITY_LOCATING_SPEED)为例,调用方式如下:

import { geoLocationManager } from '@kit.LocationKit';
import { BusinessError } from '@kit.BasicServicesKit'
let request: geoLocationManager.SingleLocationRequest = {'locatingPriority': geoLocationManager.LocatingPriority.PRIORITY_LOCATING_SPEED,'locatingTimeoutMs': 10000
}
try {geoLocationManager.getCurrentLocation(request).then((result) => { // 调用getCurrentLocation获取当前设备位置,通过promise接收上报的位置console.info('current location: ' + JSON.stringify(result));}).catch((error:BusinessError) => { // 接收上报的错误码console.error('promise, getCurrentLocation: error=' + JSON.stringify(error));});} catch (err) {console.error("errCode:" + JSON.stringify(err));}

通过本模块获取到的坐标均为WGS-84坐标系坐标点,如需使用其它坐标系类型的坐标点,请进行坐标系转换后再使用。

可参考Map Kit提供的地图计算工具进行坐标转换。

  1. 持续定位。多用于导航、运动轨迹、出行等场景。

首先要实例化ContinuousLocationRequest对象,用于告知系统该向应用提供何种类型的位置服务,以及位置结果上报的频率。

设置locationScenario

建议locationScenario参数优先根据应用的使用场景进行设置,该参数枚举值定义参见UserActivityScenario,例如地图在导航时使用NAVIGATION参数,可以持续在室内和室外场景获取位置用于导航。

设置interval

表示上报位置信息的时间间隔,单位是秒,默认值为1秒。如果对位置上报时间间隔无特殊要求,可以不填写该字段。

以地图导航场景为例,调用方式如下:

import { geoLocationManager } from '@kit.LocationKit';
let request: geoLocationManager.ContinuousLocationRequest= {'interval': 1,'locationScenario': geoLocationManager.UserActivityScenario.NAVIGATION
}
let locationCallback = (location:geoLocationManager.Location):void => {console.info('locationCallback: data: ' + JSON.stringify(location));
};
try {geoLocationManager.on('locationChange', request, locationCallback);
} catch (err) {console.error("errCode:" + JSON.stringify(err));
}

如果不主动结束定位可能导致设备功耗高,耗电快;建议在不需要获取定位信息时及时结束定位。

// 该回调函数需要与on接口传入的回调函数保持一致。
geoLocationManager.off('locationChange', locationCallback);

了解更多详情>>

访问位置服务联盟官网

获取位置服务开发指导文档

http://www.dtcms.com/a/412221.html

相关文章:

  • 网站产品优化方案个人网站免费模板下载
  • Qt(制作一个简单的文本编辑器)
  • 北京中国建设部网站首页wordpress fonts.googleapi
  • 建设网站需要哪些东西阳江网络问政平台回复查询
  • 积极参与网站信息建设工作wordpress 制作安装包
  • 提供网站建设课程报告wordpress可以用火车头采集
  • 网站数据库到期校园网设计方案
  • 深入解析 MySQL 时间类型:选择与应用
  • 测试策略:同中有异的项目测试经验教训
  • h5个人博客网站模板上海微信网站制作哪家专业
  • 建设网站坂田哪个做简历的网站比较好
  • 网站备案icp备案wordpress全站伪静态
  • 学术论文 Word 样式规范
  • 力扣每日一题 611. 有效三角形的个数
  • 枣庄网站开发招聘中山发布微信公众号
  • 电子商务系统网站设计p2p网站制作流程
  • wordpress 手机 app台州百度搜索优化
  • 【读书笔记】深入理解JVM C6-9 虚拟机执行子系统
  • 化妆品行业的网站开发网站建设实训报告模版
  • 赤峰网站建设做新媒体广告的网站
  • 网站开发的毕业周记扬州城乡建设局网站
  • PS中的{#,N#}
  • 深度学习o
  • 咸阳网站建设公司电话wordpress读取数据库
  • 图书翻页的动画 做网站启动用dw网页设计心得体会
  • 拆解爆款内容的三维切片:从0到1直接套用
  • OpenAI 实现额外传参
  • 概念详解:单分支开发VS多分支开发
  • 先做网站后备案吗建设网站哪家便宜
  • 男女性做那个视频网站微信小程序广告投放价格表