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

【高心星出品】

文章目录

      • 鸿蒙接入高德地图实现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
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫(四)- Selenium 安装与使用教程

文章目录 前言一、简介及安装1. Selenium 简介2. Selenium 安装 二、Selenium 基本使用1. 导入Selenium2. 启动浏览器3. 打开网页4. 获取页面标题5. 关闭浏览器6. 完整示例代码 三、Selenium WebDriver1. 简介2. 基本操作2.1 启动浏览器2.2 关闭浏览器2.3 打开网页2.4 关闭当前…

java后端开发day20--面向对象进阶(一)--static继承

&#xff08;以下内容全部来自上述课程&#xff09; 1.static–静态–共享 static表示静态&#xff0c;是java中的一个修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量。 1.静态变量 被static修饰的成员变量&#xff0c;叫做静态变量。 特点&#xff1a; 被该类…

phpstudy安装教程dvwa靶场搭建教程

GitHub - digininja/DVWA: Damn Vulnerable Web Application (DVWA) Dvwa下载地址 Windows版phpstudy下载 - 小皮面板(phpstudy) 小皮下载地址 1选择windows 版本&#xff0c;点击立即下载 下载完成&#xff0c;进行解压&#xff0c;注意不要有中文路径 点击.exe文件进行安装…

AI数字人技术源码开发分享:革新短视频营销策略

集星幻影的AI数字人分身系统是一款融合了先进人工智能技术的综合性短视频营销解决方案。该系统整合了形象克隆、声音克隆、AI数字人分身生成、智能剪辑及文案创作等功能&#xff0c;旨在为用户打造虚拟人物资产并提供AI驱动的多模态交互服务。以下是该系统的主要功能概述&#…

Day 51 卡玛笔记

这是基于代码随想录的每日打卡 647. 回文子串 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 示例 1&#xff1a; 输入&#xff1a;s &q…

ArcGIS Pro可见性分析:精通地形视线与视域分析

在地理信息系统&#xff08;GIS&#xff09;的广泛应用中&#xff0c;可见性分析作为一项关键技术&#xff0c;发挥着不可替代的作用。 无论是城市规划、环境监测&#xff0c;还是军事侦察、景观设计&#xff0c;可见性分析都能提供精确的数据支持&#xff0c;帮助我们更好地理…

【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 主机代理 配置

【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 主机代理 配置 前言整体思路安装 WSL2Windows 环境升级为 WIN11 专业版启用window子系统及虚拟化 安装WSL2通过 Windows 命令提示符安装 WSL安装所需的 Linux 发行版&#xff08;如 Ubuntu 20.04&#xff09;查看…

点云 Ubuntu20.04-VScode已解决fatal error: Eigen/StdVector: 没有那个文件或目录

原因&#xff1a;路径问题 。 解决&#xff1a;解决方法&#xff1a; 使用下面命令将eigen的安装路径映射到/usr/include路径下:pcl按照z方向渲染点云&#xff0c;但是CMakelists.txt编译找不到pcl/io/pcd_io.h: 没有那个文件或目录&#xff0c;Eigen找不到&#xff0c;open3d…

Redis 面试

Redis 使用场景有哪些&#xff1f; 缓存&#xff1a;缓存热点数据&#xff0c;如数据库查询结果、页面片段等&#xff0c;减少数据库压力&#xff0c;提高系统响应速度。 分布式锁&#xff1a;利用 Redis 的原子操作实现分布式锁&#xff0c;保证在分布式环境下同一时刻只有一…

228页PPT丨制造业核心业务流程优化咨询全案(战略营销计划生产研发质量),附核心系统集成架构技术支撑体系,2月26日资料已更新

一、订单全生命周期管理优化 1. 智能订单承诺&#xff08;CTP&#xff09;系统 ●集成ERP/APS/MES数据&#xff0c;实时计算产能可视性 ●应用蒙特卡洛模拟评估订单交付风险 ●建立动态插单评估模型&#xff08;基于边际贡献与产能占用系数&#xff09; 2. 跨部门协同机制…

