HarmonyOS 5.0应用开发——鸿蒙接入高德地图实现POI搜索

news2025/2/27 18:50:48

【高心星出品】

文章目录

      • 鸿蒙接入高德地图实现POI搜索
        • 运行结果:
        • 准备地图
        • 编写ArkUI布局来加载HTML地图

鸿蒙接入高德地图实现POI搜索

在当今数字化时代,地图应用已成为移动设备中不可或缺的一部分。随着鸿蒙系统的日益普及,如何在鸿蒙应用中接入高德地图并实现POI(兴趣点)检索功能,成为了众多开发者关注的焦点。本文将详细介绍这一过程,帮助开发者快速上手,为用户打造更优质的地图体验。

鸿蒙系统作为华为自主研发的分布式操作系统,具有高性能、低功耗等诸多优势,为智能设备提供了强大的支持。而高德地图凭借其丰富的数据资源、精准的定位功能以及多样化的地图服务,在国内地图应用领域占据重要地位。将鸿蒙与高德地图相结合,能够充分发挥双方的优势,为用户提供更加便捷、高效的地图导航和POI检索服务。

但是目前高德地图API暂不支持HarmonyOS5.0版本,需要使用鸿蒙的Web组件加载JS版高德地图。

运行结果:

在这里插入图片描述

准备地图

首先需要注册高德地图开发者,创建应用:https://lbs.amap.com/api/javascript-api-v2/prerequisites

准备一个基础地图。

HTML代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta
            name="viewport"
            content="initial-scale=1.0, user-scalable=no, width=device-width"
    />
    <title>HELLO,AMAP!</title>
    <style>
        html,
        body,
        #container {
          width: 100%;
          height: 100%;
        }
    </style>
    <style type="text/css">
        #panel {
            position: absolute;
            max-height: 90%;
            height:300px;
            overflow-y: auto;
            top: 50px;
            right: 10px;
            width: 180px;

        }
         .amap_lib_placeSearch .poibox .poi-title{
         font-size:12px;
        }
        .amap_lib_placeSearch .poibox .poi-info p{
        font-size:10px;
        }

        #search {
         position: absolute;
            background-color: transparent;
            max-height: 90%;
            overflow-y: auto;
            top: 20px;
            right: 10px;
            width: 180px;

        }
        #search_input{
         width:120px;
        }
    </style>
</head>
<body>
<div id="container"></div>
<div id="panel"></div>
<div id="search">
    <input id="search_input" type="text" placeholder="搜索地址">
    <input id="search_sub" type="submit" value="搜索" onclick="search()">
</div>
<script type="text/javascript">
    window._AMapSecurityConfig = {
      securityJsCode: "210560c7b915b95686d9baa8b12d5a83",
    };
</script>
<script src="https://webapi.amap.com/loader.js"></script>
<script type="text/javascript">


    var map
    AMapLoader.load({
      key: "d7b81d72864f222e583d2283493cdd58", //申请好的Web端开发者 Key,调用 load 时必填
      version: "2.0", //指定要加载的 JS API 的版本,缺省时默认为 1.4.15
    })
      .then((AMap) => {
         map = new AMap.Map("container",{
          zoom:10,
          center: [118.832028,31.875796], //地图中心点
         });
        //异步加载控件
        AMap.plugin('AMap.ToolBar',function(){
          var toolbar = new AMap.ToolBar(); //缩放工具条实例化
          map.addControl(toolbar); //添加控件
        });
        //异步加载控件
        AMap.plugin('AMap.Scale',function(){
          var scale = new AMap.Scale()
          map.addControl(scale); //添加控件
        });

      })
      .catch((e) => {
        console.error(e); //加载错误提示
      });
    function search()
    {
   // 获取输入框元素
    var inputElement = document.getElementById('search_input');
    // 获取输入框中的文本内容
    var searchText = inputElement.value;
    console.log(searchText);  // 在控制台输出文本内容
    searchplace(searchText)
    }
    function searchplace(addr){
     AMap.plugin(["AMap.PlaceSearch"], function () {
          const placeSearch = new AMap.PlaceSearch({
            pageSize: 5, //单页显示结果条数
            pageIndex: 1, //页码
<!--            city: "江苏", //兴趣点城市-->
<!--            citylimit: true, //是否强制限制在设置的城市内搜索-->
            selectFirst:true,
            map: map, //展现结果的地图实例
            panel: "panel", //参数值为你页面定义容器的 id 值<div id="my-panel"></div>,结果列表将在此容器中进行展示。
            autoFitView: true, //是否自动调整地图视野使绘制的 Marker 点都处于视口的可见范围
          });
            placeSearch.on('selectChanged', function(e) {
                console.log(JSON.stringify(e.selected.data))
                postStringToApp(JSON.stringify(e.selected.data))
            });
          placeSearch.search(addr);

        });
    }
    //-------------------地图展示很poi检索js代码----------------------------------

//--------------------------------与arkts通信代码--------------------------
var h5Port;
window.addEventListener('message', function(event) {
    if (event.data == 'initport') {
        if(event.ports[0] != null) {
            h5Port = event.ports[0]; // 1. 保存从ets侧发送过来的端口
            h5Port.onmessage = function(event) {
                // 2. 接收ets侧发送过来的消息.
                var result = event.data;
                console.log('arkts发来的消息: '+result)
            }
            h5Port.onmessageerror = (event) => {
                console.error(`发送了错误信息: ${event}`);
            };
        }
    }
})

// 使用h5Port往ets侧发送String类型的消息.
function postStringToApp(str) {
    if (h5Port) {
        h5Port.postMessage(str);
    } else {
        console.error("In html h5port is null, please init first");
    }
}


</script>
</body>
</html>

除了展示地图,还有与ArkTS通信的过程:

HTML网页会接收到ArkTS第一次发送的端口号,通过该端口号建立通道,后面就可以通过该端口号收发消息。

var h5Port;
window.addEventListener('message', function(event) {
    if (event.data == 'initport') {
        if(event.ports[0] != null) {
            h5Port = event.ports[0]; // 1. 保存从ets侧发送过来的端口
            h5Port.onmessage = function(event) {
                // 2. 接收ets侧发送过来的消息.
                var result = event.data;
                console.log('arkts发来的消息: '+result)
            }
            h5Port.onmessageerror = (event) => {
                console.error(`发送了错误信息: ${event}`);
            };
        }
    }
})

// 使用h5Port往ets侧发送String类型的消息.
function postStringToApp(str) {
    if (h5Port) {
        h5Port.postMessage(str);
    } else {
        console.error("In html h5port is null, please init first");
    }
}
编写ArkUI布局来加载HTML地图

加入权限

由于加载的地图需要使用网络权限,需要早module.json5中加入INTENET权限。

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

加载地图

需要将离线的html地图放入项目的rawfile资源中。

编写ArkTS代码

这里需要在web组件加载结束后,与离线html建立通道收发消息。

import { webview } from '@kit.ArkWeb';
import { Addr } from '../../model/Addr';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  @State addrname:string=''
  @State addr:string=''
  private ports:webview.WebMessagePort[]=[]
  private port:webview.WebMessagePort|null=null
  private controller:WebviewController=new webview.WebviewController()
  build() {
    Column(){
      Row({space:10}){
        Text('地点名称:')
        TextInput({text:this.addrname}).enabled(false)
          .layoutWeight(1)
      }.width('100%')
      .padding(10)
      Row({space:10}){
        Text('详细地址:')
        TextInput({text:this.addr}).enabled(false)
          .layoutWeight(1)
      }.width('100%')
      .padding(10)

      Web({src:$rawfile('poijiansuo.html'),controller:this.controller})
        .javaScriptAccess(true)
        .imageAccess(true)
        .zoomAccess(true)
        .margin({top:10})
        .onPageEnd(()=>{
          // 创建web的通道端口号
          this.ports= this.controller.createWebMessagePorts()
         console.log('gxxt ',JSON.stringify(this.ports))
         // 将第二个端口号发送给html,做为html发送和接受arkts信息的端口号
         this.controller.postMessage('initport',[this.ports[1]],'*')
         //第一个端口号留给自己,作为发送和接受html信息的端口号
          this.port=this.ports[0]
          this.port.onMessageEventExt((result)=>{
            // 接受html的结果
            console.log('gxxt',JSON.stringify(result))
            let data= result.getString()
            let jsondata=JSON.parse(data) as Addr
            this.addrname=jsondata.name
            this.addr=jsondata.pname+jsondata.cityname+jsondata.adname+jsondata.address
          })
        })

    }
    .height('100%')
    .width('100%')
  }
}

当从地图搜索某个POI地点后,点击列表中的搜索结果,就会将具体地址信息发送给ArkTS端,然后在鸿蒙端进行解析。

Addr接口

/**
 *作者:gxx
 *时间:2025/2/21 16:43
 *功能:
 **/
export interface Addr {
  "id": string
  "name":string
  "type":string
  "location": number[],
  "address":string
  "tel":string
  "distance":string|null
  "shopinfo":string
  "website":string
  "pcode":string
  "citycode":string
  "adcode":string
  "postcode":string
  "pname":string
  "cityname":string
  "adname":string
  "email":string
  "photos": photos[]
  "entr_location": number[]
  "exit_location":string|null
  "groupbuy":boolean
  "discount":boolean
  "indoor_map":boolean
  "_idx":number
  "index":number
}
interface photos
{
  "title":string
   "url":string
}

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

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

相关文章

计算机视觉(opencv-python)入门之常见图像处理基本操作(待补充)

图像预处理是计算机视觉任务中的关键步骤&#xff0c;它通过对原始图像进行处理&#xff0c;以提高后续图像分析、特征提取和识别的准确性。 示例图片 目录 常见图像预处理方法 灰度化处理 法一 法二 说明 切片截取部分图像数据 cv2.cvtColor() 颜色空间转换 cv2.spli…

采用DDNS-GO与cloudflare实现双域名同时访问NAS

这个标题其实解释的还不够清楚&#xff0c;本人是小白&#xff0c;但是买了群晖的NAS后自己瞎折腾了一下&#xff0c;遇到了如下的问题&#xff1a; 1、家里是移动宽带&#xff0c;没有公网IP&#xff0c;因此Ipv4无法使用&#xff0c;IPV6可以正常使用。 2、办公室场地采用的…

w803|联盛德|WM IoT SDK2.X测试|pinout|(2):w803开发板简介

概述 W803-Pico是一款基于联盛德W803芯片为主控的开发板&#xff0c;支持IEEE802.11 b/g/n Wi-Fi&#xff0c;以及BT/BLE4.2协议蓝牙。芯片内置高性能32位处理器&#xff0c;主频高达240MHz。内置2MB Flash以及288KB RAM。硬件采用DIP封装&#xff0c;PCB板载天线&#xff0c;…

【UCB CS 61B SP24】Lecture 16 - Data Structures 2: ADTs, BSTs学习笔记

本文首先介绍了抽象数据类型与树的概念&#xff0c;接着重点讲解二叉搜索树的定义与操作方式&#xff0c;并用 Java 实现一个标准的二叉搜索树结构。 1. 抽象数据类型 首先引入一个概念叫做抽象数据类型&#xff08;Abstract Data Type&#xff0c;ADT&#xff09;&#xff0…

Java 大视界 -- Java 大数据在智能物流路径规划与车辆调度中的创新应用(102)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

HarmonyOS Design 介绍

HarmonyOS Design 介绍 文章目录 HarmonyOS Design 介绍一、HarmonyOS Design 是什么&#xff1f;1. 设计系统&#xff08;Design System&#xff09;2. UI 框架的支持3. 设计工具和资源4. 开发指南5. 与其他设计系统的对比总结 二、HarmonyOS Design 特点 | 应用场景1. Harmon…

【算法系列】快速排序详解

文章目录 快速排序的多种实现方式1. 基本快速排序&#xff08;Lomuto 分区方案&#xff09;1.1 基本原理1.2 步骤1.3 Java 实现示例 2. Hoare 分区方案2.1 基本原理2.2 步骤2.3 Java 实现示例 3. 三数取中法3.1 基本原理3.2 步骤3.3 Java 实现示例 4. 尾递归优化4.1 基本原理4.…

电脑键盘知识

1、键盘四大功能区 1. 功能区 2. 主要信息输入区 3. 编辑区 4. 数字键盘区 笔记本电脑键盘的功能区&#xff0c;使用前需先按Fn键 1.1、功能区 ESC&#xff1a;退出 F1&#xff1a;显示帮助信息 F2&#xff1a;重命名 F4&#xff1a;重复上一步操作 F5&#xff1a;刷新网页 …

Grok 3 vs. DeepSeek vs. ChatGPT:2025终极AI对决

2025 年,AI 领域的竞争愈发激烈,三个重量级选手争夺霸主地位:Grok 3(由 xAI 开发)、DeepSeek(国内 AI 初创公司)和 ChatGPT(OpenAI 产品)。每个模型都有自己独特的优势,无论是在深度思考、速度、编程辅助、创意输出,还是在成本控制方面,都展现出强大的实力。但究竟…

【MySQL篇】数据库基础

目录 1&#xff0c;什么是数据库&#xff1f; 2&#xff0c;主流数据库 3&#xff0c;MySQL介绍 1&#xff0c;MySQL架构 2&#xff0c;SQL分类 3&#xff0c;MySQL存储引擎 1&#xff0c;什么是数据库&#xff1f; 数据库&#xff08;Database&#xff0c;简称DB&#xf…

基于SpringBoot+mybatisplus+vueJS的Cosplay文化展示与交流社区设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

组件传递props校验

注意&#xff1a;prop是只读的&#xff01;不可以修改父组件的数据。 可以检验传过来的内容是否类型没问题。 App.vue <template><div><!-- <parentDemo/> --><componentA/></div></template> <script> import ComponentA …

数据结构与算法-图论-最短路-拓展运用

选择最佳路线 分析&#xff1a; 这是一道图论中的最短路径问题&#xff0c;目标是在给定的公交网络中&#xff0c;找到从琪琪家附近的车站出发&#xff0c;到她朋友家附近车站&#xff08;编号为 s &#xff09;的最短时间。以下是对该问题的详细分析&#xff1a; 问题关键信息…

0—QT ui界面一览

2025.2.26&#xff0c;感谢gpt4 1.控件盒子 1. Layouts&#xff08;布局&#xff09; 布局控件用于组织界面上的控件&#xff0c;确保它们的位置和排列方式合理。 Vertical Layout&#xff08;垂直布局&#xff09; &#xff1a;将控件按垂直方向排列。 建议&#xff1a;适…

纷析云:赋能企业财务数字化转型的开源解决方案

在企业数字化转型的浪潮中&#xff0c;财务管理的高效与安全成为关键。纷析云凭借其开源、安全、灵活的财务软件解决方案&#xff0c;为企业提供了一条理想的转型路径。 一、开源的力量&#xff1a;自主、安全、高效 纷析云的核心优势在于其100%开源的财务软件源码。这意味着…

P8716 [蓝桥杯 2020 省 AB2] 回文日期

1 题目说明 2 题目分析 暴力不会超时&#xff0c;O(n)的时间复杂度&#xff0c; < 1 0 8 <10^8 <108。分析见代码&#xff1a; #include<iostream> #include<string> using namespace std;int m[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};// 判断日期…

(十)趣学设计模式 之 外观模式!

目录 一、 啥是外观模式&#xff1f;二、 为什么要用外观模式&#xff1f;三、 外观模式的实现方式四、 外观模式的优缺点五、 外观模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支…

apache-maven-3.2.1

MAVEN_HOME D:\apache-maven-3.2.1 PATH D:\apache-maven-3.2.1\bin cmd mvn -v <localRepository>d:\localRepository</localRepository> setting.xml <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Soft…

编程题-连接两字母单词得到的最长回文串(中等)

题目&#xff1a; 给你一个字符串数组 words 。words 中每个元素都是一个包含 两个 小写英文字母的单词。 请你从 words 中选择一些元素并按 任意顺序 连接它们&#xff0c;并得到一个 尽可能长的回文串 。每个元素 至多 只能使用一次。 请你返回你能得到的最长回文串的 长度…

论文笔记(七十二)Reward Centering(三)

Reward Centering&#xff08;三&#xff09; 文章概括摘要3 基于值的奖励中心化4 案例研究&#xff1a; 以奖励为中心的 Q-learning5 讨论、局限性与未来工作致谢 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan…