12.2 青島 晴
前些天看了下百度地圖的api,找到了幾個不錯的方法,拿出來分享下,導百度地圖的jar包後項目較大,沒法上傳csdn,想要源碼的留郵箱。
百度地圖有個導航功能,可以獲取到兩個座標的導航地圖,指定路線進行導航,但是百度文檔中好像並沒有明確的指出怎樣獲取這些路線的距離(駕車,步行路線等等),經過研究發現,我們可以不使用百度的那個導航地圖而獲取到導航路線的距離。
先上一波效果圖:
第一張是百度地圖的駕車導航,第二張是研究的,查詢的地點是青島市汽車東站附近到中海國際社區朗園,第二張是通過點擊地圖獲取座標來查詢的路線距離會有誤差,實測不是很大。
廢話不多說直接介紹做法:
1.百度地圖的sdk你得有吧,像那些基礎定位,檢索功能,計算工具,導航功能你得有吧,看文檔完整的導入。
2.將下面的代碼放到適當的地方使用
private void searchRoute(BNRoutePlanNode sNode, BNRoutePlanNode eNode) {
BNRoutePlanNode bp1 = sNode;
BNRoutePlanNode bp2 = eNode;
RoutePlanSearch search = RoutePlanSearch.newInstance(); //百度的搜索路線的類
DrivingRoutePlanOption drivingRoutePlanOption = new DrivingRoutePlanOption();
//起始座標和終點座標
PlanNode startPlanNode = PlanNode.withLocation(new LatLng(bp1.getLatitude(), bp1.getLongitude())); // lat long
PlanNode endPlanNode = PlanNode.withLocation(new LatLng(bp2.getLatitude(), bp2.getLongitude()));
drivingRoutePlanOption.from(startPlanNode);
drivingRoutePlanOption.to(endPlanNode);
search.drivingSearch(drivingRoutePlanOption);
search.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() { //搜索完成的回調
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) { //步行路線
if (walkingRouteResult.getRouteLines() == null) return;
int duration = walkingRouteResult.getRouteLines().get(0).getDuration();
Toast.makeText(context, duration + "米", Toast.LENGTH_SHORT).show();
}
@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
}
@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) { //駕車路線
if (drivingRouteResult.getRouteLines() == null) {
Toast.makeText(context, "算路失敗", Toast.LENGTH_SHORT).show();
return;
}
int duration = drivingRouteResult.getRouteLines().get(0).getDistance();
Toast.makeText(context, "距離是:" + duration + "米", Toast.LENGTH_SHORT).show();
}
@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
}
});
}
其實百度的api中的類,方法挺多的,只是好多沒寫在文檔上,這裏面的這幾個類都是在百度架包com.baidu.mapapi.search.route下面,有興趣的朋友可以多項研究研究。
RoutePlanSearch:看名字就知道這玩意是搜索路徑的
這裏面有 public boolean walkingSearch(WalkingRoutePlanOption var1)
public boolean transitSearch(TransitRoutePlanOption var1)
public boolean drivingSearch(DrivingRoutePlanOption var1)
public boolean bikingSearch(BikingRoutePlanOption var1)
這麼幾個有用的方法,分別是搜索步行、地鐵、駕車、自行車的路線,每個方法傳入的實體也不同但是都差不多,都是.from .to 傳進去起始和結束的座標。然後在set給搜索完成的回調OnGetRoutePlanResultListener()這個是公用的,也有四個不同的藉口回調方法。我這用了駕車,其他的可以自行測試。
關於座標點,百度有自己的一套
BNRoutePlanNode sNode = new BNRoutePlanNode(llstart.longitude, llstart.latitude, "", null, CoordinateType.GCJ02); //新建兩個座標點
BNRoutePlanNode eNode = new BNRoutePlanNode(llend.longitude, llend.latitude, "", null, CoordinateType.GCJ02);
只要將自己需要的座標組裝好,按部就班的就ok啦。
這個也是自己閒的無聊瞎鼓搗的,不知道爲什麼百度地圖並沒有將這部分內容寫在文檔上,也許這個是有bug的,所以商業用途的朋友請多多測試。
言語不當,還望包含;如有bug,還望指正;若要源碼,請點擊下載;謝謝。
源碼在這裏:點擊下載。