閒聊百度地圖SDK
百度地圖API是爲開發者免費提供的一套基於百度地圖服務的應用接口,包括JavaScript API、Web服務API、Android SDK、iOS SDK、定位SDK、車聯網API、LBS雲等多種開發工具與服務,提供基本地圖展現、搜索、定位、逆/地理編碼、路線規劃、LBS雲存儲與檢索等功能,適用於PC端、移動端、服務器等多種設備,多種操作系統下的地圖應用開發。百度地圖已經容納了超過500萬生活服務類數據,60餘家數據合作伙伴與之進行深度合作,日均定位請求超過35億次。
很久以前接入過百度地圖SDK。自v3.6.0起,版本更新大到新舊不兼容。故在此重溫百度地圖SDK。
- 註冊百度賬號:https://passport.baidu.com/v2/?reg&tpl=newdev&u=http://developer.baidu.com/
- 創建應用:http://lbsyun.baidu.com/apiconsole/key#
- 下載相應SDK:http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download
- 開發文檔:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/introduction
周邊雷達概述
- 什麼是周邊雷達功能?
周邊雷達功能,是面向移動端開發者的一套SDK功能接口。同步支持Android和iOS端。它的本質是一個連接百度LBS開放平臺前端SDK產品和後端LBS雲的中間服務。 - 利用周邊雷達能夠實現什麼?
開發者利用周邊雷達功能,可以便捷的在自己的應用內,幫助用戶實現查找周邊跟“我”使同樣一款App的人,這樣一個功能。 - 周邊雷達功能的典型使用場景
(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的博文,綜合使用可以實現更多效果: