鸿蒙地图功能开发【3. 代码开发】##地图开发##

上海张律师
• 阅读 3

​ 在完成了前期准备工作之后,就可以正式进入到代码开发的工作中,在官方文档中,相关的代码是很全的,从支持的功能上来看,相比于三方SDK更加全面。

基本项目中包含的地图展示、marker、路径规划等都是包括的

那么最基本的就是先展示地图

首先是导入Map Kitk的相关模块

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

然后定义一些基础的变量并在aboutToAppear里初始化

  private mapOptions?: mapCommon.MapOptions;
  private callback?: AsyncCallback<map.MapComponentController>;
  private mapController?: map.MapComponentController;
  private mapEventManager?: map.MapEventManager;

  aboutToAppear(): void {
    // 地图初始化参数,设置地图中心点坐标及层级
    this.mapOptions = {
      position: {
        target: {
          latitude: 39.9,
          longitude: 116.4
        },
        zoom: 10
      }
    };

    // 地图初始化的回调
    this.callback = async (err, mapController) => {
      if (!err) {
        // 获取地图的控制器类,用来操作地图
        this.mapController = mapController;
        this.mapEventManager = this.mapController.getEventManager();
        let callback = () => {
          console.info(this.TAG, `on-mapLoad`);
        }
        this.mapEventManager.on("mapLoad", callback);
      }
    };
  }

最后就是在页面中显示这个地图

  build() {
    Stack() {
      // 调用MapComponent组件初始化地图
      MapComponent({ mapOptions: this.mapOptions, mapCallback: this.callback }).width('100%').height('100%');
    }.height('100%')
  }

虽然从官网上看,这个代码是非常简单的,但是里面有两个很大的坑是要注意的

第一,地图展示的时候,这个配置参数this.mapOptions在初始化的时候是要填入坐标的,如果你的坐标不是写死的,是通过后端或者其他方式异步获取的话,最好在MapComponent外面包一层if,例如if(this.lat != ""),即当你获取到数据以后再去展示地图。或者先给地图设置一个默认的写死的中心点,等获取到数据以后再去更新这个配置参数。

第二,一定要注意经纬度坐标的坐标系。从大家的惯性认知中,既然我是通过原生鸿蒙的Location Kit获取的经纬度坐标,那么当然适用于原生鸿蒙的Map Kit的地图咯。我最近在开发地图相关功能的时候也是这个想法。我最近做的项目是类似于校园配送的app,下单的用户需要去查看配送员的实时位置。配送员的app负责定位,用户的app上查看地图,测试的时候发现,不管我如何调整定位的精度问题和定位的策略,其在配送员app上展示的位置永远是错误的,距离实际位置大概偏差了有1公里多,当时看了很多的代码样例(主要是定位的样例,我一直以为是定位的错误),都找不出问题。最后在大佬的提点下,看了一下文档对于坐标系的说法:

其中定位是这么说的:“本模块能力仅支持WGS-84坐标系”,地图是这么说的“华为地图在中国大陆使用GCJ02坐标系,若使用WGS84坐标系直接叠加在华为地图上,因坐标值不同,展示位置会有偏移。所以,在中国大陆如果使用WGS84坐标调用Map Kit服务,需要先将其转换为GCJ02坐标系再访问。”

所以,如果你使用的是原生鸿蒙的定位能力,那么获取的坐标在地图显示的时候,需要先转成GCJ02坐标系!

代码如下:

  let wgs84Position: mapCommon.LatLng = {
  latitude: 30,
  longitude: 118
};
// 转换经纬度坐标
let gcj02Position: mapCommon.LatLng =
  map.convertCoordinateSync(mapCommon.CoordinateType.WGS84, mapCommon.CoordinateType.GCJ02, wgs84Position);

而且这个说明,是在“地图计算工具” -- “坐标转换”中看到的,其他地图相关文档位置并未看到相关的提醒,这对于开发者其实是不友好的。

最后实现的效果如下(我还加了个marker),那么基础的地图实现就算完成了

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
vue 中使用高德地图, 地图选点
功能简述:网页版高德地图开发,主要支持地图选点(没做导航),搜索选点.(功能类似微信与好友聊天中的选择位置,发送位置,如下图)!(https://img2018.cnblogs.com/blog/1195136/201904/119513620190423112130558812176871.png)第一步:先成为高德地图的开发
Stella981 Stella981
3年前
Google Map 开发(三):Google Map 地点搜索功能
开发国内应用当我们需要使用到地图时,首选肯定是高德地图或者百度地图,这是因为它们的地图功能足够强大,对于开发人员来说,更是因为API封装的完善和简单的调用实现,扩展功能强大。如果要开发全球通用的APP,需要集成地图,我们难免会对需要使用的地图SDK进行一番调研,百度和高德并没有全世界范围的地图数据,在亚洲或许还能使用以下,对于需要全球范围内都要
上海张律师 上海张律师
9小时前
鸿蒙地图功能开发【1. 开发准备】##地图开发##
​对于地图功能的开发,有以下三种思路1.使用鸿蒙官方的MapKit进行开发2.使用第三方地图的SDK(例如高德地图、百度地图)3.做一个基于h5的地图页面,通过Web组件去引入对于这三种方案,每一种都有自己的特点原生的MapKit,目前来看文档是最全面的也
上海张律师 上海张律师
9小时前
鸿蒙地图功能开发【2. 申请Profile文件】##地图开发##
​如果使用鸿蒙的MapKit能力进行地图开发的话,需要在后台的API管理里面打开“地图服务”。如果是在原有项目上增加的话,那么……你需要去申请一个新的Profile文件我们按照新项目的流程去走注:新项目的意思是没有创建过Profile文件,而不是说在Dev
程序员一鸣 程序员一鸣
9小时前
鸿蒙开发:DevEcoStudio中的代码生成
其实大家可以发现,一篇文章下来,都是基于右键后的Generate选项,所以,还是非常的简单的,当然了,还是希望大家,以上的功能,能够应用在实际的开发中,而不是停留在纸面上。
程序员一鸣 程序员一鸣
9小时前
鸿蒙开发:DevEcoStudio中的代码提取
虽然手动复制出来可以实现,但是未免太浪费时间了,本篇文章就告诉大家一个便捷的方式来实现,那就是DevEcoStudio中的代码提取。
鸿蒙小林 鸿蒙小林
2小时前
《仿盒马》app开发技术分享-- 定位获取(25)
技术栈Appgalleryconnect开发准备上一节我们实现了地址管理页面的数据查询和展示,接下来我们要实现的功能是地址添加相关的,我们想实现的功能是地图选点,那么在地图选点之前我们要做的就是先获取用户当前的定位。获取定位后我们拿到经纬度和其他信息,然后
鸿蒙小林 鸿蒙小林
2小时前
《仿盒马》app开发技术分享-- 地图选点(27)
技术栈Appgalleryconnect开发准备上一节我们实现了地图的简单展示,这一节我们要实现的内容是,根据展示的地图,实现当前定位功能,当前位置的poi地址功能,以及列表的展示,给地图添加标记,展示自己的当前定位功能分析要想实现这些功能,首先我们需要在
陈杨 陈杨
4星期前
鸿蒙5开发宝藏案例分享---一多开发实例(地图导航)
🌟鸿蒙开发隐藏宝藏大公开!手把手教你玩转"一多"地图导航案例🌟大家好呀!我是你们的老朋友,今天要给大家扒一扒鸿蒙官方文档里那些"藏得深"的实战案例!最近在肝鸿蒙项目时意外发现了这个地图导航的"一多"开发实例,简直像发现新大陆!这就带大家沉浸式体验这个超