百度地圖開發-在地圖上實現路線導航 09

—阿輝發表於2021-09-02

上一篇推文“公交路線” 錯誤更正

這裡特別說下,經過我週末的查詢和驗證,發現關於上一篇推文中在實現公交資訊查詢時,有問題。當時寫的時候我只是把官網的圖擷取過來,本來想著第二天做驗證,今天早上驗證的時候發現,不能如約出現公交路線。

我這裡羅列下具體的問題

一、 只單獨引入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",即可得到網盤下載連結,希望對你有幫助。

小寄語

人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。

原創不易,給個關注。

我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。

相關文章