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

news/2025/9/26 15:06:53/文章来源:https://www.cnblogs.com/HarmonyOSSDK/p/19113519

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

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

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

1

开发步骤

  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.mzph.cn/news/918432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PP-OCRv5 C++ 基准测试工具:打造高性能OCR评测标杆 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

自定义中间件进入管道中执行队列的流程

自定义中间件进入管道中执行队列的流程 1. 自定义中间件类的标准写法 public class CustomLoggingMiddleware {private readonly RequestDelegate _next;// 1. 构造函数必须包含 RequestDelegate next 参数public Cust…

网站推广的常用途径有哪些网站ftp需要关闭

一、集成测试和系统测试的区别 (一)测试的目的 • 集成测试:主要目的是验证各个模块组合在一起后,它们之间的接口和交互是否正确,是否能够按照设计要求协同工作,以确保系统的稳定性和可靠性,重…

做一个回收网站怎么做免费网站建

当人用眼睛看事物的时候,会感觉到近处的东西是比远处的东西要大一些的,通俗的说,这就是透视。 总的来说。透视变换是将3D的世界转换到2D图像上的一种手段,人的视觉系统和摄像头视觉系统也是基于这一工作原理。 对透视变化的研究&a…

ps做产品的网站怎么做免费的产品图片网站

大家好,今天来聊聊论文降重隐藏字符怎么识别,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 论文降重隐藏字符的识别方法 一、引言 在论文降重过程中&#xff…

翻斗幼儿园历险记-CTF-WP

翻斗幼儿园历险记 一、搭建: docker-compose up -d 运行那个docker-compose.yml文件即可打开127.0.0.1:32777就运行好了2、打法 文件上传前端过滤,bp抓包改后缀即可盲猜一波,上传的目录是/uploads下面 哥斯拉连上马…

.net8+winform+Antdui 制作 LOL 小助手

.net8+winform+Antdui 制作 LOL 小助手 .net8+winform+Antdui 制作 LOL 小助手 一、事件起因 二、筹备工作 三、查看效果 四、后期拓展想法 一、事件起因 本人 lol 菜鸡一枚,最近天天玩排位模式,有时候自己分路有优势…

深入解析:【Git】Git 简介及基本操作

深入解析:【Git】Git 简介及基本操作pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

hutool主要内容list

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅 Hutool = Hu + tool,是原公司项目底层代码剥离后的开源库,“Hu”是公司名称的表示,too…

做图赚钱的网站有哪些中国能源建设集团有限公司是央企

QDomDocument类代表了一个XML文件 QDomDocument类代表整个的XML文件。概念上讲:它是文档树的根节点,并提供了文档数据的基本访问方法。由于元素、文本节点、注释、指令执行等等不可能脱离一个文档的上下文,所以文档类也包含了需要用来创建这些…

Kurt-Blender零基础教程:第2章:建模篇——第3节:陈列/父子级/蒙皮/置换修改器与小狐狸角色建模 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站建设的目标客户分析建做网站

使用 Yelp 数据集进行用户画像(User Profiling)是一项有趣的任务,可以理解用户的偏好、行为和特征。以下是总结的一个基本的步骤,帮助构建用户画像 pandas 加载数据: import pandas as pd# 加载数据 users pd.read_…

中职示范校建设专题网站如何建微网站

根本原因分析中的5WHY分析法是从下列哪几个层面实施的? A. 制造角度 B. 检验角度 C. 体系角度 D. 以上都是 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案

20250916_QQ_Powershell

流量分析, 应急响应, WebShell, Powshell, XORTags:流量分析,应急响应,WebShell,Powshell,XOR 0x00. 题目 找出受攻击主机回连的IP地址和端口号 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh…

完整教程:HTTP安全响应头--CSP(Content-Security-Policy)

完整教程:HTTP安全响应头--CSP(Content-Security-Policy)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

学习:uniapp全栈微信小程序vue3后台(26) - 指南

学习:uniapp全栈微信小程序vue3后台(26) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

HTML5介绍(HTML5特性、HTML5功能) - 指南

HTML5介绍(HTML5特性、HTML5功能) - 指南2025-09-26 14:50 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: blo…

Experiment1

Experiment 1 实验任务1 1.1 #include <stdio.h> int main() {printf(" O \n");printf("<H>\n");printf("I I\n");printf(" O \n");printf("<H>\n&qu…

读书笔记:Oracle 自动索引:让数据库自己管索引?

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学…

海安县建设局网站先备案还是先做网站

分类目录&#xff1a;《系统学习Python》总目录 文章《系统学习Python——装饰器&#xff1a;“私有“和“公有“属性案例-[实现私有属性]》中的代码有点复杂&#xff0c;并且你最好自己跟踪运行它&#xff0c;看看它是如何工作的。然而为了帮助你理解&#xff0c;这里给出一些…