闲聊百度地图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的博文,综合使用可以实现更多效果: