上一篇推文“公交路線” 錯誤更正
這裡特別說下,經過我週末的查詢和驗證,發現關於上一篇推文中在實現公交資訊查詢時,有問題。當時寫的時候我只是把官網的圖擷取過來,本來想著第二天做驗證,今天早上驗證的時候發現,不能如約出現公交路線。
我這裡羅列下具體的問題
一、 只單獨引入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",即可得到網盤下載連結,希望對你有幫助。
小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
原創不易,給個關注。
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。