现在的导航SDK2.0的导航发起函数如下
public boolean launchNavigator(Activity activity,
java.util.List<BNRoutePlanNode> nodes,
int preference,
boolean isGPSNav,
BaiduNaviManager.RoutePlanListener listener)
文档给出的参数释义如下:
参数:
activity
- 建议是应用的主Activity
nodes
- 传入的算路节点,顺序是起点、途经点、终点,其中途经点最多三个,参考
BNRoutePlanNode
preference
- 算路偏好,
参考RoutePlanPreference定义
isGPSNav
- true表示真实GPS导航,false表示模拟导航
listener
- 开始导航回调监听器,在该监听器里一般是进入导航过程页面
取文档的释义如下:
public BNRoutePlanNode(double longitude, double latitude, java.lang.String name, java.lang.String description, BNRoutePlanNode.CoordinateType coType)
算路节点构造方法.
-
参数:
-
longitude
- 经度 -
latitude
- 纬度 -
name
- 算路节点名 -
description
- 算路节点地址描述 -
coType
- 坐标类型,参考 CoordinateType
BD09_MC
百度墨卡托坐标
|
GCJ02
国测局坐标
|
WGS84
GPS坐标
|
但是百度定位SDK的坐标系一般用的是bd09ll类型,这时候就需要用到类型转换,在5.3版本之前可以有另一种方法来转换的,但是5.3版本就取消了,于是6.0.5之后就有了这个函数来做转换,如下
public static BDLocation getBDLocationInCoorType(BDLocation src,
java.lang.String transferType)
根据设定的转换坐标系类型得到相应坐标系下的BDLocation
参数:
BDLocation - src 原始BDLocation
transferType - BDLocation.BDLOCATION_GCJ02_TO_BD09/BDLOCATION_GCJ02_TO_BD09LL/BDLOCATION_BD09_TO_GCJ02/ BDLOCATION_BD09LL_TO_GCJ02
用这个就可以直接将百度定位和地图获取的BDLocation转换成可以直接使用的导航参数。
// 发起算路
private void startCalcRoute(int calcMode) {
// 显示加载对话框
DialogUtil.getInstance().showProgressDialog(mActivity);
if (mBdLocation == null) {
Toast.makeText(this, getString(R.string.map_location_failed), Toast.LENGTH_LONG).show();
// 取消加载对话框
DialogUtil.getInstance().dismissProgressDialog();
return;
}
if (calcMode == 0)
calcMode = BaiduNaviManager.RoutePlanPreference.ROUTE_PLAN_MOD_AVOID_TAFFICJAM;
/*重新转换百度坐标系*/
BDLocation bd1 = new BDLocation();
double sX = 0, sY = 0, eX = 0, eY = 0;
bd1.setLatitude(staLatLng.latitude);
bd1.setLongitude(staLatLng.longitude);
sX = LocationClient.getBDLocationInCoorType(bd1, BDLocation.BDLOCATION_BD09LL_TO_GCJ02).getLatitude();
sY = LocationClient.getBDLocationInCoorType(bd1, BDLocation.BDLOCATION_BD09LL_TO_GCJ02).getLongitude();
BNRoutePlanNode startNode = new BNRoutePlanNode(sY, sX, "我的位置", "我的位置");
BDLocation bd2 = new BDLocation();
bd2.setLatitude(ebdLatLng.latitude);
bd2.setLongitude(ebdLatLng.longitude);
eX = LocationClient.getBDLocationInCoorType(bd2, BDLocation.BDLOCATION_BD09LL_TO_GCJ02).getLatitude();
eY = LocationClient.getBDLocationInCoorType(bd2, BDLocation.BDLOCATION_BD09LL_TO_GCJ02).getLongitude();
BNRoutePlanNode endNode = new BNRoutePlanNode(eY, eX, "终点", "终点");
ArrayList<BNRoutePlanNode> nodeList = new ArrayList<BNRoutePlanNode>(2);
nodeList.add(startNode);
nodeList.add(endNode);
BaiduNaviManager.getInstance().launchNavigator(mActivity, nodeList, 1, true, new BDRoutePlanListener(startNode));
官方给的文档及demo并不能正常的调起导航诱导页面,表现为点击导航没有反应 ,<pre name="code" class="java" style="font-size: 14px; font-family: Arial, Helvetica, sans-serif; padding: 5px; border: 1px dotted rgb(170, 170, 170); color: rgb(53, 56, 51); line-height: 19.6000003814697px; background-color: rgb(246, 246, 246);"> BaiduNaviManager.getInstance().launchNavigator(mActivity, nodeList, 1, true, new BDRoutePlanListener(startNode));方法的监听走到onRoutePlanFailed()方法里面,倒是导航调起失败,分析失败原因应该是该方法里的传入的参数异常导致的,最后通过转换坐标系非方法解决了该问题
。进行上述的修改后即可以正常运行百度最新的导航相关的问题;