HarmonyOS 地图服务:深度解析其丰富功能与精准导航实力

本文主要是介绍HarmonyOS 地图服务:深度解析其丰富功能与精准导航实力,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 前期准备
  • 打造个性化地图:聚焦创建地图功能
    • 导入`Map Kit`相关模块
    • 通过`MapOptions`初始化地图
      • 切换地图类型
      • 设置地图中心点及层级
      • 展示定位按钮
      • 展示比例尺
      • 指定地图的日间夜间模式
    • 通过`MapComponentController`对象方法控制地图
      • 切换地图类型
      • 开启3D建筑图层
      • 在指定的持续时间内以动画的形式更新相机状态
      • 在指定的持续时间内以动画的形式更新相机状态,并返回动画结果
      • 设置地图的日间夜间模式
      • 地图前后切换
    • 地图不显示异常排查和处理

在当今高度数字化时代,精准的地图服务已然成为我们日常生活与工作中不可或缺的重要组成部分。无论是日常出项规划路线,还是在工作中进行位置定位于导航,地图服务都发挥着关键作用。而HarmonyOS提供的地图服务(Map Kit)犹如一颗璀璨的明星,为开发者提供强大而便捷的地图能力,助力全球开发者实现个性化显示地图、位置搜索和路径规划等功能。地图服务(Map Kit)提供了全球3.2亿的Poi(Point of interest,兴趣点),在地图中一个Poi代表一家商铺、一栋办公楼、一处景点等等。其强大的功能涵盖创建地图、地图交互、在地图上绘制、位置搜索、路径规划、静态图、地图Picker、通过Petal地图应用实现导航等能力、地图计算工具等等,为用户提供了全方位的地图服务体验。具有广泛的应用场景,如物流配送、旅游出行、智能交通等等。

在接下来的内容中,将深入且全面地阐述地图服务所具备的创建地图这一重要功能。通过逐步剖析创建地图功能的具体实现方式,从技术层面解读其背后的原理和机制,深入探讨这一功能在不同场景下的实际应用价值,为开发者在实际应用中更好地利用这一功能提供有力的支持和指导。

前期准备

实际应用开发中,当你打算使用地图服务(Map Kit)时,首先需要在AppGallery Connect平台上创建相应的应用。在创建完成后,要准确地获取“项目设置 > 常规 > 应用”的Client ID,这里需要特别注意的是,一定不能获取项目的Client ID,两者有着明确的区分。获取正确的Client ID之后,接下来要在工程entry模块的module.json5文件中进行特定的操作。具体而言,就是要在这个文件中新增metadata,将其配置为name属性设置为client_idvalue属性为获取到的Client ID值。

在这里插入图片描述

{"module": {..."metadata": [{"name": "client_id","value": "xxxxxx"}]}
}

当完成Client ID的配置工作后,接下来还需要在AppGallery Connect平台该应用的“项目设置 > API管理”板块中打开地图服务开关。

在这里插入图片描述

除了满足以上两个条件,还需要为应用添加公钥指纹,才能够确保地图服务(Map Kit)在应用中正常使用和发挥其强大的功能。

  • 在DevEco Studio中使用自动签名,对应用进行签名。

在这里插入图片描述

  • 在AppGallery Connect平台“项目设置 > 常规 > 应用”下的SHA256证书/公钥指纹中添加公钥指纹,勾选证书名称为auto_debug_xxxx的证书。

在这里插入图片描述

在这里插入图片描述

打造个性化地图:聚焦创建地图功能

HarmonyOS为开发者和用户带来了强大的地图功能支持,其中包括地图组件MapComponent以及地图组件的主要功能入口类MapComponentController

MapComponent在整个体系中扮演着至关重要的角色,它能够在应用程序的页面中以直观、清晰的方式呈现地图。无论是在导航类应用中为用户指引方向,还是在生活服务类应用中展示周边的地理信息,MapComponent都能发挥出其独特的优势,将丰富的地图内容呈现在用户眼前。

MapComponentController则作为地图操作的核心枢纽,承担着众多关键任务。它可以实现地图类型的灵活切换,比如在标准地图和空地图之间自由切换,以满足不同场景下的需求。同时,还能够精确地改变地图状态,通过调整中心点坐标和缩放级别,让用户可以聚焦于特定的区域,获取更详细的地理信息。此外,MapComponentController还支持添加点标记(Marker),可以在地图上标注出重要的地点,方便用户识别和定位。不仅如此,它还能绘制各种几何图形,如MapPolyline(地图折线)、MapPolygon(地图多边形)、MapCircle(地图圆形)等,为用户提供更加丰富的可视化效果。最后,MapComponentController还能监听各类事件,及时响应用户的操作和地图状态的变化,为用户带来更加流畅和智能的交互体验。

接下来,我将和大家一起踏上探索之旅,逐步深入地掌握创建地图功能中一系列重要的操作。首先是如何在应用中成功地显示地图,让丰富的地理信息以清晰直观的形式呈现在我们的眼前。接着,我们将学习如何切换地图类型,无论是标注地图的详细呈现,还是简洁的空地图模式,都能根据实际需求灵活切换。然后,我们还会掌握显示自己位置的方法,以便在任何时候都能准确知晓自己所处的方位。最后,我们将深入了解如何显示自定义地图,根据特定的场景和需求,打造独一无二的地图展示效果,满足个性化的使用需求。

导入Map Kit相关模块

import { MapComponent, mapCommon, map } from '@kit.MapKit';
import { AsyncCallback } from '@kit.BasicServicesKit';

通过MapOptions初始化地图

新建地图需要传入MapOptions参数,MapOptions提供MapComponent组件初始化的属性,用于设置诸如地图中心点坐标、层级等。

MapComponent({ mapOptions: mapCommon.MapOptions, mapCallback: AsyncCallback<map.MapComponentController> })
  • mapOptions:地图初始化参数
let mapOptions: mapCommon.MapOptions = {// 地图类型(可选),默认值为MapType.STANDARD(标准地图),取值还可以是MapType.NONE(空地图)、MapType.TERRAIN(地形图)mapType: mapCommon.MapType.STANDARD,// 地图相机位置(必填)position: {target: { // 地图中心位置的经纬度坐标latitude: 38.5, // 纬度(可选),取值范围:[-90, 90]longitude: 106.2  // 经度(可选),取值范围:[-180, 180]},zoom: 10, // 屏幕中心附近的缩放级别,取值范围:[2, 20],默认值为2tilt: 0,  // 相机的倾斜角度,即相机于垂直于地球表面的线的夹角,取值范围:[0, 75],默认值为0bearing: 0  // 地图以正北方向为0度顺时针旋转的角度,取值范围:[0, 360],默认值0},// 地图展示边界(可选),异常值根据无边界处理// 说明:西南角纬度不能大于东北角纬度bounds: {northeast: {  // 东北角经纬度(可选)latitude: 41.5, // 纬度(可选),取值范围:[-90, 90]longitude: 125.5  // 经度(可选),取值范围:[-180, 180]},southwest: {  // 西北角经纬度(可选)latitude: 37.5, // 纬度(可选),取值范围:[-90, 90]longitude: 100.5  // 经度(可选),取值范围:[-180, 180]}},// 地图最小图层(可选),有效范围:[2, 20],默认为2。异常值按默认值处理minZoom: 2,// 地图最大图层(可选),有效范围:[2, 20],默认值20,异常值按默认值处理maxZoom: 20,// 是否支持旋转手势(可选),默认为true,异常值按默认值处理。true:支持;false:不支持rotateGesturesEnabled: true,// 是否支持滑动手势(可选),默认值为true,异常值按默认值处理。true:支持;false:不支持scrollGesturesEnabled: true,// 是否支持缩放手势(可选),默认值为true,异常值按默认值处理。true:支持;false:不支持zoomGesturesEnabled: true,// 是否支持倾斜手势(可选),默认值为true,异常值按默认值处理。true:支持;false:不支持tiltGesturesEnabled: true,// 是否展示缩放控件(可选),默认值为true,异常值按默认值处理。true:支持;false:不支持zoomControlsEnabled: true,// 是否展示定位按钮(可选),默认值为false,异常值按默认值处理。true:展示;false:不展示myLocationControlsEnabled: false,// 是否展示指南针控件(可选),默认值为true,异常值按默认值处理。true:展示;false:不展示compassControlsEnabled: true,// 是否展示比例尺(可选),默认值为false,异常值按默认值处理。true:展示;false:不展示scaleControlsEnabled: false,// 设置地图和边界的距离(可选),默认值为{ left: 0, top: 0, right: 0, bottom: 0 }padding: {left: 0,  // 在地图左侧增加的填充距离(可选),单位:px,默认值为0top: 0, // 在地图顶部增加的填充距离(可选),单位:px,默认值为0right: 0,   // 在地图右侧增加的填充距离(可选),单位:px,默认值为0bottom: 0 // 在地图底部增加的填充距离(可选),单位:px,默认值为0},// 自定义样式ID(可选)styleId: "xxxxx",// 日间夜间模式(可选),默认值为DayNightMode.DAY(日间模式)dayNightMode: mapCommon.DayNightMode.DAY,// 是否一直显示比例尺(可选),只有比例尺启动时该参数才生效,默认值为false。true:始终显示;false:关闭始终显示// 启动比例尺可以由地图初始化时scaleControlsEnabled属性设置为true// 或者通过setScaleControlsEnabled方法设置为truealwaysShowScaleEnabled: false
};
  • mapCallback:回调函数,返回map.MapComponentController
// 地图初始化的回调
let callback = async (err: BusinessError, mapController: map.MapComponentController) => {if (!err) {// 获取地图的控制器类,用来操作地图this.mapController = mapController;}
}

切换地图类型

Map Kit支持以下三种地图类型:

  • STANDARD:标准地图,展示道路、建筑物以及河流等重要的自然特征。
  • NONE:空地图,没有加载任何数据的地图。
  • TERRAIN:地形图。
// 将默认的标准地图(STANDARD)切换地形图(TERRAIN)
aboutToAppear(): void {// 地图初始化参数,设置地图中心点及层级this.mapOptions = {// 地图类型(可选),默认值为MapType.STANDARD(标准地图),取值还可以是MapType.NONE(空地图)、MapType.TERRAIN(地形图)mapType: mapCommon.MapType.TERRAIN,// 地图相机位置(必填)position: {target: { // 地图中心位置的经纬度坐标latitude: 38.5, // 纬度(可选),取值范围:[-90, 90]longitude: 106.2  // 经度(可选),取值范围:[-180, 180]},zoom: 10, // 屏幕中心附近的缩放级别,取值范围:[2, 20],默认值为2},};
}

在这里插入图片描述

设置地图中心点及层级

aboutToAppear(): void {// 地图初始化参数,设置地图中心点及层级this.mapOptions = {// 地图相机位置(必填)position: {target: { // 地图中心位置的经纬度坐标latitude: 38.5, // 纬度(可选),取值范围:[-90, 90]longitude: 106.2  // 经度(可选),取值范围:[-180, 180]},zoom: 10, // 屏幕中心附近的缩放级别,取值范围:[2, 20],默认值为2},};
}

在这里插入图片描述

展示定位按钮

aboutToAppear(): void {// 地图初始化参数,设置地图中心点及层级this.mapOptions = {// 地图相机位置(必填)position: {target: { // 地图中心位置的经纬度坐标latitude: 38.5, // 纬度(可选),取值范围:[-90, 90]longitude: 106.2  // 经度(可选),取值范围:[-180, 180]},zoom: 10, // 屏幕中心附近的缩放级别,取值范围:[2, 20],默认值为2},// 是否展示定位按钮(可选),默认值为false,异常值按默认值处理。true:展示;false:不展示myLocationControlsEnabled: true};
}

在这里插入图片描述

展示比例尺

aboutToAppear(): void {// 地图初始化参数,设置地图中心点及层级this.mapOptions = {// 地图相机位置(必填)position: {target: { // 地图中心位置的经纬度坐标latitude: 38.5, // 纬度(可选),取值范围:[-90, 90]longitude: 106.2  // 经度(可选),取值范围:[-180, 180]},zoom: 10, // 屏幕中心附近的缩放级别,取值范围:[2, 20],默认值为2},// 是否展示定位按钮(可选),默认值为false,异常值按默认值处理。true:展示;false:不展示myLocationControlsEnabled: true,// 是否展示比例尺(可选),默认值为false,异常值按默认值处理。true:展示;false:不展示scaleControlsEnabled: true};
}

在这里插入图片描述

指定地图的日间夜间模式

aboutToAppear(): void {// 地图初始化参数,设置地图中心点及层级this.mapOptions = {// 地图相机位置(必填)position: {target: { // 地图中心位置的经纬度坐标latitude: 38.5, // 纬度(可选),取值范围:[-90, 90]longitude: 106.2  // 经度(可选),取值范围:[-180, 180]},zoom: 10, // 屏幕中心附近的缩放级别,取值范围:[2, 20],默认值为2},// 是否展示定位按钮(可选),默认值为false,异常值按默认值处理。true:展示;false:不展示myLocationControlsEnabled: true,// 是否展示比例尺(可选),默认值为false,异常值按默认值处理。true:展示;false:不展示scaleControlsEnabled: true,// 日间夜间模式(可选),默认值为DayNightMode.DAY(日间模式),指定为自动模式dayNightMode: mapCommon.DayNightMode.AUTO,};
}

通过MapComponentController对象方法控制地图

切换地图类型

除在地图初始化时指定地图类型外,还可以通过MapComponentController对象的setMapType方法在地图创建后动态设置地图类型。

/*** 设置地图类型* mapType:地图类型*/
setMapType(mapType: mapCommon.MapType): void// 地图初始化的回调
this.callback = async (err, mapController) => {if (!err) {// 获取地图的控制器类,用来操作地图this.mapController = mapController;// 动态设置地图类型this.mapController.setMapType(mapCommon.MapType.TERRAIN);}
}

开启3D建筑图层

调用MapComponentController对象的setBuildingEnabled方法开启3D建筑图层,可通过两个手指向上滑动倾斜地图查看3D建筑图层效果。

// 地图初始化的回调
this.callback = async (err, mapController) => {if (!err) {// 获取地图的控制器类,用来操作地图this.mapController = mapController;// 开启3D建筑图层this.mapController.setBuildingEnabled(true);}
}

在这里插入图片描述

在指定的持续时间内以动画的形式更新相机状态

/*** 在指定的持续时间内以动画的形式更新相机状态。* CameraUpdate: 相机状态将要发生的变化。* duration:动画的持续时间(单位:ms),默认值为250ms,值需大于0,异常值按默认值处理。*/
animateCamera(update: CameraUpdate, duration?: number): void// 地图初始化的回调
this.callback = async (err, mapController) => {if (!err) {// 获取地图的控制器类,用来操作地图this.mapController = mapController;// 新建CameraUpdate对象const cameraPosition: mapCommon.CameraPosition = {target: {latitude: 39.9,longitude: 116.4},zoom: 10};const cameraUpdate: map.CameraUpdate = map.newCameraPosition(cameraPosition);// 在10000ms内以动画的形式移动相机this.mapController.animateCamera(cameraUpdate, 10000);}
}

在这里插入图片描述

在指定的持续时间内以动画的形式更新相机状态,并返回动画结果

/*** 在指定的持续时间内以动画的形式更新相机状态,并返回动画结果* CameraUpdate: 相机状态将要发生的变化。* duration:动画的持续时间(单位:ms),默认值为250ms,值需大于0,异常值按默认值处理。* return Promise<AnimateResult> 动画结果*/
animateCameraStatus(update: CameraUpdate, duration?: number): Promise<AnimateResult>// 地图初始化的回调
this.callback = async (err, mapController) => {if (!err) {// 获取地图的控制器类,用来操作地图this.mapController = mapController;// 新建CameraUpdate对象const cameraPosition: mapCommon.CameraPosition = {target: {latitude: 39.9,longitude: 116.4},zoom: 10};const cameraUpdate: map.CameraUpdate = map.newCameraPosition(cameraPosition);// 在10000ms内以动画的形式移动相机const animateResult = await this.mapController?.animateCameraStatus(cameraUpdate, 10000);console.log(`[AppLogger]动画结果:${JSON.stringify(animateResult)}`);}
}

在这里插入图片描述

设置地图的日间夜间模式

除在地图初始化时指定地图的日间夜间模式,还可以通过MapComponentController对象的setDayNightMode方法在地图创建后动态设置地图的日间夜间模式。

/*** 设置地图的日间夜间模式* mode:日间夜间模式。包含:DAY(日间模式)、NIGHT(夜间模式)、AUTO(自动模式)*/
setDayNightMode(mode: mapCommon.DayNightMode): void// 地图初始化的回调
this.callback = async (err, mapController) => {if (!err) {// 获取地图的控制器类,用来操作地图this.mapController = mapController;// 设置地图为夜间模式this.mapController.setDayNightMode(mapCommon.DayNightMode.NIGHT);}
}

在这里插入图片描述

地图前后切换

// 将地图切换到前台,开发者在绘制地图页面的生命周期onPageShow中调用
onPageShow(): void {if (this.mapController !== undefined) {this.mapController.show();}
}// 将地图切换到后台,开发者在绘制地图页面的生命周期onPageHide中调用
onPageHide(): void {if (this.mapController !== undefined) {this.mapController.hide();}
}

地图不显示异常排查和处理

  • 检查网络状态,设备是否已经正确联网。
  • 检查AppGallery Connnect平台应用是否已经添加公钥指纹,如果重新进行自动签名,需要重新添加公钥指纹,公钥指纹变更后10分钟后生效。
  • 检查module.json5配置文件中是否配置Client ID。
  • 检查AppGallery Connect平台是否开通地图权限,权限开通存在延迟。

这篇关于HarmonyOS 地图服务:深度解析其丰富功能与精准导航实力的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

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

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

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

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

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

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

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

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

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

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象