华为地图服务 - 如何开启和展示“我的位置”? -- HarmonyOS自学10

一. 场景介绍

本章节将向您介绍如何开启和展示“我的位置”功能,“我的位置”指的是进入地图后点击“我的位置”显示当前位置点的功能。效果如下:

cke_3520.png

二. 接口说明

“我的位置”功能主要由MapComponentController的方法实现,更多接口及使用方法请参见接口文档。

方法名

描述

setMyLocationEnabled(myLocationEnabled: boolean): void

“我的位置”图层功能开关,默认使用系统的连续定位能力显示用户位置。开关打开后,“我的位置”按钮默认显示在地图的右下角。点击“我的位置”按钮,将会在屏幕中心显示当前定位,以蓝色圆点的形式呈现。

setMyLocationControlsEnabled(enabled: boolean): void

设置是否启用“我的位置”按钮。只显示按钮,在不开启“我的位置”图层功能的情况下,点击按钮没反应。

setMyLocation(location: geoLocationManager.Location): void

设置“我的位置”坐标。

setMyLocationStyle(style: mapCommon.MyLocationStyle): Promise<void>

设置“我的位置”样式。

on(type: 'myLocationButtonClick', callback: Callback<void>): void

“我的位置”按钮点击事件回调。

三. 开发步骤

1. 开启“我的位置”按钮

  1. 启用“我的位置”之前,您需要确保您的应用可以获取用户定位。获取用户定位有两种方式:

    方式一(推荐):使用安全控件LocationButton。

    方式二:申请ohos.permission.LOCATION和ohos.permission.APPROXIMATELY_LOCATION权限,您需要在module.json5配置文件中声明所需要的权限,具体可参考声明权限。

     
    1. {
    2. "module" : {
    3. // ...
    4. "requestPermissions":[
    5. {
    6. // 允许应用在前台运行时获取位置信息
    7. "name" : "ohos.permission.LOCATION",
    8. // reason需要在/resources/base/element/string.json中新建
    9. "reason": "$string:location_permission",
    10. "usedScene": {
    11. "abilities": [
    12. "EntryAbility"
    13. ],
    14. "when":"inuse"
    15. }
    16. },
    17. {
    18. // 允许应用获取设备模糊位置信息
    19. "name" : "ohos.permission.APPROXIMATELY_LOCATION",
    20. // reason需要在/resources/base/element/string.json中新建
    21. "reason": "$string:approximately_location_permission",
    22. "usedScene": {
    23. "abilities": [
    24. "EntryAbility"
    25. ],
    26. "when":"inuse"
    27. }
    28. }
    29. ]
    30. }
    31. }
  2. 初始化地图并获取MapComponentController地图操作类对象。显示地图章节中有详细讲解。
  3. 调用mapController对象的setMyLocationEnabled方法启用“我的位置”功能。

    1)如果是通过方式二申请用户定位权限,可以在点击安全控件后打开地图,并开启“我的位置”功能。

     
    1. // 启用我的位置图层
    2. this.mapController.setMyLocationEnabled(

      true

      );
    3. // 启用我的位置按钮
    4. this.mapController.setMyLocationControlsEnabled(

      true

      );
    2)如果是通过方式一申请用户定位权限,建议在获得用户授权后开启“我的位置”功能。
     
    1. import { abilityAccessCtrl, bundleManager, common, PermissionRequestResult, Permissions } from '@kit.AbilityKit';
    2. import { BusinessError } from '@kit.BasicServicesKit';
    3. // 校验应用是否被授予定位权限,可以通过调用checkAccessToken()方法来校验当前是否已经授权。
    4. async checkPermissions(): Promise<boolean> {
    5. const permissions: Array<Permissions> = ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'];
    6. for (let permission of permissions) {
    7. let grantStatus: abilityAccessCtrl.GrantStatus = await this.checkAccessToken(permission);
    8. if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
    9. // 启用我的位置图层,mapController为地图操作类对象,获取方式详见显示地图章节
    10. this.mapController?.setMyLocationEnabled(true);
    11. // 启用我的位置按钮
    12. this.mapController?.setMyLocationControlsEnabled(true);
    13. return true;
    14. }
    15. }
    16. return false;
    17. }
    18. // 如果没有被授予定位权限,动态向用户申请授权
    19. requestPermissions(): void {
    20. let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    21. atManager.requestPermissionsFromUser(getContext() as common.UIAbilityContext, ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'])
    22. .then((data: PermissionRequestResult) => {
    23. // 启用我的位置图层
    24. this.mapController?.setMyLocationEnabled(true);
    25. })
    26. .catch((err: BusinessError) => {
    27. console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
    28. })
    29. }
    30. async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
    31. let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    32. let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
    33. // 获取应用程序的accessTokenID
    34. let tokenId: number = 0;
    35. let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
    36. console.info('Succeeded in getting Bundle.');
    37. let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
    38. tokenId = appInfo.accessTokenId;
    39. // 校验应用是否被授予权限
    40. grantStatus = await atManager.checkAccessToken(tokenId, permission);
    41. console.info('Succeeded in checking access token.');
    42. return grantStatus;
    43. }
  4. 检查“我的位置”功能是否成功启用。

    “我的位置”按钮

    cke_20444.png

    默认显示在地图的右下角。点击“我的位置”按钮

    cke_23581.png

    ,将会在屏幕中心显示当前定位,以蓝色圆点的形式呈现,效果如下图所示,效果根据获取到的用户位置会有变化。

    cke_8884.png

  5. 获取用户位置坐标并设置用户的位置。

    Map Kit默认使用系统的连续定位能力,如果您希望定制显示频率或者精准度,可以调用geoLocationManager相关接口获取用户位置坐标(WGS84坐标系)。注意访问设备的位置信息必须申请权限,并且获得用户授权,详情见geoLocationManager。

    下面的示例仅显示一次定位结果,在获取到用户坐标后,调用mapController对象的setMyLocation(location: geoLocationManager.Location)设置用户的位置。setMyLocation接口使用的是WGS84坐标系,如果需要将用户坐标用于其他接口,需将经纬度坐标转换成GCJ02坐标系,详见地图坐标系说明及转换。
     
    1. // 需要引入@kit.LocationKit模块
    2. import { geoLocationManager } from '@kit.LocationKit';
    3. // ...
    4. // 获取用户位置坐标
    5. let location = await geoLocationManager.getCurrentLocation();
    6. // 设置用户的位置
    7. this.mapController.setMyLocation(location);

2. 监听“我的位置”按钮点击事件

通过调用mapController.on(type: 'myLocationButtonClick')方法,设置'myLocationButtonClick'事件监听。设置监听后“我的位置按钮”点击事件自定义,反之不设置则由Map Kit执行点击后默认事件,即地图移动到当前用户位置。

 
  1. this.mapController.on("myLocationButtonClick", () => {
  2. console.info("myLocationButtonClick", `myLocationButtonClick`);
  3. });

3. 隐藏“我的位置”按钮

控制是否显示“我的位置”按钮。

 
  1. this.mapController.setMyLocationControlsEnabled(false);

4. 自定义位置图标样式

通过调用mapController.setMyLocationStyle(style: mapCommon.MyLocationStyle)方法,设置用户位置图标样式。效果如下:

 
  1. let style: mapCommon.MyLocationStyle = {
  2. anchorU: 0.5,
  3. anchorV: 0.5,
  4. radiusFillColor: 0xffff0000,
  5. // icon为自定义图标资源,使用时需要替换
  6. // 图标存放在resources/rawfile,icon参数传入rawfile文件夹下的相对路径
  7. icon: 'test.png'
  8. };
  9. await this.mapController.setMyLocationStyle(style);

cke_13227.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/142295.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

学习笔记(一)

前言 一、对象 1、由类建模而成&#xff0c;是消息、数据和行为的组合 2、可以接收和发送消息&#xff0c;并利用消息进行彼此的交互。消息要包含传送给对象接收的信息 3、类的实例化&#xff1a;把类转换为对象的过程叫类的实例化。 4、对象的特性 (1) 对象有状态&#…

QUIC的loss detection学习

PTO backoff backoff 补偿 /ˈbkɒf/PTO backoff 是QUIC&#xff08;Quick UDP Internet Connections&#xff09;协议中的一种机制&#xff0c;用于处理探测超时&#xff08;Probe Timeout, PTO&#xff09;重传策略 它逐步增加探测超时的等待时间&#xff0c;以避免网络拥塞…

【FreeRTOS】任务

1.使用stm32cubemx配置freertos 2.创建任务 我们需要在MX_FREERTOS_Init()里面创建任务 我们根据上面的任务创建方式&#xff0c;实现GPIO_PIN_10的反转 1.任务句柄 2.任务结构体 3.任务执行函数 4.任务函数声明 5.创建线程执行任务 hal_delay和osDelay区别&#xff1f;…

Qt (17)【Qt 文件操作 读写保存】

阅读导航 引言一、Qt文件概述二、输入输出设备类三、文件读写类四、文件和目录信息类五、自定义“记事本” 引言 在上一篇文章中&#xff0c;我们学习了Qt的事件处理机制&#xff0c;知道了如何响应用户的操作。但应用程序常常还需要处理文件&#xff0c;比如读写数据。所以&a…

应用软件系统开发 实操一:任务需求描述

一、实操一&#xff1a;任务需求描述 软件和信息技术服务业数据统计平台是一个为不同级别管理员提供定制化服务的系统。它主要面向数据管理员和系统运维管理员&#xff0c;每一种用户角色各自拥有特定的功能权限。系统运维管理员是专门针对平台基础功能的管理人员&#xff0c;它…

08_Python数据类型_字典

Python的基础数据类型 数值类型&#xff1a;整数、浮点数、复数、布尔字符串容器类型&#xff1a;列表、元祖、字典、集合 字典 字典&#xff08;Dictionary&#xff09;是一种可变容器模型&#xff0c;它可以存储任意类型对象&#xff0c;其中每个对象都存储为一个键值对。…

如何评估土壤功能?瓦赫宁根大学研究团队在土壤学一区TOP期刊最新成果给出答案!

本文首发于“生态学者”微信公众号&#xff01; 土壤健康是农业可持续发展的关键因素之一&#xff0c;而土壤有机碳&#xff08;Soil Organic Carbon, SOC&#xff09;含量是衡量土壤健康最常用的指标。然而&#xff0c;许多土壤功能不仅受SOC总量的影响&#xff0c;还与其质量…

FreeRTOS学习——链表list

FreeRTOS学习——链表&#xff08;列表&#xff09;list&#xff0c;仅用于记录自己阅读与学习源码 FreeRTOS Kernel V10.5.1 参考大佬的好文章&#xff1a; freertos内核原理 Day1(链表) FreeRTOS-链表的源码解析 *list_t只能存储指向list_item_t的指针。每个list_item_t都…

photozoom classic 9解锁码2024年最新25位解锁码

photozoom classic 9 破解版顾及比恐龙还要稀有&#xff0c;我曾经和你一样一直再找&#xff0c;找了好几个月&#xff0c;也没有找到真的破解版&#xff0c;下载很多次&#xff0c; 都是病毒插件之类的 我昨天下了几次&#xff0c;没有一个不附带插件病毒木马的.......&#x…

基于深度学习的图像分类或识别系统(含全套项目+PyQt5界面)

目录 一、项目界面 二、代码实现 1、网络代码 2、训练代码 3、评估代码 4、结果显示 三、项目代码 一、项目界面 二、代码实现 1、网络代码 该网络基于残差模型修改 import torch import torch.nn as nn import torchvision.models as modelsclass resnet18(nn.Modul…

数据结构(2):LinkedList和链表[2]

我们在上一篇文章中着重讨论了单链表的实现。其中我们要注意单链表进行遍历时一步一步走的思想。那么这篇文章我们将继续讨论链表的更多内容&#xff0c;那就让我们开始吧。 1.经典单链表算法题 我们将通过几个经典的题对单链表进行进一步的认识。 (1)反转链表 206. 反转链…

cas 5.3服务器搭建

项目环境要求 jdk1.8&#xff0c;tomcat8 网盘下载&#xff08;官网下载速度慢可以用此方法下载&#xff09; 网盘链接&#xff1a;8910官网各稳定版本&#xff0c;软件包点击自取 cas5.3git代码 https://github.com/apereo/cas-overlay-template/tree/5.3 刚拉下来的代码目录…

OJ题-反转链表

给你一个单链表的头节点&#xff0c;请反转链表&#xff0c;并返回新的链表 eg&#xff1a; 1,2,3,4,5--->5,4,3,2,1 //反转链表 struct ListNode* reverseList(struct ListNode* head) {//定义三个变量struct ListNode* n1, * n2, * n3;n1 NULL;n2 head;n3 head->n…

鸿蒙开发之ArkTS 基础九 枚举类型

枚举把变量固定在特定的范围内 枚举的语法&#xff1a; enum 枚举名字 { 常量1 值1, 常量1 值1, 常量1 值1, ... } 定义具体如下: 使用具体如下&#xff1a;

centos更改静态ip

点击网络和internet设置 点击更改适配器 、点击属性

【C++题目】1.日期差值

日期差值 题目&#xff1a; 链接&#x1f517;&#xff1a;日期差值 代码&#xff1a; #include <iostream> using namespace std; /* *思路&#xff1a; * 1. 分别求出每一个日期与0000年0月1日距离的天数 * 2. 两个距离天数相减即可得到两个日期相差的天数 *///平年…

宿舍管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 宿舍管理系统拥有三个角色&#xff0c;分别为系统管理员、宿舍管理员以及学生。其功能如下&#xff1a; 管理员&#xff1a;宿舍管理员管理、学生管理、宿舍楼管理、缺勤记录管理、个人密…

【高录用 | EI快检索, IEEE出版】第二届人工智能与自动化控制国际学术会议(AIAC 2024)

会议官网&#xff1a;www.icaiac.org The 2nd International Conference on Artificial Intelligence and Automation Controlwww.icaiac.org 电气电子工程师学会&#xff08;IEEE&#xff09;的英文全称是the Institute of Electrical and Electronics Engineers。作为全球最…

hh exe所选的程序不能与此文件类型相关联。请选择其他程序。

按照hh exe打开chm文件显示所选的程序不能与此文件类型相关联。请选择其他程序。 以上错误来自于 cmd命令行 cd C:\Windows\hh.exe 要打开的chm文件报错 其实根本原因是在设置中.chm文件默认打开方法被其他软件占用了&#xff0c;解决办法只能删除那个软件&#xff0c;如果是W…

认知杂谈68《燃爆!兄弟萌不可错过的人生开挂宝典》

内容摘要​&#xff1a; 生活如舞台&#xff0c;我们要做自己人生的导演兼主演。实现自我成长需打牢基础&#xff0c;如读《认知觉醒》等书并制定成长计划。 要向上生长&#xff0c;定短期和长期目标&#xff0c;学新技能、提升沟通能力&#xff0c;可借助在线平台和社群。用番…