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"/><metaname="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 mapAMapLoader.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=nullprivate 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 Addrthis.addrname=jsondata.namethis.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.pswp.cn/diannao/70892.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70892.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70892.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

idea + Docker + 阿里鏡像服務打包部署

一、下載docker desktop軟件 官網下載docker desktop&#xff0c;需要結合wsl使用 啟動成功的畫面(如果不是這個畫面例如一直處理start或者是stop需要重新啟動&#xff0c;不行就重啟電腦) 打包成功的鏡像在這里&#xff0c;如果頻繁打包會導致磁盤空間被占滿&#xff0c;需…

IP---網絡類型

這只是IP的其中一塊內容-網絡類型&#xff0c;IP還有更多內容可以查看IP專欄&#xff0c;前一章內容為訪問服務器流程&#xff0c;可通過以下路徑查看IP----訪問服務器流程-CSDN博客&#xff0c;歡迎指正 2.網絡類型 網絡類型---根據二層&#xff08;數據鏈路層&#xff09;所…

【監督學習】ARIMA預測模型步驟及matlab實現

ARIMA預測模型 ARIMA預測模型1.算法步驟2.參數選擇(1)拖尾截尾判斷法(2) AIC 準則(3) BIC 準則 3.MATLAB 實現參考資料 ARIMA預測模型 #mermaid-svg-mDhjwpnuA0YcEGnE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…

使用git管理uniapp項目

1.本地管理 1. 在項目根目錄中新建 .gitignore 忽略文件&#xff0c;并配置如下&#xff1a; # 忽略 node_modules 目錄 /node_modules /unpackage/dist 2. 打開終端&#xff0c;切換到項目根目錄中&#xff0c;運行如下的命令&#xff0c;初始化本地 Git 倉庫&#xff1…

Unity中動態切換光照貼圖的方法

關鍵代碼&#xff1a;LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三張圖&#xff1a;lightmapColor,lightmapDir,以及一張ShadowMap 這里只操作前兩張&#xff1a; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…

C# 運算符

C# 運算符 在C#編程語言中,運算符是用于執行數學或邏輯運算的符號。它們是構建程序邏輯和表達式的基石。C#支持多種類型的運算符,包括算術運算符、關系運算符、邏輯運算符、位運算符、賦值運算符、自增自減運算符以及一些特殊運算符。 算術運算符 算術運算符用于執行基本的…

1.2 Kaggle大白話:Eedi競賽Transformer框架解決方案02-GPT_4o生成訓練集缺失數據

目錄 0. 本欄目競賽匯總表1. 本文主旨2. AI工程架構3. 數據預處理模塊3.1 配置數據路徑和處理參數3.2 配置API參數3.3 配置輸出路徑 4. AI并行處理模塊4.1 定義LLM客戶端類4.2 定義數據處理函數4.3 定義JSON保存函數4.4 定義數據分片函數4.5 定義分片處理函數4.5 定義文件名排序…

pycharm遠程連接服務器運行pytorch

Linux部署pytorch 背景介紹 不同的開源代碼可能需要不同的實驗環境和版本&#xff0c;這時候的確體現出Anaconda管理環境的好處了&#xff0c;分別搞一個獨立環境方便管理。 有的教程建議選擇較舊的版本&#xff0c;但筆者建議在條件允許的情況下安裝最新版&#xff0c;本次…

Python開發 Flask框架面試題及參考答案

目錄 Flask 的核心設計理念是什么?與 Django 相比有哪些顯著差異? 解釋 Flask 框架的核心理念及其作為 “微框架” 的優缺點 Flask 的依賴庫有哪些?簡述 Werkzeug 和 Jinja2 的作用 什么是 WSGI?Flask 如何基于 WSGI 實現服務端與應用的交互 解釋 RESTful API 的設計原…

從“Switch-case“到“智能模式“:C#模式匹配的終極進化指南

當代碼開始"思考" 你是否厭倦了層層嵌套的if-else地獄&#xff1f;是否想過讓代碼像偵探推理一樣優雅地解構數據&#xff1f;C#的模式匹配正是這樣一把瑞士軍刀&#xff0c;從C# 7.0到C# 12&#xff0c;它已悄然進化成改變編程范式的利器。 一、模式匹配的三重境界…

組件注冊方式、傳遞數據

組件注冊 一個vue組件要先被注冊&#xff0c;這樣vue才能在渲染模版時找到其對應的實現。有兩種注冊方式&#xff1a;全局注冊和局部注冊。&#xff08;組件的引入方式&#xff09; 以下這種屬于局部引用。 組件傳遞數據 注意&#xff1a;props傳遞數據&#xff0c;只能從父…

ROS的action通信——實現階乘運算(三)

在ROS中除了常見的話題(topic&#xff09;通信、服務(server)通信等方式&#xff0c;還有action通信這一方式&#xff0c;由于可以實時反饋任務完成情況&#xff0c;該通信方式被廣泛運用于機器人導航等任務中。本文將通過三個小節的分享&#xff0c;實現基于action通信的階乘運…

四款 AI 協作辦公工具,AI工具庫革新辦公效率

在數字化辦公時代&#xff0c;AI 技術正深刻改變著我們的工作方式。AIDH.NETAI工具庫匯聚了眾多先進的工具&#xff0c;今天我們來了解 AI協作辦公工具&#xff0c;探索它們如何助力企業和團隊在辦公場景中脫穎而出。 Taskade&#xff1a;智能工作流的領航者 Taskade 是一款將…

vue2 h5 畫高德地圖電子圍欄

使用前請先申請高德地圖key JavaScript API | 騰訊位置服務 npm install lodash-es效果圖 子組件代碼 <template><div class"fence-container"><div v-if"loading" class"map-loading"><div class"loader">…

unity學習54:圖片+精靈+遮罩mask,舊版文本 text 和新的TMP文本

目錄 1 圖片 image 1.1 如果直接導入image 1.2 圖片 image 和精靈 sprite 1.2.1 繼續修改上面的格式 texture type 是default 1.2.2 再次關聯到UI的 image 物體上就可以了 1.3 圖片和遮罩 mask 1.3.1 創建1個父物體和1個子物體&#xff0c;分別都是image 1.3.2 如果父…

Spring Data JPA vs MyBatis:ORM框架如何選擇?

在選擇ORM框架時&#xff0c;Spring Data JPA和MyBatis是兩個常見的選擇&#xff0c;它們各有優缺點&#xff0c;適用于不同的場景。以下是兩者的對比&#xff0c;幫助你做出選擇&#xff1a; 1. Spring Data JPA 優點&#xff1a; 開發效率高&#xff1a;通過簡單的接口定義和…

Selenium 與 Coze 集成

涵蓋兩者的基本概念、集成步驟、代碼示例以及相關注意事項。 基本概念 Selenium:是一個用于自動化瀏覽器操作的工具集,支持多種瀏覽器(如 Chrome、Firefox 等),能夠模擬用戶在瀏覽器中的各種操作,如點擊、輸入文本、選擇下拉框等,常用于 Web 應用的自動化測試。Coze:它…

在線騎行|基于SpringBoot的在線騎行網站設計與實現(源碼+數據庫+文檔)

在線騎行網站系統 目錄 基于SpringBoot的在線騎行設計與實現 一、前言 二、系統設計 三、系統功能設計 5.1用戶信息管理 5.2 路線攻略管理 5.3路線類型管理 5.4新聞賽事管理 四、數據庫設計 五、核心代碼 六、論文參考 七、最新計算機畢設選題推薦 八、源碼獲取…

[深度學習]基于C++和onnxruntime部署yolov12的onnx模型

基于C和ONNX Runtime部署YOLOv12的ONNX模型&#xff0c;可以遵循以下步驟&#xff1a; 準備環境&#xff1a;首先&#xff0c;確保已經下載后指定版本opencv和onnruntime的C庫。 模型轉換&#xff1a; 安裝好yolov12環境并將YOLOv12模型轉換為ONNX格式。這通常涉及使用深度學習…

Imagination DXTP GPU IP:加速游戲AI應用,全天候暢玩無阻

日前&#xff0c;Imagination 推出了最新產品——Imagination DXTP GPU IP&#xff0c;在智能手機和其他功耗受限設備上加速圖形和AI工作負載時&#xff0c;保證全天候的電池續航。它是我們最新D系列GPU的最終產品&#xff0c;集成了自2022年發布以來引入的一系列功能&#xff…