mysql5.7离线安装及问题解决

这次主要是讲解mysql5.7离线安装教程和一主一从数据库配置 1、去官网下载自己对应的mysql https://downloads.mysql.com/archives/community/2、查看需要安装mysql服务器的linux的类型 uname -a第二步看一下系统有没有安装mysql rpm -qa|grep -i mysql3、上传安装包 用远程…

AI人工智能机器学习之聚类分析

1、概要 本篇学习AI人工智能机器学习之聚类分析&#xff0c;以KMeans、AgglomerativeClustering、DBSCAN为例&#xff0c;从代码层面讲述机器学习中的聚类分析。 2、聚类分析 - 简介 聚类分析是一种无监督学习的方法&#xff0c;用于将数据集中的样本划分为不同的组&#xff…

springai系列(二)从0开始搭建和接入azure-openai实现智能问答

文章目录 前言1.从0开始搭建项目2.进入微软openai申请key3.配置application.yaml4.编写controller5.测试源码下载地址总结 前言 之前使用openai的官网的api需要科学上网&#xff0c;但是我们可以使用其他的代理间接实现使用chatgpt的相关模型&#xff0c;解决这个问题。比如:本…

2020年蓝桥杯Java B组第二场题目+部分个人解析

#A&#xff1a;门牌制作 624 解一&#xff1a; public static void main(String[] args) {int count0;for(int i1;i<2020;i) {int ni;while(n>0) {if(n%102) {count;}n/10;}}System.out.println(count);} 解二&#xff1a; public static void main(String[] args) {…

DeepSeek 202502 开源周合集

DeepSeek 本周的开源项目体现了其在 AI 技术栈中的深厚积累&#xff0c;从硬件协同优化&#xff08;FlashMLA&#xff09;、通信库&#xff08;DeepEP&#xff09;、核心计算&#xff08;DeepGEMM&#xff09;到推理模型&#xff08;DeepSeek-R1&#xff09;&#xff0c;覆盖了…

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth&#xff0c;可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…

DeepSeek 开源狂欢周(二)DeepEP深度技术解析 | 解锁 MoE 模型并行加速

在大模型时代&#xff0c;Mixture-of-Experts (MoE) 模型凭借其强大的容量和高效的计算能力&#xff0c;成为研究和应用的热点。然而&#xff0c;MoE 模型的训练和推理面临着巨大的专家并行通信挑战。近日&#xff0c;DeepSeek 开源了 DeepEP 项目&#xff0c;为解决这一难题提…

(IDE接入DeepSeek)简单了解DeepSeek接入辅助开发与本地部署建议

重点&#xff1a;IDE接入DeepSeek是否收费 收费&#xff01; 本文章主要是为了给小白避雷&#xff0c;目前很多文章告诉大家怎么接入DeepSeek&#xff0c;但是并未告知大家是否收费。如果是想白嫖的&#xff0c;就可以不用去接入了。 一、引言 最近爆火的AI人工智能工具DeepSe…

FPGA开发时序图绘制

开始的时候画时序图都是拿 visio 硬连&#xff0c;但是那个线宽太难统一了&#xff0c;丑不拉几的&#xff0c;遂学习 waveform 语法使用代码来画时序图。 开始 Vscode 中安装 waveform render 或者在 GitHub 搜索 wavedrom 安装即可。由于 vscode 是我常用的编辑器&#xff…

windows下安装pyenv+virtualenv+virtualenvwrapper

1、下载pyenv 进入git官网&#xff0c;打包下载zip到本地 2、解压到安装目录 解压下载好的pyenv-win-master.zip到自己的安装目录&#xff0c;如D:\Program Files 3、配置环境变量 右击桌面 此电脑 --> 属性 --> 高端系统设置 --> 环境变量 --> 新建系统变量…