1. 程式人生 > >百度地圖4.1_1開發教程(7)工具類

百度地圖4.1_1開發教程(7)工具類

繼續上次截圖的工具類  
本章包含的內容有,
1.移動指定的經緯度到中心點
2.將座標收藏到收藏夾
3.移動點的斜率、角度、距離(官方)
4.進行軌跡移動
/**
 * 百度地圖工具類
 * Created by kowal on 2016/12/8.
 */

public class BaiduMapUtils
{
    /**
     * 將地圖移動到一個經緯度位置
     * @param latlng
     */
    public static void moveToLatlng(BaiduMap mBaiduMap, LatLng latlng , float ZOOM_LEVEL)
    {
        MapStatus.Builder builder = new
MapStatus.Builder(); builder.target(latlng).zoom(ZOOM_LEVEL); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } /** * 將座標收藏到收藏夾 * @param poiName 收藏點的名 * @param latitude 座標 * @param longitude * @return */ public
static String favoMarker(Context context,String poiName, double latitude, double longitude ) { FavoritePoiInfo info = new FavoritePoiInfo(); info.poiName(poiName ); LatLng pt = new LatLng(latitude, longitude); info.pt(pt); if (FavoriteManager.getInstance().add(info) == 1
) { return context.getString(R.string.favo_succ); } else { return context.getString(R.string.favo_failed); } } }
    /**
     * 進行軌跡移動
     *
     * @param mMoveMarker 指定的marker
     * @param mv_mapview  當前使用的mapview控制元件
     * @param mHandler    執行的執行緒,使用mHandler = new Handler(Looper.getMainLooper());初始化
     * @param latlngs     從伺服器獲取的陣列,例如:
     *                    private static final LatLng[] latlngs = new LatLng[]
     *                    {
     *                    new LatLng(39.95853, 116.103013),
     *                    new LatLng(39.938506, 116.139808),
     *                    new LatLng(39.931425, 116.167978),
     *                    };
     */
    public static void moveLooper(final Marker mMoveMarker,
                                  final MapView mv_mapview, final Handler mHandler, final LatLng[] latlngs)
    {
        new Thread()
        {

            public void run()
            {
                SystemClock.sleep(2000);
                for (int i = 0; i < latlngs.length - 1; i++)
                {
                    final LatLng startPoint = latlngs[i];
                    final LatLng endPoint = latlngs[i + 1];
                    mMoveMarker
                            .setPosition(startPoint);

                    mHandler.post(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            // refresh marker's rotate
                            if (mv_mapview == null)
                            {
                                return;
                            }
                            mMoveMarker.setRotate((float) getAngle(startPoint,
                                    endPoint));
                        }
                    });
                    double slope = getSlope(startPoint, endPoint);
                    // 是不是正向的標示
                    boolean isReverse = (startPoint.latitude > endPoint.latitude);

                    double intercept = getInterception(slope, startPoint);

                    double xMoveDistance = isReverse ? getXMoveDistance(slope) :
                            -1 * getXMoveDistance(slope);
                    for (double j = startPoint.latitude; !((j > endPoint.latitude) ^ isReverse);
                         j = j - xMoveDistance)
                    {
                        LatLng latLng = null;
                        if (slope == Double.MAX_VALUE)
                        {
                            latLng = new LatLng(j, startPoint.longitude);
                        } else
                        {
                            latLng = new LatLng(j, (j - intercept) / slope);
                        }
                        final LatLng finalLatLng = latLng;
                        mHandler.post(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                if (mv_mapview == null)
                                {
                                    return;
                                }
                                mMoveMarker.setPosition(finalLatLng);
                            }
                        });
                        try
                        {
                            Thread.sleep(TIME_INTERVAL);
                        } catch (InterruptedException e)
                        {
                            e.printStackTrace();
                        }
                    }
                }
            }

        }.start();
    }

對於使用方法我簡單寫個例子:

移動點:
這個比較簡單,mBaiduMap 要求傳入地圖物件,latlng 給定的經緯度,ZOOM_LEVEL 放大級別, 例:
moveToLatlng(mBaiduMap, latLng, 15);
點收藏:
String favoResult = BaiduMapUtils.favoMarker(activity, getAddress(), mFavoLatlng.latitude, mFavoLatlng.longitude);
                showToast(favoResult);
其中,getAddress()是String型別,是收藏點的名稱(不是ID),比如xxx街道xx號,這個可以利用百度API獲取,也可以自己設定,根據自己需求改,mFavoLatlng.latitude, mFavoLatlng.longitude是兩個座標點,一個經度一個維度,最後返回的是String型別,成功與失敗,失敗的原因基本上只有一個,那就是getAddress()得到的收藏點名稱與已儲存的收藏點名稱有衝突,所以請確保收藏點名稱唯一。

有很多人對軌跡回放有需求但是無從下手,這裡工具類已經給出了,我們直接使用就可以了,首先解釋一下傳入的引數:
mMoveMarker 指定的marker
mv_mapview 當前使用的mapview控制元件
mHandler 執行的執行緒,使用mHandler = new Handler(Looper.getMainLooper());初始化
latlngs 從伺服器獲取的陣列,例如:
private static final LatLng[] latlngs = new LatLng[]
{
new LatLng(39.95853, 116.103013),
new LatLng(39.938506, 116.139808),
new LatLng(39.931425, 116.167978),
};

  由於我自己寫的專案在跳轉Activity的時候會黑屏大概2秒,所以寫了一個休眠
  SystemClock.sleep(2000);
  可刪

這裡寫圖片描述
目前已經有官方的軌跡移動了,放上封裝的程式碼

    public static void moveLooper(final Marker mMoveMarker,
                                  final MapView mv_mapview, final Handler mHandler, final LatLng[] latlngs)
    {
        new Thread()
        {

            public void run()
            {
                SystemClock.sleep(2000);
                for (int i = 0; i < latlngs.length - 1; i++) // 遍歷座標
                {
                    final LatLng startPoint = latlngs[i]; // 得到座標開始的位置,結束的位置
                    final LatLng endPoint = latlngs[i + 1];
                    mMoveMarker
                            .setPosition(startPoint); // 將marker設定在當前座標

                    mHandler.post(new Runnable()
                    {
                        @Override
                        public void run()
                        { 
                            if (mv_mapview == null)
                            {
                                return;
                            }
                            mMoveMarker.setRotate((float) getAngle(startPoint,
                                    endPoint)); // 根據座標計算斜率
                        }
                    });
                    double slope = getSlope(startPoint, endPoint);
                    // 是不是正向的標示
                    boolean isReverse = (startPoint.latitude > endPoint.latitude);

                    double intercept = getInterception(slope, startPoint);

                    double xMoveDistance = isReverse ? getXMoveDistance(slope) :
                            -1 * getXMoveDistance(slope);
                    for (double j = startPoint.latitude; !((j > endPoint.latitude) ^ isReverse);
                         j = j - xMoveDistance)
                    {
                        LatLng latLng = null;
                        if (slope == Double.MAX_VALUE)
                        {
                            latLng = new LatLng(j, startPoint.longitude);
                        } else
                        {
                            latLng = new LatLng(j, (j - intercept) / slope);
                        }
                        final LatLng finalLatLng = latLng;
                        mHandler.post(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                if (mv_mapview == null)
                                {
                                    return;
                                }
                                mMoveMarker.setPosition(finalLatLng);
                            }
                        });
                        try
                        {
                            Thread.sleep(TIME_INTERVAL);
                        } catch (InterruptedException e)
                        {
                            e.printStackTrace();
                        }
                    }
                }
            }

        }.start();
    }

請支援我,掃描左側二維碼打賞,謝謝。

相關推薦

地圖4.1_1開發教程7工具

繼續上次截圖的工具類 本章包含的內容有, 1.移動指定的經緯度到中心點 2.將座標收藏到收藏夾 3.移動點的斜率、角度、距離(官方) 4.進行軌跡移動 /** * 百度地圖工具類 * Created by kowal on 2016/12/8.

地圖4.1_1開發教程6點收藏2

實現對收藏點的刪除,跳轉地圖上對應收藏點的操作 新建一個Activity,其佈局很簡單 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=

地圖4.1_1開發教程6點收藏1

在本章教程中,將一起學習長按地圖收藏該點,這本章中,將設計到的內容有 1.長按時間 2.生成marker 3.地理編碼搜尋(用地址檢索座標)、反地理編碼搜尋(用座標檢索地址) 4.收藏點 5.刪除點等操作 先上效果圖 長按地圖,生成地圖的點,地理編碼搜

地圖4.1_1開發教程3Marker

本章將講述如何利用Marker在地圖生成點,並實現點選Marker彈出該點對應的資訊。 1.點選點獲取座標 2.在我的專案裡,會將地圖上的一些飛機作為Marker,點選並彈出該飛機對應的詳情 3.點選地

地圖4.1_1開發教程9poi搜尋功能

繼上次 本章包含: 搜尋建議 城市POI搜尋,POI: Point of Interest,翻譯過來就是“興趣點”。我們在百度地圖看到的烤吧、網咖等都算是POI。百度地圖SDK提供了三種類型的POI檢索:周邊檢索、區域檢索和城市內檢索。由於我的專案只

地圖從零學起搭建地圖開發環境

如何把API 新增到我的Android工程中? 首先在工程裡新建libs資料夾,並API開發包裡的baidumapapi.jar拷貝到libs根目錄下,將libBMapApiEngine.so拷貝到libs\armeabi目錄下。官網demo裡已有這兩個檔案,如果要整合到自

地圖的覆蓋物自定義--資訊視窗的自定義呼叫白茹提供的資訊視窗InfoWindow

百度地圖的覆蓋物自定義(而)--資訊視窗的自定義(呼叫白茹提供的資訊視窗InfoWindow) var point=new BMap.Point(111.54525,45.578); setInfo

Android應用中使用地圖API並新增標註

網上一些資料這種的內容已經過時了,這裡是最新的內容,如果哪裡不對,請吐槽。。。 1)下載百度地圖移動版API(Android)開發包       要在Android應用中使用百度地圖API,就需要在工程中引用百度地圖API開發包,這個開發包包含兩個檔案: 2)申請A

地圖和openlayers融合封裝之demo展示

2018.5.28 --11:31 wmap的目的是減少地圖開發的成本和時間。  如果你需要進行地圖開發,覺的百度地圖和openlayers的api文件晦澀難懂(主要是openlayers的api很難懂,百度api入門很簡單),可以使用wmap。你不需要去學習百度地圖api

地圖從零學起提供給開發者的服務

搜尋服務 百度地圖移動版API整合搜尋服務包括:位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索,通過初始化MKSearch類,註冊搜尋結果的監聽物件MKSearchListener,實現非同步搜尋服務。首先自定義MySearchListener實現MKSearc

Android 地圖 SDK v3.0.0 新增覆蓋物Marker與InfoWindow的使用

上篇部落格已經實現了地圖的定位以及結合了方向感測器使用者路痴定位方向,如果你還不清楚,請檢視:Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向感測器,本章會教大家如何新增覆蓋物,實現周邊搜尋,以及對覆蓋物的點擊出現介紹等效果。效果圖:我們的需求是,當用戶

地圖從零學起離線地圖包的安裝使用

初始化 //寫在繼承MapActivity裡 MKOfflineMap mOffline = null; //申明變數 //寫在onCreate函式裡 mOffline = new MKOfflineMap();

Android studio 匯入地圖demo的錯誤情況1

當使用的時候,百度地圖無法正常顯示,日誌資訊提示:如下 Authentication Error errorcode: 230 uid: -1 appid -1 msg: APP Scode碼校驗失敗

地圖從零學起地圖覆蓋物

地圖覆蓋物概述 所有疊加或覆蓋到地圖的內容,我們統稱為地圖覆蓋物。如標註、向量圖形元素(包括:折線和多邊形和圓)、定點陣圖標等。覆蓋物擁有自己的地理座標,當您拖動或縮放地圖時,它們會相應的移動。 地圖API提供瞭如下幾種覆蓋物: Overlay:覆蓋物的抽象基類,所有的覆蓋

地圖api清除指定覆蓋物Overlay的方法

最近用百度地圖api做專案,需要同時在地圖顯示marker與Polyline,且Polyline需要根據點選來顯示或清除,所以遇到了清除指定覆蓋物的問題,各種搜尋後未能找到完美的解決方法,通過自己思考,摸索了一方法能解決這個問題,發出來給大家分享。好了,進入正題: 清除覆蓋

地圖二次開發——建立Hello World2

準備頁面 根據HTML標準,每一份HTML文件都應該宣告正確的文件型別,我們建議您使用最新的符合HTML5規範的文件宣告: <!DOCTYPE html> 適應移動端頁面展示 下面我們新增一個meta標籤,以便使您的頁面更好的在移動平臺上展示。 <me

地圖的簡單開發之實現地圖全景,內景展示功能

今天,我就接著來淺談一下關於百度地圖的內景,外景的展示功能。今天具體要實現的功能就是輸入該地點的名稱然後就展示該地點的內景圖片,有內景就展示內景,沒有則顯示該地點的街景,該功能是參考百度地圖官方的API來實現。      實現街景展示的地點的搜尋,需要涉及到幾個

地圖的簡單開發之實現基本地圖的型別及覆蓋物的新增

今天,我們接著上一講,上一講我們把地圖上介面自定義了一番,加上了按鈕等一系列的控制元件,但是還沒有給這些加上具體的功能,今天這一講,主要是實現幾種地圖的切換,是否開啟實時交通,通過自定義的按鈕去控制地圖的縮放,以及在地圖上新增覆蓋物及相關顯示覆蓋物的資訊。   

地圖離線API開發純粹的離線 GT小俠

         公司現在做的一個專案本來用的是google離線地圖,但是發現谷歌的地圖資料很久沒更新資料了,中國的城市發展這麼快,好多地方地圖和現實都對不上了。發現百度地圖資料更新挺快的(呵呵,畢竟是國產的嗎),最後公司決定要把google地圖換成百度地圖。就把此重任交個

獲取地圖POI數據三模擬關鍵詞搜索

nav 運行 dip data box click pri reader lac 上一篇博文中講到如何獲取用於搜索的關鍵詞,並且已經準備好了一百五十萬的關鍵詞 這其中有門牌號碼,餐館酒店名稱,公司名稱,道路名稱等。有了這些數據,我們就可以通過代碼,模擬我們在百