鸿蒙ArkTS如何接入地图【已解决】

本文介绍了在鸿蒙系统中使用ArkTS开发地图应用遇到的瓶颈,提出通过将HTML页面嵌入鸿蒙APP并利用Web组件来调用地图接口。开发者需注意配置网络权限,如高德地图的网络访问。示例代码展示了如何在HTML中实现地图、标记和信息窗口功能,并在鸿蒙模拟器或真机上运行,以及网络权限的配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

用鸿蒙ArkTS语言开发地图APP应用时,开发出现瓶颈。经过调研,很多地图厂商只接入了鸿蒙Java,就算是有ArkTS版功能也比较少(我的调研不一定全面哈),而自己手动写地图也很麻烦。

解决方法

使用鸿蒙的Web组件,将HTML页面嵌入到鸿蒙APP中。

简单来说就是,各大地图厂商是适配普通Web页面的开发的,那么就用HTML去使用地图接口,鸿蒙 ArkTS 作为壳子。

这个方法可以为很多目前因为鸿蒙不完善而堵塞开发的问题提供一个新思路。

1. 编写HTML(以高德地图为例)

该HTML的功能:1. 创建地图,2. 批量添加标记,3. 点击标记显示信息

可以继续拓展功能......

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
    />
    <title>xxxx</title>
    <style>
      html,
      body,
      #container {
        width: 100%;
        height: 100%;
        margin: 0;
        padding: 0;
      }
    </style>
  </head>

  <body style="position: absolute">
    <div
      id="mapContainer"
      style="width: 100%; height: 100vh; border: 1px solid #000000"
    ></div>

    <script type="text/javascript">
      window._AMapSecurityConfig = {
        securityJsCode: "xxx",
      };
    </script>
    <script src="https://webapi.amap.com/loader.js"></script>

    <script type="text/javascript">
      var AMapStore = {
        AMapBox: "", // 高德地图容器
        map: {},
        marker: [], // 标记
      };

      // 存储地点信息
      const locations = [];

      // 加载高德地图容器
      async function LoaderMap() {
        try {
          const AMap = await AMapLoader.load({
            key: "xxxx", // 请替换成你申请的应用key
            version: "2.0", // 指定要加载的 JS API 的版本
          });
          AMapStore.AMapBox = AMap;
        } catch (e) {
          console.error(e);
        }
      }

      // 建立地图
      async function createMap() {
        AMapStore.map = await new AMapStore.AMapBox.Map("mapContainer", {
          viewMode: "2D",
          zoom: 15.4,
          center: [xx, xx],
        });
      }

      // 标记所有地点
      function AllMapMaker() {
        for (let i = 0; i < locations.length; i += 1) {
          MapMaker(locations[i].coordinates, i, locations[i].name);
        }
      }

      // 标记地图
      function MapMaker(positionNum, num, name) {
        AMapStore.marker.push(
          new AMapStore.AMapBox.Marker({
            icon: "https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png",
            position: [positionNum[0], positionNum[1]],
            title: name,
            offset: new AMapStore.AMapBox.Pixel(-13, -30),
          })
        );

        let infoWindow; // 声明 infoWindow 变量以便在点击地图时进行访问

        // 添加标记点击事件监听器
        AMapStore.marker[num].on("click", () => {
          // 如果之前有打开的信息窗体,则先关闭
          if (infoWindow) {
            infoWindow.close();
          }

          // 创建信息窗体
          infoWindow = new AMapStore.AMapBox.InfoWindow({
            content: `<div style="max-width: 300px;">${locations[num].details}</div>`,
            offset: new AMapStore.AMapBox.Pixel(40.15, -42),
            zIndex: 1000,
          });

          // 打开信息窗体
          infoWindow.open(AMapStore.map, AMapStore.marker[num].getPosition());
        });

        // 添加地图点击事件监听器
        AMapStore.map.on("click", () => {
          // 关闭信息窗体
          if (infoWindow) {
            infoWindow.close();
          }
        });

        AMapStore.map.add(AMapStore.marker[num]);
      }

      // 初始化一切
      async function init() {
        await LoaderMap();
        await createMap();
        await AllMapMaker();
      }

      init();
    </script>
  </body>
</html>

2. 安置HTML文件

在resources下创建rawfile文件夹,将html文件放入即可

3. 接入鸿蒙ArkTS

import web_webview from '@ohos.web.webview';

@Entry
@Component
struct WebComponent {
  webviewController: web_webview.WebviewController = new web_webview.WebviewController();

  build() {
    Column() {
      // 组件创建时,通过$rawfile加载本地文件map.html
      Web({ src: $rawfile("map.html"), controller: this.webviewController })
    }
  }
}

4. 在模拟机或真机运行

在鸿蒙自带的预览器运行会报错

地图加载过程,涉及网络资源获取,需要配置ohos.permission.INTERNET网络访问权限。

以ArkTS的Stage模型为例:

需要在module.json5配置文件中声明权限,添加下列代码即可

{
  "module": {
    ......
    "requestPermissions":[
      {
        "name": "ohos.permission.INTERNET"
      }
    ],
    ......
  }
}

### 如何在鸿蒙系统中接入并展示高德地图 #### 准备工作 确保已经安装了必要的开发环境,包括但不限于DevEco Studio以及获取到高德开放平台的API Key。这一步骤至关重要,因为后续所有的操作都将依赖于此。 #### 创建项目与配置权限 创建一个新的HarmonyOS工程,在`config.json`文件内声明网络访问权限以便能够请求外部资源如高德地图的数据接口: ```json { "reqPermissions": [ { "name": "ohos.permission.INTERNET" } ] } ``` 同时也要记得申请位置信息服务的相关权限来支持定位功能[^1]。 #### 添加依赖库 前往高德官网下载适用于HarmonyOS SDK版本的地图组件,并将其加入项目的依赖项列表当中。具体来说就是修改`build.gradle`文件中的dependencies部分以引入所需模块。 #### 初始化Map对象 当页面加载完成后立即初始化MapView实例并将它绑定至布局视图之上;另外还需设置好初始中心点坐标、缩放级别等参数让初次打开时即呈现合理视角范围内的地理信息给用户查看。 ```javascript import MapView from '@ohos.maps.mapkit'; // 定义经纬度变量存储当前位置数据 let currentLocation = { lat: 39.9042, lng: 116.4074 }; export default { onCreate() { this.$refs.mapContainer.init((map) => { // 设置地图样式和其他属性... map.setMyLocationEnabled(true); // 将当前地点设为中心点显示 const point = new LatLng(currentLocation.lat, currentLocation.lng); map.animateTo(point); // 更多自定义逻辑... }); }, }; ``` #### 实现交互功能 通过监听用户的触摸事件可以实现在屏幕上滑动放大缩小地图效果,点击标记物弹出详情窗口等功能增强用户体验感。此外还可以考虑集成搜索框允许输入地址名称自动解析成地理位置并标注出来方便快捷导航使用。 #### 处理不同设备兼容性问题 考虑到实际运行环境中可能存在多种型号终端共存的情况,因此建议针对特定品牌或操作系统特性做适当调整优化,例如解决某些情况下无法正常唤起第三方应用程序的问题[^2]。 #### 地理坐标转换实用代码片段 由于中国境内的电子地图普遍采用GCJ-02标准而非国际通用WGS84体系,所以在处理来自GPS接收器原始读数时往往需要先完成一次坐标的变换才能得到准确无误的结果用于绘制图标或者计算距离方向等等[^3]。 ```typescript import { map, mapCommon } from '@kit.MapKit'; const wgs84Position: mapCommon.LatLng = { latitude: 30, longitude: 118 }; const gcj02Position: mapCommon.LatLng = map.convertCoordinateSync( mapCommon.CoordinateType.WGS84, mapCommon.CoordinateType.GCJ02, wgs84Position ); console.log(`Transformed Position: ${JSON.stringify(gcj02Position)}`); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值