当前位置: 首页 > news >正文

鸿蒙 地理编码:正地理编码与逆地理编码

开发中,定位功能除了获取经纬度坐标外,常常还需要将坐标转换为用户可读的位置描述(如国家、城市、街道等)。系统提供了正地理编码逆地理编码两种转化能力。

一、地理编码

使用经纬度坐标描述一个位置非常准确,但是并不直观,面向用户表达并不友好。系统提供了以下两种转化能力:

能力说明输入输出
正地理编码将地理编码转化为具体经纬度坐标地址描述(如"上海市浦东新区xx路xx号")经纬度坐标
逆地理编码将具体的经纬度坐标转化为地理编码经纬度坐标国家、行政区划、街道、门牌号、地址描述等

地理编码包含的信息

逆地理编码返回的GeoAddress包含多个属性,便于用户理解:

信息项说明
国家国家名称
行政区划省/市/区
街道街道名称
门牌号具体门牌号
地址描述完整地址描述

二、核心接口

接口功能描述
isGeocoderAvailable()判断地理编码与逆地理编码服务是否可用
getAddressesFromLocation(request, callback)逆地理编码:将坐标转换为地理描述
getAddressesFromLocationName(request, callback)正地理编码:将地理描述转换为具体坐标

三、开发步骤

3.1 导入模块

import { geoLocationManager } from '@kit.LocationKit';

3.2 查询服务是否可用

重要:正地理编码与逆地理编码功能需要访问后端服务,请确保设备联网,以进行信息获取。

try { let isAvailable = geoLocationManager.isGeocoderAvailable(); console.info('地理编码服务可用: ' + isAvailable); } catch (err) { console.error("errCode:" + JSON.stringify(err)); }

注意:如果服务不可用,说明该设备不具备地理编码与逆地理编码能力,请勿使用相关接口。

3.3 逆地理编码:坐标 → 地址

将经纬度坐标转化为地理编码(即位置信息),获得匹配的GeoAddress列表。

请求参数(ReverseGeoCodeRequest)

参数类型说明
latitudenumber纬度
longitudenumber经度
maxItemsnumber返回的最大结果数
let reverseGeocodeRequest: geoLocationManager.ReverseGeoCodeRequest = { "latitude": 31.12, "longitude": 121.11, "maxItems": 1 }; try { geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => { if (err) { console.error('getAddressesFromLocation err: ' + JSON.stringify(err)); } else { console.info('getAddressesFromLocation data: ' + JSON.stringify(data)); // data为GeoAddress数组,包含国家、行政区划、街道等信息 } }); } catch (err) { console.error("errCode:" + JSON.stringify(err)); }

3.4 正地理编码:地址 → 坐标

将地理编码(即位置信息)转化为经纬度坐标。

请求参数(GeoCodeRequest)

参数类型说明
descriptionstring地址描述(如"上海市浦东新区xx路xx号")
maxItemsnumber返回的最大结果数
minLatitudenumber可选,最小纬度(用于限定范围)
minLongitudenumber可选,最小经度
maxLatitudenumber可选,最大纬度
maxLongitudenumber可选,最大经度
let geocodeRequest: geoLocationManager.GeoCodeRequest = { "description": "北京市丰台区xx路xx号", "maxItems": 1 }; try { geoLocationManager.getAddressesFromLocationName(geocodeRequest, (err, data) => { if (err) { console.error('getAddressesFromLocationName err: ' + JSON.stringify(err)); } else { console.info('getAddressesFromLocationName data: ' + JSON.stringify(data)); // data为GeoAddress数组,包含纬度、经度等坐标信息 } }); } catch (err) { console.error("errCode:" + JSON.stringify(err)); }

3.5 提高查询精度

如果需要查询的位置信息可能出现多地重名的情况,可以通过设置经纬度范围来限定查询区域,以高效地获取期望的准确结果。

let geocodeRequest: geoLocationManager.GeoCodeRequest = { "description": "南京路", "maxItems": 5, "minLatitude": 31.0, "minLongitude": 121.0, "maxLatitude": 31.5, "maxLongitude": 121.5 };

四、完整示例

import { geoLocationManager } from '@kit.LocationKit'; import { BusinessError } from '@kit.BasicServicesKit'; @Entry @Component struct GeocodeDemo { @State latitude: string = ''; @State longitude: string = ''; @State address: string = ''; build() { Column() { // 逆地理编码:坐标转地址 Button('坐标转地址') .onClick(() => { this.reverseGeocode(); }) Text('纬度: ' + this.latitude) Text('经度: ' + this.longitude) Text('地址: ' + this.address) } .padding(20) } // 逆地理编码:坐标 → 地址 reverseGeocode() { // 检查服务是否可用 if (!geoLocationManager.isGeocoderAvailable()) { console.error('地理编码服务不可用'); return; } let request: geoLocationManager.ReverseGeoCodeRequest = { latitude: 31.12, longitude: 121.11, maxItems: 1 }; try { geoLocationManager.getAddressesFromLocation(request, (err, data) => { if (err) { console.error('逆地理编码失败: ' + JSON.stringify(err)); } else if (data && data.length > 0) { let addr = data[0]; this.latitude = addr.latitude?.toString() || ''; this.longitude = addr.longitude?.toString() || ''; this.address = addr.description || ''; console.info('逆地理编码成功: ' + JSON.stringify(addr)); } }); } catch (err) { console.error("逆地理编码异常: " + JSON.stringify(err)); } } // 正地理编码:地址 → 坐标 forwardGeocode() { if (!geoLocationManager.isGeocoderAvailable()) { console.error('地理编码服务不可用'); return; } let request: geoLocationManager.GeoCodeRequest = { description: "北京市丰台区石榴庄街道xxx号", maxItems: 1 }; try { geoLocationManager.getAddressesFromLocationName(request, (err, data) => { if (err) { console.error('正地理编码失败: ' + JSON.stringify(err)); } else if (data && data.length > 0) { let addr = data[0]; console.info('正地理编码成功: 纬度=' + addr.latitude + ', 经度=' + addr.longitude); } }); } catch (err) { console.error("正地理编码异常: " + JSON.stringify(err)); } } }

五、注意事项

注意事项说明
网络要求正地理编码与逆地理编码功能需要访问后端服务,请确保设备联网
服务可用性调用前应使用isGeocoderAvailable()检查服务是否可用
重名处理对于可能多地重名的地址,建议设置经纬度范围以精确匹配
异步回调两个转换接口均使用callback异步回调方式返回结果
http://www.jsqmd.com/news/892926/

相关文章:

  • java中 (whlie)、 (if else)、( for)、(switch)
  • ESP32内存不够用?手把手教你用Platformio开启4MB PSRAM(附串口验证代码)
  • 2026年国产外夹式超声波流量计十大品牌深度测评:技术实力、行业应用与选型指南 - 仪表品牌排行榜
  • 【算法分析与设计】第10篇:下界理论与NP完全性初步
  • 京东三面:Function Calling 和 MCP 都能做工具调用,那具体什么场景下该选哪个?
  • Node.js:现代 Web 开发的高性能 JavaScript 运行时
  • 高誉 4+5 网红机油赋能青岛汽修门店,青岛莱茵特斯诚邀合作 - 资讯速览
  • 避开 Agent 落地大坑,业内大咖复盘行业真相
  • 易语言选择框批量操作:从单选互斥到一键全选/取消的实战解析
  • Keil MDK工程里printf中文正常,一换编辑器就乱码?手把手教你排查编码‘隐形杀手’
  • 去中心化Agent网络性能瓶颈大起底:TPS突破8,400的共识层改造方案(附可复现压测数据集)
  • P16307 [蓝桥杯 2026 省 Java/Python 研究生组] 抓取卡牌 题解
  • 【算法分析与设计】第11篇:图的表示与遍历算法:BFS与DFS的扩展性质
  • 终极指南:如何永久保存你的微信聊天记录?免费开源工具WeChatExporter完整教程
  • 收藏!从提示词小白到AI大模型开发者,你需要的不只是工具
  • 【无标题】AI 智能体时代的超级个体:OPC 与 OPD 人才生态分析
  • 2026 论文双降工具横评:从 paperxie 到 9 大神器,查重降 AIGC 全场景通关
  • 自动化部署项目软件 Jenkins
  • 长沙靠谱训犬寄养优选指南|岳麓/雨花/开福/天心/星沙/望城5家店铺推荐 - 资讯速览
  • 02、双指针删除元素
  • 一文啃完DNS:原理+查询+BIND部署全攻略
  • 2026年AI漫剧视频模型行业白皮书
  • 云原生技术学习日志Day01:Linux基础入门
  • 北京上门回收明清古籍老书旧书 金石拓片印谱正规渠道首选 - 品牌排行榜单
  • WarcraftHelper 终极指南:3分钟解决魔兽争霸3卡顿、宽屏、FPS限制等常见问题
  • Sora 2正式版发布首周深度逆向:Transformer时序建模新范式、世界模型耦合机制与3个尚未修复的生成漏洞(内测工程师内部备忘录)
  • Agent开发面经
  • 保姆级教程:用RDPWrap解锁Win10/11家庭版远程桌面,还能多人同时登录
  • 国内地基地梁模板头部供应商排行 实测维度客观对比 - 奔跑123
  • 基于SCCA-RMP的属性网络异常检测:融合结构与属性视图的鲁棒方法