/*********************************************************************************
Copyright © SuperMap. All rights reserved.
Author: Wang zihao
E-mail: pridehao@gmail.com
**********************************************************************************/
import {NativeModules,DeviceEventEmitter,NativeEventEmitter,Platform} from 'react-native';
let TN = NativeModules.JSNavigation;
import GeoLine from './GeoLine';
const nativeEvt = new NativeEventEmitter(TN);
/**
* @class TraditionalNavi
* @description 导航类,导航类提供路径分析和引导功能。(该类对象只能通过mapControl类下方法获取)
*/
export default class TraditionalNavi {
/**
* 链接导航路网数据
* @memberOf TraditionalNavi
* @param dataPath - 数据存储路径
* @returns {Promise.<Promise.boolean>}
*/
async connectNaviData(dataPath){
try{
var {success} = await TN.connectNaviData(this._SMTraditionalNaviId,dataPath);
return success;
}catch (e){
console.log(e);
}
}
/**
* 执行路径分析。
* 路径分析模式的值为[0,1,2,3],其分别表示推荐模式、时间最快模式、距离最短模式、和最少收费模式。
* @memberOf TraditionalNavi
* @param mode - 路径分析模式。
* @returns {Promise.<number>} 路径分析成功返回1,路径分析失败返回0,起点周围无道路返回-1,终点周围无道路返回-2。
*/
async routeAnalyst(mode){
try{
var {result} = await TN.routeAnalyst(this._SMTraditionalNaviId,mode);
return result;
}catch (e){
console.log(e);
}
}
/**
* 设置路径规划的起点。
* @memberOf TraditionalNavi
* @param x - 起点经度坐标(度)。
* @param y - 起点纬度坐标(度)。
* @param map - 导航所属地图对象
* @returns {Promise.<void>}
*/
async setStartPoint(x,y,map){
try{
await TN.setStartPoint(this._SMTraditionalNaviId,x,y,map._SMMapId);
}catch (e){
console.log(e);
}
}
/**
* 设置路径规划的终点。
* @memberOf TraditionalNavi
* @param x - 终点经度坐标(度)。
* @param y - 终点纬度坐标(度)。
* @param map - 导航所属地图对象
* @returns {Promise.<void>}
*/
async setDestinationPoint(x,y,map){
try{
await TN.setDestinationPoint(this._SMTraditionalNaviId,x,y,map._SMMapId);
}catch (e){
console.log(e);
}
}
/**
* 开始导航。
* 引导状态的值为[0,1,2],其分别表示执行真实导航、执行模拟导航、执行定位点巡航。
* @memberOf TraditionalNavi
* @param status - 引导状态。
* @returns {Promise.<void>}
*/
async startGuide(status){
try{
var {guiding} = await TN.startGuide(this._SMTraditionalNaviId,status);
return guiding;
}catch (e){
console.log(e);
}
}
/**
* 添加途经点
* @memberOf TraditionalNavi
* @param {number} x - 途经点x坐标
* @param {number} y - 途经点y坐标
* @returns {Promise.<Promise.boolean>}
*/
async addWayPoint(x,y){
try{
var {added} = await TN.addWayPoint(this._SMTraditionalNaviId,x,y);
return added;
}catch (e){
console.log(e);
}
}
/**
* 停止引导。
* @memberOf TraditionalNavi
* @returns {Promise.<Promise.boolean>}
*/
async stopGuide(){
try{
var {stopped} = await TN.stopGuide(this._SMTraditionalNaviId);
return stopped;
}catch (e){
console.log(e);
}
}
/**
* 设置导航指引信息控制,用于控制导航中是否播报引导信息
* @memberOf TraditionalNavi
* @param {boolean} speech
* @returns {Promise.<Promise.speak>}
*/
async setSpeechParam(speech){
try{
var {speak} = await TN.setSpeechParam(this._SMTraditionalNaviId,speech);
return speak;
}catch (e){
console.log(e);
}
}
/**
* 设置GPS数据
* @memberOf TraditionalNavi
* @param {object} gpsData - gps数据
* @returns {Promise.<void>}
*/
async setGPSData(gpsData){
try{
await TN.setGPSData(this._SMTraditionalNaviId,gpsData);
}catch (e){
console.log(e);
}
}
/**
* 导航中,将小车位置作为地图中心。 当允许导航中平移地图时,移动地图后,可以通过该接口使小车一直在地图中心显示。
* @memberOf TraditionalNavi
* @returns {Promise.<void>}
*/
async locateMap(){
try{
await TN.locateMap(this._SMTraditionalNaviId);
}catch (e){
console.log(e);
}
}
/**
* 当前是否在引导过程中。
* @memberOf TraditionalNavi
* @returns {Promise.<boolean>}
*/
async isGuiding(){
try{
var {guiding} = await TN.isGuiding(this._SMTraditionalNaviId);
return guiding;
}catch (e){
console.log(e);
}
}
/**
* 获取导航剩余时间
* @memberOf TraditionalNavi
* @param speed - 当前行驶速度
* @returns {Promise.<number>}
*/
async getTimeToDestination(speed){
try{
var {time} = await TN.getTimeToDestination(this._SMTraditionalNaviId,speed);
return time;
}catch (e){
console.log(e);
}
}
/**
* 获得路径分析线路。
* @memberOf TraditionalNavi
* @returns {Promise.<object>}
*/
async getRoute(){
try{
var {geoLineId} = await TN.getRoute(this._SMTraditionalNaviId);
var geoLine = new GeoLine();
geoLine._SMGeoLineId = geoLineId;
return geoLine;
}catch (e){
console.log(e);
}
}
/**
* 引导过程中是否允许平移地图。
* @memberOf TraditionalNavi
* @param bPan - 一个布尔值,用来指示在导航过程中是否允许平移地图,true,表示允许,false,表示不允许。
* @returns {Promise.<void>}
*/
async enablePanOnGuide(bPan){
try{
await TN.enablePanOnGuide(this._SMTraditionalNaviId,bPan);
}catch (e){
console.log(e);
}
}
/**
* 清除路径分析的结果
* @memberOf TraditionalNavi
* @returns {Promise.<void>}
*/
async cleanPath(){
try{
await TN.cleanPath(this._SMTraditionalNaviId);
}catch (e){
console.log(e);
}
}
/**
* 获取导航路径的详情
* @memberOf TraditionalNavi
* @returns {Promise.<Promise.array>} - 返回一个导航路径上所有路径的NaviStep对象数组,每个pathInfo对象的结构为{point:{x:--,y:--},length:--,name:--,time:--,turnType:--}
*/
async getNaviPath() {
try {
var {naviPath} = await TN.getNaviPath(this._SMTraditionalNaviId);
return naviPath;
} catch (e) {
console.log(e);
}
}
/*
* 设置导航信息变化监听器。
* @param callback - 导航信息变化监听器回调函数。
* 用法:await industryNavi.setDistanceChangeListener(
* {
* startNavi:(e) => {console.log("start")},
* naviInfoUpdate:(e) => {console.log(e.curRoadName + e.direction ....)},
* arrivedDestination:(e) => {console.log("updated")},
* stopNavi:(e) => {console.log("stop")},
* adjustFailure:(e) => {console.log("failure")},
* playNaviMessage:(e) => {console.log(e.message)},
*
* }
* );
* 其中naviInfoUpdate回调中的参数是一个NaviInfo对象,其结构为:
* {
* curRoadName:--,
* direction:--,
* iconType:--,
* nextRoadName:--,
* routeRemainDis:--,
* routeRemainTime:--,
* segRemainDis:--
* }
* @returns {Promise}
*/
async addNaviInfoListener(events){
try{
var success = await TN.addNaviInfoListener(this._SMTraditionalNaviId);
if(success){
//差异化
if(Platform.OS === 'ios'){
typeof events.startNavi !== 'function' ||
nativeEvt.addListener("com.supermap.RN.JSNavigation2.start_navi",function (e) {
events.startNavi(e);
});
typeof events.naviInfoUpdate !== 'function' ||
nativeEvt.addListener("com.supermap.RN.JSNavigation2.navi_info_update",function (e) {
events.naviInfoUpdate(e);
});
typeof events.arrivedDestination !== 'function' ||
nativeEvt.addListener("com.supermap.RN.JSNavigation2.arrived_destination",function (e) {
events.arrivedDestination(e);
});
typeof events.stopNavi !== 'function' ||
nativeEvt.addListener("com.supermap.RN.JSNavigation2.stop_navi",function (e) {
events.stopNavi(e);
});
}else{
typeof events.startNavi !== 'function' ||
DeviceEventEmitter.addListener("com.supermap.RN.JSNavigation2.start_navi",function (e) {
events.startNavi(e);
});
typeof events.naviInfoUpdate !== 'function' ||
DeviceEventEmitter.addListener("com.supermap.RN.JSNavigation2.navi_info_update",function (e) {
events.naviInfoUpdate(e);
});
typeof events.arrivedDestination !== 'function' ||
DeviceEventEmitter.addListener("com.supermap.RN.JSNavigation2.arrived_destination",function (e) {
events.arrivedDestination(e);
});
typeof events.stopNavi !== 'function' ||
DeviceEventEmitter.addListener("com.supermap.RN.JSNavigation2.stop_navi",function (e) {
events.stopNavi(e);
});
typeof events.adjustFailure !== 'function' ||
DeviceEventEmitter.addListener("com.supermap.RN.JSNavigation2.adjust_failure",function (e) {
events.adjustFailure(e);
});
typeof events.playNaviMessage !== 'function' ||
DeviceEventEmitter.addListener("com.supermap.RN.JSNavigation2.play_navi_massage",function (e) {
events.playNaviMessage(e);
});
}
}
return success;
}catch(e){
console.error(e);
}
}
}