百度地图开放平台
更新时间: 2026/07/22 20:35
导航实时数据
下载开发文档
概述

导航实时数据监听模块提供一套完整的事件回调机制,用于监听导航过程中的各类实时事件(诱导、车速、路况、车道线等),并将数据以类型化接口形式传递给应用层。
接口设计原则

  • 对标 iOS BNaviModelDelegate 回调模式

  • 所有监听回调均为可选(使用 ? 标记为可选方法)

  • 数据结构采用简单对象设计,避免复杂嵌套

1. 核心接口
1.1 导航主接口 BNINaviInterface
export interface BNINaviInterface {
/**
* 开始导航
* @returns {Promise<boolean>} 是否成功启动
*/
startNavi: () => Promise<boolean>;
/**
* 停止导航
* @returns {Promise<boolean>} 是否成功停止
*/
stopNavi: () => Promise<boolean>;
/**
* 添加导航实时数据监听器
* @param listener 监听者,实现 BNINaviEventListener 接口
*/
addNaviDataListener(listener: BNINaviEventListener): void;
/**
* 移除导航实时数据监听器
* @param listener 监听者
*/
removeNaviDataListener(listener: BNINaviEventListener): void;
}
1.2 事件监听器接口 BNINaviEventListener

所有导航实时数据回调均在此接口中定义,按功能分为 14 个类别。

2. 监听回调分类详解
2.1 诱导面板 (Guide Info)
onSimpleGuideInfoChange(simpleGuideInfo: BNIGuideInfo)

下一路口的转向引导信息更新回调。
参数

interface BNIGuideInfo {
nextRoadName: string; // 下一路口名字
curRoadName: string; // 当前路名(顺行模式)
nextNextRoadName: string; // 随后的下一路名
turnIconName: string; // 转向标资源名称
totalDist: number; // 该段路总长度,单位:米
remainDist: number; // 距离下一路口剩余长度,单位:米
remainTime: number; // 距离下一路口大概时间,单位:秒
isStraight: boolean; // 是否处于顺行模式
isStraightIcon: boolean; // 当前路口转向图标是否为直行类型
nextTurnKind: BNManeuverKind; // 下一转向类型
curTurnKind: BNManeuverKind; // 当前转向类型
distCurToNextGP: number; // 当前机动点到下一机动点距离,单位:米
isHighwayBeforeNextGP: boolean; // 当前机动点到下一机动点之间是否经过高速出口
gpAddDist: number; // 机动点附加距离,单位:米
}
2.2 车道线 (Lane Info)
onLaneInfoChange(action: BNAction, laneIcons: BNILaneIcon[])

车道线信息更新回调(从左到右顺序)。
参数

  • action: 动作类型 ('SHOW' | 'UPDATE' | 'HIDE')

  • laneIcons: 车道图标列表

enum BNAction {
SHOW = 'SHOW', // 显示
UPDATE = 'UPDATE',// 更新
HIDE = 'HIDE', // 隐藏
}
interface BNILaneIcon {
resName: string; // 车道图标资源名称
}
2.3 剩余时间/距离 (Remain Info)
onRemainInfoChange(remainDistance: number, remainTime: number)

全程剩余时间和距离更新。
参数

  • remainDistance: 剩余距离,单位:

  • remainTime: 剩余时间,单位:

2.4 剩余红绿灯 (Traffic Lights)
onRemainTrafficlightsInfoChange(remainTrafficLightsInfo: BNIRemainTrafficLightsInfo)

剩余红绿灯数量更新。

interface BNIRemainTrafficLightsInfo {
count: number; // 剩余红绿灯数量
}
2.5 定位信号 (Signal)
onSignalInfoChange(signalInfo: BNISignalInfo)

定位信号状态更新(综合隧道、地库、卫星数量派生)。
参数

enum BNSignalState {
TUNNEL = 0, // 在隧道(VDR 定位)
UNDERGROUND = 1, // 在地库
WEAK = 2, // 信号弱(丢星或卫星数量少)
MEDIUM = 3, // 信号中
STRONG = 4, // 信号强
}
interface BNISignalInfo {
state: BNSignalState;
}

优先级:隧道 > 地库 > 丢星/弱 > 中 > 强

2.6 路名 (Road Name)
onRoadNameInfoChange(name: string)

当前道路名称更新。
参数

  • name: 当前道路名称(字符串)

2.7 车速 (Speed)
onGPSSpeedChange(speed: number, speedLimit: number)

GPS 速度与限速更新。
参数

  • speed: 当前车速,单位:km/h(-1 表示速度不可信)

  • speedLimit: 当前路段限速,单位:km/h(0 表示无限速)

onSpeedLimitReached()

超速回调,1 km 内超速触发一次,无参数。

onSpeedHidden(msg: BNISpeedHideMsg)

限速信息丢星。(注意:不是码表 UI 隐藏)

interface BNISpeedHideMsg {
isHidden: boolean; // true = 丢星,false = 正常
}
2.8 区间测速 (Interval Speed)
onIntervalSpeedChange(info: BNIIntervalSpeedInfo)

区间测速信息更新。

interface BNIIntervalSpeedInfo {
action: string; // 'show' | 'update' | 'hide'
speedLimit: number; // 区间限速值,单位:km/h(hide 时为 0)
intervalLength: number; // 区间长度,单位:米(hide 时为 0)
averageSpeed: number; // 当前区间平均速度,单位:km/h(show 时为 0)
}
2.9 实时路况 (Road Condition)
onRoadConditionInfoChange(progress: number, items: BNIRoadCondition[])

实时路况段信息更新。
参数

  • progress: 车辆行驶进度,范围 0.0 - 1.0(对应 0% - 100%)

  • items: 路况段列表

interface BNIRoadCondition {
index: number; // 路况段在整条路线中的终止索引
type: number; // 0=畅通,1=缓慢,2=拥堵,3=严重拥堵
}
onRoadConditionTypeChange(roadConditionType: number)

路况条类型变化回调(当前车所在路况段的类型)。
参数

  • roadConditionType: 路况类型(0/1/2/3)

2.10 高速面板 (Highway Panel)
onHighwayPanelDataChange(model: BNIHighwayPanelData)

高速面板数据更新(服务区、收费站、出口等)。

interface BNIHighwayPanelData {
action: string; // 'SHOW' | 'UPDATE' | 'HIDE'
topModel?: BNIHighwayContentData; // 第一个机动点信息
bottomModel?: BNIHighwayContentData; // 第二个机动点信息(可选)
}
interface BNIHighwayContentData {
highwayInfoType: number; // 面板类型(BNHighwayInfoType 数值)
name: string; // 名称(服务区/收费站/出口)
remainDist: number; // 剩余距离,单位:米
}
2.11 主辅路/高架桥 (MainSlave & Viaduct)
onMainSlaveViaductChange(info: BNIMainSlaveViaductInfo)

主辅路与高架桥组合状态变化(任一发生变化就透出)。

interface BNIMainSlaveViaductInfo {
roadStatus: number; // 0=不显示,1=主路,2=辅路
bridgeStatus: number; // 0=不显示,1=桥上,2=桥下
}
onMainSlaveViaductChangeResult(result: BNIMainSlaveViaductChangeResult)

主辅路/高架桥切换结果回调。

interface BNIMainSlaveViaductChangeResult {
isSuccess: boolean; // 是否切换成功
}
onMainSlaveChange(mainSlaveInfo: BNIMainSlaveInfo)

主辅路切换提示(仅主辅路按钮出现时触发)。

interface BNIMainSlaveInfo {
roadStatus: number; // 1=主路,2=辅路
}

特殊触发条件:仅当 isShow && roadStatus !== 0 时触发

2.12 路线变化 (Route Change)
onYawingDidStart(yawingId?: string)

开始偏航回调。
参数

  • yawingId(可选): 偏航标识

onDrivingRouteChange(drivingRouteData: BNICarRouteData)

主路变化回调。

onRouteDidChange(node: BNIRoutePlanNode, index: number, error?: Error)

途经点/终点更新结果。
参数

  • node: 途经点/终点节点

  • index: 途经点下标序号(从 1 开始

  • error: 失败时的错误信息(可选)

onRouteDidRefresh(type: BNOtherRouteType)

刷新路线完成回调。

enum BNOtherRouteType {
SWITCH_SUCCESS = 'SWITCH_SUCCESS', // 切换成功
SWITCH_FAILED = 'SWITCH_FAILED', // 切换失败
NEW_ROUTE = 'NEW_ROUTE', // 出现新路线
NO_NEW_ROUTE = 'NO_NEW_ROUTE', // 无新路线
}
onRecalculateRouteFinished()

重新算路成功,无参数。

onRecalculateRouteFailed()

重新算路失败,无参数。

2.13 车道级 (Lane Level)
onNavigationMapLaneStatusChange(isEntered: boolean)

车道级路线自动进入/退出。
参数

  • isEntered: true = 进入车道级,false = 退出

onNavigationMapLaneModeChanged(status: BNMultiMapsStatus)

车道级模式状态变化。

enum BNMultiMapsStatus {
EXIT = 0, // 退出/2D 模式
SINGLE = 1, // 3D 单屏模式
MULTI = 2, // 分屏模式
}
2.14 昼夜模式与导航状态
onDayNightTypeChanged(dayNightType: BNDayNightMode)

昼夜模式变化。

enum BNDayNightMode {
DAY = 0, // 白天模式
NIGHT = 1, // 夜间模式
}
onNaviStatusChange(info: BNINaviStatusInfo)

导航状态变化回调。

enum BNNaviStatusType {
Invalid = 0,
Begin = 1, // 导航开始
Yawing = 2, // 偏航中
ReRouteEnd = 3, // 偏航计算完成
ReRouteCarFree = 4, // 车标自由状态
End1 = 5, // 目的地接近
End2 = 6, // 目的地到达
BuildRoute = 7, // 导航中请求诱导
AltRouteChanging = 8, // 导航中仅备选路线更新开始
RouteChanging = 9, // 导航中含主线切换开始
RouteChangedEnd = 10, // 导航中切换路线完成
ExactGuide = 11, // 模糊引导绑定 link
FakeYawing = 12, // 静默偏航
}
enum BNNaviSightType {
Invalid = 0,
RealNavi = 1, // 真实导航
DemoNavi = 2, // 模拟导航
LightNavi = 3, // 路线雷达
GenericNavi = 4, // 泛导航
FuzzyNavi = 5, // 模糊导航
CommuteNavi = 6, // 熟路导航
IndoorParkNavi = 7, // 智能停车场导航
}
interface BNINaviStatusInfo {
eNaviStatusType: BNNaviStatusType; // 导航状态
eNaviSightType: BNNaviSightType; // 导航场景
}
onViaPointPassed(passViaInfo: BNIPassViaPointInfo)

经过途经点/偏航时移除途经点消息。

interface BNIPassViaPointInfo {
/**
* 类型
* - 1: 正常经过途经点
* - 2: 偏航时该途经点被自动删除
*/
enType: number;
viaIndex: number; // 途经点索引(从 0 开始)
}

触发场景

  1. 正常经过某个途经点(enType == 1

  2. 接近途经点时发生偏航,SDK 自动丢弃该途经点(enType == 2

3. 使用示例
3.1 创建监听器
class MyNaviListener implements BNINaviEventListener {
// 诱导面板
onSimpleGuideInfoChange(guideInfo: BNIGuideInfo) {
console.log(`下一路口:${guideInfo.nextRoadName}`);
console.log(`剩余距离:${guideInfo.remainDist}`);
}
// 车速
onGPSSpeedChange(speed: number, speedLimit: number) {
console.log(`当前速度:${speed}km/h,限速:${speedLimit}km/h`);
}
onSpeedLimitReached() {
console.log('超速警告');
}
// 路况
onRoadConditionInfoChange(progress: number, items: BNIRoadCondition[]) {
console.log(`行驶进度:${(progress * 100).toFixed(0)}%`);
console.log(`路况段数:${items.length}`);
}
// 车道级
onNavigationMapLaneStatusChange(isEntered: boolean) {
console.log(isEntered ? '进入车道级' : '退出车道级');
}
// 路线变化
onYawingDidStart(yawingId?: string) {
console.log(`偏航开始:${yawingId}`);
}
onRecalculateRouteFinished() {
console.log('重新算路成功');
}
onRecalculateRouteFailed() {
console.log('重新算路失败');
}
onRouteDidChange(node: BNIRoutePlanNode, index: number, error?: Error) {
if (error) {
console.error(`途经点 ${index} 更新失败:${error.message}`);
} else {
console.log(`途经点 ${index} 已更新`);
}
}
// 导航状态
onNaviStatusChange(info: BNINaviStatusInfo) {
const statusName = BNNaviStatusType[info.eNaviStatusType];
const sightName = BNNaviSightType[info.eNaviSightType];
console.log(`导航状态:${statusName},场景:${sightName}`);
}
}
3.2 注册/注销监听器
// 获取导航实例
const naviAbility = BNNaviAbility.getInstance();
// 创建监听器
const listener = new MyNaviListener();
// 添加监听
naviAbility.addNaviDataListener(listener);
// ... 导航过程中持续接收回调 ...
// 移除监听
naviAbility.removeNaviDataListener(listener);

上一篇

多路线导航

下一篇

无UI导航
本篇文章对您是否有帮助?