百度地圖開發-在地圖上實現路線導航 09
上一篇推文「公交路線」 錯誤更正
這裡特別說下,經過我周末的查詢和驗證,發現關於上一篇推文中在實現公交資訊查詢時,有問題。當時寫的時候我只是把官網的圖截取過來,本來想著第二天做驗證,今天早上驗證的時候發現,不能如約出現公交路線。
我這裡羅列下具體的問題
一、 只單獨引入OverlayManager.java和BusLineOverlay.java文件是不可以的。經測試發現需要引入其官方DEMO中的4個文件夾數據,分別是assets, com, layout, value。
assets:將其文件夾整個拷貝到main目錄下。
com:將其拷貝到main/java目錄下,這裡可能會出現錯誤,主要是在IconGenerator類和DefaultClusterRenderer類中的R錯誤,需要將其R路徑換成當前包的R即可。
layout: 將其DEMO工程Layout中的text_bubble引入到你的項目中。
value: 將style.xml中的內容複製到項目中的style.xml中。
這樣子就把所有用於在地圖上畫軌跡的文件和資源都引入進來了。
二、 有一點需要注意,就是如果你在onCreate()方法中進行公交路線檢索時會在回調函數中,出現錯誤,提示PERMISSION_UNFINISHED。目前官方也沒有說明錯誤原因,提示許可未完成。
檢索方法必須放在點擊事件或者別的方法中才可以。
//公交路線檢索
mPoiSearch.searchInCity(new PoiCitySearchOption().city("天津").keyword("707").scope(2));
最後實現的效果如下圖:
天津公交的路線圖。
好了,步入正題。上一篇推文主要介紹了在地圖上面檢索數據,進行POI操作,可以查找某個店鋪,查詢公交路線的走向。下面這篇推文主要介紹下我們利用百度地圖如何實現導航功能,比如準備去天津西站,從天津南站如何過去,路線是什麼,如何顯示在介面中。
官方教程中在路線規劃中有很多種形式,比如步行,騎行,地鐵+公交,開車等,實現的邏輯程式碼都大同小異,這裡我就根據教程來簡單實現步行的路線規劃,看看如何能快速的實現所處位置和目的地的路線。
在地圖上實現路線導航
現在我們根據教程的提示,簡單實現在百度地圖上進行路線的規劃。
步行路線規劃可以根據步行路線的起終點數據,使用WalkingRouteOverlay畫出步行路線圖,包括起終點和轉彎點。支援其自定義其圖標。(注意步行路線規划起終點不能超過100公里)。
//路線規劃
mSearch=RoutePlanSearch.newInstance();
mSearch.setOnGetRoutePlanResultListener(routePlanResultListener);
//步行路線規劃
PlanNode stNode=PlanNode.withCityNameAndPlaceName("天津","南站地鐵口");
PlanNode enNode=PlanNode.withCityNameAndPlaceName("天津","華苑地鐵口");
mSearch.walkingSearch((new WalkingRoutePlanOption()).from(stNode).to(enNode));
/**
* 路線規劃監聽器
*/
OnGetRoutePlanResultListener routePlanResultListener=new OnGetRoutePlanResultListener() {
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
//創建WalkingRouteOverlay實例
WalkingRouteOverlay overlay = new WalkingRouteOverlay(mBaiduMap);
if (walkingRouteResult.getRouteLines()!=null){
if (walkingRouteResult.getRouteLines().size()>0){
//獲取路徑規劃數據(返回第一條數據),設置overlay路徑數據
overlay.setData(walkingRouteResult.getRouteLines().get(0));
overlay.addToMap(); //在地圖上進行繪製
}
}
}
}
這樣就在地圖中顯示出了其步行路線規劃。這裡我們可以根據官網給的教程來實現騎行路線規劃、駕車路線規劃等功能,都是很實用的。但是坑也很多,要特別注意。
坐標轉換
在我們實際的項目中,很多時候得到的是更加準確的GPS全球衛星定位系統使用的坐標。但是我們百度地圖展示的坐標是BD09LL坐標,也就是說我們實際得到的坐標要想在百度地圖上使用,就必須先進行坐標的轉換才可以。
那麼坐標是如何分類的呢。
主要有以下三種:
1、WGS84:一種大地坐標,也是目前廣泛使用的GPS全球衛星定位系統使用的坐標系。
2、GCJ02:由中國國家測繪局制定的地理資訊系統的坐標系統,是由WGS84坐標系經過加密後的坐標系。(為了安全起見,中國的所有地圖、測繪公司得到的坐標都是經過一定的加密後的坐標,也就是說可能實際位置會有一點偏差)。
3、BD09:百度坐標系,在GCJ02坐標系的基礎上再次加密。
目前百度地圖不能直接使用WGS84坐標進行展示,必須轉換為BD09坐標系,否則即使載入出來,位置也會有偏差。
轉換方式分為兩種:
1、通用坐標轉換方法(坐標之間的相互轉換)
其他坐標轉換(高德地圖,騰訊地圖等)為百度經緯度坐標BD09LL
//初始化左邊轉換工具類,指定源坐標類型和坐標數據
//sourceLatLng 待轉換坐標
CoordinateConverter converter = new CoordinateConverter()
.from(COMMON)
.coord(sourceLatLng);
//轉換坐標
LatLng desLatLng = converter.convert();
GPS設備採集的原始GPS坐標轉換為百度坐標
// sourceLatLng待轉換坐標
CoordinateConverter converter = new CoordinateConverter()
.from(CoordinateConverter.CoordType.GPS)
.coord(sourceLatLng);
//desLatLng 轉換後的坐標
LatLng desLatLng = converter.convert();
2、自動坐標轉換(GCJ02坐標輸入輸出)
在全局聲明為GCJ02坐標類型,全應用內自動執行從GCJ02到BD09LL的坐標轉換。
//包括BD09LL和GCJ02兩種坐標,默認是BD09LL坐標。
SDKInitializer.setCoordType(CoordType.GCJ02);
//獲取當前使用的坐標類型
SDKInitializer.getCoordType();//BD09LL或者GCJ02坐標
提示: 百度地圖中國默認為BD09LL,國外默認為WGS84。
好了,幸福的時光總是短暫的。
百度地圖開發系列也更新了9篇,基本上把Android項目中百度地圖開發該踩的坑都過了一遍,後面我會把我新建的這個testandroid項目同步到Gitee和Github中或者可以在公眾號後台發送”百度地圖DEMO”,即可得到網盤下載鏈接,希望對你有幫助。
小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
原創不易,給個關注。
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。