Android 百度地圖周邊雷達(v6.1.3)及覆蓋物

閒聊百度地圖SDK

百度地圖API是爲開發者免費提供的一套基於百度地圖服務的應用接口,包括JavaScript API、Web服務API、Android SDK、iOS SDK、定位SDK、車聯網API、LBS雲等多種開發工具與服務,提供基本地圖展現、搜索、定位、逆/地理編碼、路線規劃、LBS雲存儲與檢索等功能,適用於PC端、移動端、服務器等多種設備,多種操作系統下的地圖應用開發。百度地圖已經容納了超過500萬生活服務類數據,60餘家數據合作伙伴與之進行深度合作,日均定位請求超過35億次。

很久以前接入過百度地圖SDK。自v3.6.0起,版本更新大到新舊不兼容。故在此重溫百度地圖SDK。

  1. 註冊百度賬號:https://passport.baidu.com/v2/?reg&tpl=newdev&u=http://developer.baidu.com/
  2. 創建應用:http://lbsyun.baidu.com/apiconsole/key#
  3. 下載相應SDK:http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download
  4. 開發文檔:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/introduction

周邊雷達概述

  1. 什麼是周邊雷達功能?
    周邊雷達功能,是面向移動端開發者的一套SDK功能接口。同步支持Android和iOS端。它的本質是一個連接百度LBS開放平臺前端SDK產品和後端LBS雲的中間服務。
  2. 利用周邊雷達能夠實現什麼?
    開發者利用周邊雷達功能,可以便捷的在自己的應用內,幫助用戶實現查找周邊跟“我”使同樣一款App的人,這樣一個功能。
  3. 周邊雷達功能的典型使用場景
    (1)查看周邊都有誰跟“我”使用同一個App,分佈在哪裏?
    (2)查看周邊用戶在聽什麼歌、看什麼文章、有什麼新動態?
    (3)查看周邊有什麼最新發生的新聞、資訊?

周邊雷達開發介紹:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/radar

注意:一定要新建我的周邊雷達,否則無法使用。http://lbsyun.baidu.com/index.php?title=radar

從一個包含基礎地圖的示例開始

package com.dyk.baidumapwork;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.GroundOverlayOptions;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.PolygonOptions;
import com.baidu.mapapi.map.Stroke;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import com.baidu.mapapi.radar.RadarNearbyResult;
import com.baidu.mapapi.radar.RadarNearbySearchOption;
import com.baidu.mapapi.radar.RadarSearchError;
import com.baidu.mapapi.radar.RadarSearchListener;
import com.baidu.mapapi.radar.RadarSearchManager;
import com.baidu.mapapi.radar.RadarUploadInfo;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity implements View.OnClickListener,RadarSearchListener {

    private static final String TAG = "MainActivity";

    private MapView mMapView;
    private BaiduMap mBaiduMap;

    private Marker markerA;
    private RadarSearchManager mManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在使用SDK各組件之前初始化context信息,傳入ApplicationContext
        //注意該方法要再setContentView方法之前實現
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        // 初始化周邊雷達
        mManager = RadarSearchManager.getInstance();
        initView();
        initClick();
//        testOverlay();
//        testGeometryOverlay();
//        testTextOverlay();
//        testGroundOverlay();

        // 將底圖標註設置爲隱藏,方法如下:
        // mBaiduMap.showMapPoi(false);

    }

    private void initView() {
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
    }

    private void initClick() {
        findViewById(R.id.map_common).setOnClickListener(this);
        findViewById(R.id.map_satelite).setOnClickListener(this);
        findViewById(R.id.map_blank).setOnClickListener(this);
        findViewById(R.id.map_traffic).setOnClickListener(this);
        findViewById(R.id.map_heat).setOnClickListener(this);
        findViewById(R.id.map_radar).setOnClickListener(this);
    }

    /** 覆蓋物 */
    private void testOverlay() {
        LatLng point = new LatLng(39.963175, 116.400244);
        // 通過marker的icons設置一組圖片,再通過period設置多少幀刷新一次圖片資源
        ArrayList<BitmapDescriptor> bitmapList = new ArrayList<BitmapDescriptor>();
        BitmapDescriptor bitmapA = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
        BitmapDescriptor bitmapB = BitmapDescriptorFactory.fromResource(R.drawable.icon_markb);
        BitmapDescriptor bitmapC = BitmapDescriptorFactory.fromResource(R.drawable.icon_markc);
        BitmapDescriptor bitmapD = BitmapDescriptorFactory.fromResource(R.drawable.icon_markd);
        BitmapDescriptor bitmapE = BitmapDescriptorFactory.fromResource(R.drawable.icon_marke);
        bitmapList.add(bitmapA);
        bitmapList.add(bitmapB);
        bitmapList.add(bitmapC);
        bitmapList.add(bitmapD);
        bitmapList.add(bitmapE);

        OverlayOptions options = new MarkerOptions()
                .position(point) //位置
                .icons(bitmapList) // 圖標
                .period(10) // 刷新幀數
                .zIndex(9)// 顯示層級
                .alpha(0.5f) //透明度
                .draggable(true);// 支持拖拽
        markerA = (Marker) (mBaiduMap.addOverlay(options));// 在地圖上添加marker並顯示

               // 點擊marker
        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                marker.remove();
                return true;
            }
        });
    }

    /** 幾何覆蓋物 */
    private void testGeometryOverlay() {
        //定義多邊形的五個頂點
        LatLng pt1 = new LatLng(39.93923, 116.357428);
        LatLng pt2 = new LatLng(39.91923, 116.327428);
        LatLng pt3 = new LatLng(39.89923, 116.347428);
        LatLng pt4 = new LatLng(39.89923, 116.367428);
        LatLng pt5 = new LatLng(39.91923, 116.387428);
        List<LatLng> pts = new ArrayList<LatLng>();
        pts.add(pt1);
        pts.add(pt2);
        pts.add(pt3);
        pts.add(pt4);
        pts.add(pt5);
        //構建用戶繪製多邊形的Option對象
        OverlayOptions polygonOption = new PolygonOptions()
                .points(pts)
                .stroke(new Stroke(5, 0xAA00FF00))
                .fillColor(0xAAFFFF00);

        //在地圖上添加多邊形Option,用於顯示
        mBaiduMap.addOverlay(polygonOption);
    }

    /** 文字覆蓋物 */
    private void testTextOverlay() {
        LatLng text = new LatLng(39.86923, 116.397428);
        OverlayOptions options = new TextOptions()
                .bgColor(0xAAFFFF00)
                .fontSize(24)
                .fontColor(0xFFFF00FF)
                .text("文字覆蓋物測試")
                .rotate(-45) // 旋轉角度
                .position(text);

        mBaiduMap.addOverlay(options);
    }

    /** 地形圖圖層(GroundOverlay),又可叫做圖片圖層 */
    private void testGroundOverlay() {
        //定義Ground的顯示地理範圍
        LatLng southwest = new LatLng(39.92235, 116.380338);
        LatLng northeast = new LatLng(39.947246, 116.414977);
        LatLngBounds bounds = new LatLngBounds.Builder()
                .include(northeast)
                .include(southwest)
                .build();
        //定義Ground顯示的圖片
        BitmapDescriptor bdGround = BitmapDescriptorFactory
                .fromResource(R.drawable.ground_overlay);
        //定義Ground覆蓋物選項
        OverlayOptions ooGround = new GroundOverlayOptions()
                .positionFromBounds(bounds)
                .image(bdGround)
                .transparency(0.8f);// 透明度

        //在地圖中添加Ground覆蓋物
        mBaiduMap.addOverlay(ooGround);
    }

    /** 周邊雷達信息上傳 */
    private void testRadarInfoUpload() {

        // 周邊雷達設置監聽
        mManager.addNearbyInfoListener(this);
        //周邊雷達設置用戶身份標識,id爲空默認是設備標識
        mManager.setUserID("123");
        //上傳位置
        RadarUploadInfo info = new RadarUploadInfo();
        LatLng pt = new LatLng(39.963175, 116.400244);
        info.comments = "備註";
        info.pt = pt;
        mManager.uploadInfoRequest(info);
    }

    /** 雷達周邊位置檢索 */
    private void testRadarLocationSearch() {
        // 自己的位置
        LatLng pt = new LatLng(39.963175, 116.400244);
        RadarNearbySearchOption option = new RadarNearbySearchOption()
                .centerPt(pt)
                .pageNum(0)
                .radius(2*1000);
        // 發起查詢請求
        mManager.nearbyInfoRequest(option);
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
        mMapView.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
        mMapView.onDestroy();

        //移除監聽
        mManager.removeNearbyInfoListener(this);
        //清除用戶信息
//        mManager.clearUserInfo();
        //釋放資源
        mManager.destroy();
        mManager = null;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            // 普通地圖
            case R.id.map_common:
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
                break;
            // 衛星地圖
            case R.id.map_satelite:
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
                break;
            // 空白地圖
            case R.id.map_blank:
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
                break;
            // 交通圖
            case R.id.map_traffic:
                if (mBaiduMap.isTrafficEnabled()) {
                    mBaiduMap.setTrafficEnabled(false);
                } else {
                    mBaiduMap.setTrafficEnabled(true);
                }
                break;
            // 熱力圖
            case R.id.map_heat:
                if (mBaiduMap.isBaiduHeatMapEnabled()) {
                    mBaiduMap.setBaiduHeatMapEnabled(false);
                } else {
                    mBaiduMap.setBaiduHeatMapEnabled(true);
                }
                break;
            // 周邊檢索
            case R.id.map_radar:
                testRadarInfoUpload();
                testRadarLocationSearch();
                break;
        }
    }

    @Override
    public void onGetNearbyInfoList(RadarNearbyResult radarNearbyResult, RadarSearchError radarSearchError) {
        if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) {
            Toast.makeText(MainActivity.this, "查詢周邊成功", Toast.LENGTH_LONG).show();
            Log.i(TAG,radarNearbyResult.infoList.get(0).userID+"\n"+
                      radarNearbyResult.infoList.get(0).distance+"\n"+
                      radarNearbyResult.infoList.get(0).pt+"\n"+
                      radarNearbyResult.infoList.get(0).timeStamp);
        } else {
            Toast.makeText(MainActivity.this, "查詢周邊失敗", Toast.LENGTH_LONG).show();
            Log.i(TAG,"查詢錯誤:"+radarSearchError.toString());
        }
    }

    @Override
    public void onGetUploadState(RadarSearchError radarSearchError) {
        if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) {
            //上傳成功
            Toast.makeText(MainActivity.this, "單次上傳位置成功", Toast.LENGTH_LONG).show();
        } else {
            //上傳失敗
            Toast.makeText(MainActivity.this, "單次上傳位置失敗", Toast.LENGTH_LONG).show();
            Log.i(TAG,"上傳錯誤:"+radarSearchError.toString());
        }
    }

    @Override
    public void onGetClearInfoState(RadarSearchError radarSearchError) {
        if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) {
            //清除成功
            Toast.makeText(MainActivity.this, "清除位置成功", Toast.LENGTH_LONG).show();
        } else {
            //清除失敗
            Toast.makeText(MainActivity.this, "清除位置失敗", Toast.LENGTH_LONG).show();
        }
    }
}

這是一段運行成功的代碼,可作爲實際開發的參考。

注意:
1.必須要新建我的雷達
2.pageNum從0開始
3.軟件要模仿兩個用戶分別運行一次,對應的操作爲:跑一遍程序之後修改userId後在跑一遍。這樣才能看見“附近的人”。
4.在合適的時機調用RadarSearchManager#clearUserInfo(),別不小心把自己測試數據給clear了,否則肯定沒有數據的啦!

歡迎訪問我的博客及另外兩篇關於百度地圖SDK的博文,綜合使用可以實現更多效果:

  1. 我的博客

  2. Android 百度定位SDK(v6.1.3)結合方向傳感器

  3. Android 百度鷹眼軌跡SDK(v2.1.6)

Demo全部代碼及資源下載:http://download.csdn.net/detail/qq_17250009/9469613

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章