百度地圖開發-在地圖上實現路線導航 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”,即可得到網盤下載鏈接,希望對你有幫助。

小寄語

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

原創不易,給個關注。

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