HarmonyOS鸿蒙Next中应用如何实现调用系统地图导航或路径规划
HarmonyOS鸿蒙Next中应用如何实现调用系统地图导航或路径规划
鸿蒙应用如何实现调用系统地图导航或路径规划
一、结论
在涉及地图业务中,调用地图导航和路径规划是三方应用中较为常见的功能。
若只是子业务需要地图导航效果,整个APP内部集成地图去实现导航或者路径规划,会造成SDK集成冗余。毕竟很重。
所以该效果一般会调用系统地图,来显示当前坐标和目标坐标的路径规划或者实时导航。
鸿蒙系统提供了一种极其简单的调用方式,默认是自己当前的坐标为基础,
需要注意的是,国内的坐标系是GCJ02坐标系,国外才是wgs84坐标系。

二、代码实现和详细解释
系统地图应用的包名为: ‘com.huawei.hmos.maps.app’
import { common, Want } from '@kit.AbilityKit';
@Entry
@Component
struct Index {
aboutToAppear(): void {
}
StartNavi = ()=>{
let petalMapWant: Want = {
bundleName: 'com.huawei.hmos.maps.app',
uri: 'maps://routes', // 路径规划
// uri: 'maps://navigation', // 导航
parameters: {
// 接入方业务名或包名,Link请求来源。
linkSource: 'com.example.navitest',
destinationLatitude: 40.0382556,
destinationLongitude: 116.3144536,
// 终点Poi ID,如果有,优先使用(Map Kit返回的Poi信息含Poi ID)。
destinationPoiId: '906277887815706098',
destinationName: '北京清河高铁站',
vehicleType: 0 // 交通出行工具。0-驾车, 1-步行, 2-骑行。默认驾车
}
}
let context = getContext(this) as common.UIAbilityContext;
context.startAbility(petalMapWant);
}
build() {
RelativeContainer() {
Text("唤起导航")
.id('HelloWorld')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
.onClick(this.StartNavi)
}
.height('100%')
.width('100%')
}
}
wgs84坐标系转化为gcj02:
import { map, mapCommon } from '@kit.MapKit';
let wgs84Position: mapCommon.LatLng = {
latitude: 30,
longitude: 118
};
let gcj02Position: mapCommon.LatLng =
map.convertCoordinateSync(mapCommon.CoordinateType.WGS84, mapCommon.CoordinateType.GCJ02, wgs84Position);
更多关于HarmonyOS鸿蒙Next中应用如何实现调用系统地图导航或路径规划的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,应用通过Want机制调用系统地图导航。使用ohos.app.ability.Want指定action为ohos.want.action.viewData,uri参数传入格式化的地址字符串(如geo:latitude,longitude?q=地址)。系统会匹配并启动地图应用进行导航或路径规划。
在HarmonyOS Next中,应用可以通过Want显式跳转的方式,调用系统地图应用进行导航或路径规划。核心是使用系统预定义的ohos.want.action.navigate动作。
主要实现步骤如下:
-
构建Want对象:设置
action为ohos.want.action.navigate,entities为["entity.system.browsable"],并指定目标地图应用的bundleName和abilityName。 -
设置导航参数:在Want的
parameters中传入关键参数,通常包括:ohos.extra.param.key.location.destination_latitude: 目的地纬度 (double)ohos.extra.param.key.location.destination_longitude: 目的地经度 (double)ohos.extra.param.key.location.destination_name: 目的地名称 (可选,String)ohos.extra.param.key.location.start_latitude: 起点纬度 (可选,double)ohos.extra.param.key.location.start_longitude: 起点经度 (可选,double)ohos.extra.param.key.location.start_name: 起点名称 (可选,String)ohos.extra.param.key.location.route_type: 路径规划类型,如driving(驾车)、walking(步行)、riding(骑行)等 (可选,String)
-
启动导航:通过
startAbility或startAbilityForResult方法启动该Want。
示例代码片段 (ArkTS):
import common from '@ohos.app.ability.common';
import Want from '@ohos.app.ability.Want';
import { BusinessError } from '@ohos.base';
let context: common.UIAbilityContext = ...; // 获取UIAbility的Context
let want: Want = {
action: 'ohos.want.action.navigate',
entities: ['entity.system.browsable'],
// 需要替换为实际系统地图应用的包名和Ability名,例如:
// bundleName: 'com.huawei.maps.app',
// abilityName: 'MainAbility',
parameters: {
'ohos.extra.param.key.location.destination_latitude': 39.9096, // 示例:北京故宫纬度
'ohos.extra.param.key.location.destination_longitude': 116.3975, // 示例:北京故宫经度
'ohos.extra.param.key.location.destination_name': '故宫博物院',
'ohos.extra.param.key.location.route_type': 'driving'
}
};
try {
context.startAbility(want).then(() => {
console.info('启动地图导航成功');
}).catch((err: BusinessError) => {
console.error(`启动地图导航失败,错误码: ${err.code}, 错误信息: ${err.message}`);
});
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`启动Ability异常,错误码: ${err.code}, 错误信息: ${err.message}`);
}
关键注意事项:
- 权限:调用前需在
module.json5配置文件中申请必要的权限,例如访问设备位置的ohos.permission.LOCATION权限。 - 参数依赖:具体的参数键(如
ohos.extra.param.key.location.*)和有效值(如route_type的枚举)需参考目标地图应用(如华为地图)的官方接口文档。不同地图应用支持的参数可能存在差异。 - 包名与Ability名:
bundleName和abilityName需要指向设备上已安装的、支持该Want动作的系统地图应用。如果希望由用户选择地图应用,可以省略这两个字段,系统会弹出选择器。 - 错误处理:需妥善处理
startAbility可能抛出的异常,例如未安装地图应用、参数错误等。
通过以上方式,你的应用可以便捷地拉起系统默认或用户选择的地图应用,并传递目的地、起点等信息,由地图应用完成后续的路径规划和导航引导。

