android 百度地图SDK 3.7.0 周边雷达-Radar 周边搜索-PoiSearch

因为项目需要,最近研究了下百度地图的SDK,简单记录一些点。


准备工作

1.下载SDK及demo

下载地址:http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download

2.申请key

教程地址:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key

key需要用到app的包名和签名证书的SHA1值


如果需要使用 周边雷达 功能,需要再注册一个,否则无法使用

周边雷达注册地址:http://lbsyun.baidu.com/index.php?title=radar


测试代码

周边雷达-Radar相关

import android.content.Context;
import android.os.Handler;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.radar.RadarNearbyInfo;
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;

public class BDRadarTest {
	
	private static final String TAG = BDRadarTest.class.getSimpleName();
	
	private static RadarSearchManager mRSManager = null;
	private static LocationClient mLocClient = null;
	private static LatLng mLatLng = null;
	private static Handler mHandler = null;
	private static Context mContext = null;
	
	public static void init(Context context) {
		mContext = context;
		
		mHandler = new Handler() {
			@Override
			public void handleMessage(android.os.Message msg) {
				switch (msg.what) {
				case 0:
					goStartRadar();
					break;
				case 1:
					goGetLocation();
					break;
				case 2:
					goUploadInfo(mLatLng);
					break;
				case 3:
					goRadar(mLatLng);
					break;
				case 4:
					goClear();
					break;
				case 5:
					goDestory();
					break;

				default:
					break;
				}
			}
		};
	}
	
	private static RadarSearchListener mRSListener = new RadarSearchListener() {
		
		@Override
		public void onGetUploadState(RadarSearchError err) {
			Log.i(TAG, "UploadState");
			
			if (err == RadarSearchError.RADAR_NO_ERROR) {
				Log.i(TAG, "UploadState OK");
				
				mHandler.sendEmptyMessage(3);
			} else {
				Log.i(TAG, "UploadState err:" + err);
				
				mHandler.sendEmptyMessage(4);
			}
		}
		
		@Override
		public void onGetNearbyInfoList(RadarNearbyResult result,
				RadarSearchError err) {
			Log.i(TAG, "NearbyInfoList");
			
			if (err == RadarSearchError.RADAR_NO_ERROR) {
				Log.i(TAG, "NearbyInfoList OK");
				
//				totalNum:3
//				pageIndex:0
//				pageNum:1
//				infoList.size:3
//				info userid:123
//				info distance:814
//				info comments:1
//				info timeStamp:Mon Feb 15 18:24:49 格林尼治标准时间+0800 2016

				Log.i(TAG, "totalNum:" + result.totalNum);	// 总结果个数
				Log.i(TAG, "pageIndex:" + result.pageIndex);	// 页码
				Log.i(TAG, "pageNum:" + result.pageNum);	// 总页数
				Log.i(TAG, "infoList.size:" + result.infoList.size());
				for (int i = 0; i < result.infoList.size(); i++) {
					RadarNearbyInfo info = result.infoList.get(i);
					Log.i(TAG, "info userid:" + info.userID);	// userid
					Log.i(TAG, "info distance:" + info.distance);	// 距离
					Log.i(TAG, "info comments:" + info.comments);	// 备注
					Log.i(TAG, "info timeStamp:" + info.timeStamp);	// 上传位置时的时间戳
				}
			} else {
				Log.i(TAG, "NearbyInfoList err:" + err);
			}
			
			mHandler.sendEmptyMessage(4);
		}
		
		@Override
		public void onGetClearInfoState(RadarSearchError err) {
			Log.i(TAG, "ClearInfoState");
			
			if (err == RadarSearchError.RADAR_NO_ERROR) {
				Log.i(TAG, "ClearInfoState OK");
			} else {
				Log.i(TAG, "ClearInfoState err:" + err);
			}

			mHandler.sendEmptyMessage(5);
		}
	};
	
	public static void startRadar() {
		Log.i(TAG, "startRadar");
		
		mHandler.sendEmptyMessage(0);
	}
	
	private static void goStartRadar() {
		Log.i(TAG, "goStartRadar");
		
		// 获取本地位置--上传位置信息--等待回调--回调成功--开始查询--等待回调--回调中打印结果
		mRSManager = RadarSearchManager.getInstance();
		mRSManager.setUserID("test01");
		mRSManager.addNearbyInfoListener(mRSListener);
		
		// 定位
		mHandler.sendEmptyMessage(1);
	}
	
	private static void goGetLocation() {
		Log.i(TAG, "goGetLocation");
		
		LocationClientOption locOption = new LocationClientOption();
		locOption.setIgnoreKillProcess(false);
		locOption.setEnableSimulateGps(true);
		locOption.setCoorType("bd09ll");
		
		mLocClient = new LocationClient(mContext);
		mLocClient.setLocOption(locOption);
		mLocClient.registerLocationListener(new BDLocationListener() {
			
			@Override
			public void onReceiveLocation(BDLocation location) {
				Log.i(TAG, "onReceiveLocation");
				
				mLatLng = new LatLng(location.getLatitude(), 
						location.getLongitude());
				mHandler.sendEmptyMessage(2);
				
				// 定位成功后销毁
				mLocClient.stop();
			}
		});
		mLocClient.start();
	}
	
	private static void goUploadInfo(LatLng ll) {
		Log.i(TAG, "goUploadInfo");
		
		RadarUploadInfo info = new RadarUploadInfo();
		info.comments = "m";
		info.pt = ll;
		
		mRSManager.uploadInfoRequest(info);
	}
	
	private static void goRadar(LatLng ll) {
		Log.i(TAG, "goRadar");
		
		RadarNearbySearchOption option = new RadarNearbySearchOption();
		option.centerPt(ll);	// 中心点
		option.pageCapacity(10);	// 每页包含的结果数
		option.pageNum(0);	// 当前需要查询的页码index,从0开始
		option.radius(1000);	// 搜索半径
		
		mRSManager.nearbyInfoRequest(option);
	}
	
	private static void goClear() {
		Log.i(TAG, "goClear");
		
		mRSManager.clearUserInfo();
	}
	
	private static void goDestory() {
		Log.i(TAG, "goDestory");
		
		mRSManager.removeNearbyInfoListener(mRSListener);
		mRSManager.destroy();
	}
}


调用代码:

// 初始化SDK
		SDKInitializer.initialize(getApplicationContext());
		// 初始化handler
		BDRadarTest.init(context);
		// 开始
		BDRadarTest.startRadar();


周边搜索-PoiSearch相关

import android.content.Context;
import android.os.Handler;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult.ERRORNO;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.baidu.mapapi.search.poi.PoiSortType;

public class BDPoiTest {
private static final String TAG = BDPoiTest.class.getSimpleName();
	
	private static PoiSearch mPoiSManager = null;
	private static LocationClient mLocClient = null;
	private static LatLng mLatLng = null;
	private static Handler mHandler = null;
	private static Context mContext = null;
	
	public static void init(Context context) {
		mContext = context;
		
		mHandler = new Handler() {
			@Override
			public void handleMessage(android.os.Message msg) {
				switch (msg.what) {
				case 0:
					goStartPoi();
					break;
				case 1:
					goGetLocation();
					break;
				case 2:
					goPoiSearch(mLatLng);
					break;
				case 3:
					goDestory();
					break;

				default:
					break;
				}
			}
		};
	}
	
	private static OnGetPoiSearchResultListener mPoiResultListener = new OnGetPoiSearchResultListener() {
		
		@Override
		public void onGetPoiResult(PoiResult result) {
			if (result.error == ERRORNO.NO_ERROR) {
				Log.i(TAG, "GetPoiResult OK");
				
//				totalNum:45
//				totalPageNum:5
//				pageIndex:0
//				pageCapacity:10
//				isHasAddrInfo:false
//				poi.size:10
//				info address:北京市东城区王府井大街277号(近好友世界商场)
//				info city:北京市
//				info name:酷时代游艺世界
//				info phoneNum:(010)65225696
//				info postCode:null
//				info uid:34059f97e013925471455bce
//				info hasCaterDetails:false
//				info isPano:true
//				info location:latitude: 39.91824597245212, longitude: 116.41649542740966
//				info type:POINT

				Log.i(TAG, "totalNum:" + result.getTotalPoiNum());	// 总结果个数
				Log.i(TAG, "totalPageNum:" + result.getTotalPageNum());	// 总页数
				Log.i(TAG, "pageIndex:" + result.getCurrentPageNum());	// 页码
				Log.i(TAG, "pageCapacity:" + result.getCurrentPageCapacity());	// 本页的结果数,可能小于本页可显示的结果数
				Log.i(TAG, "isHasAddrInfo:" + result.isHasAddrInfo());
				
				Log.i(TAG, "poi.size:" + result.getAllPoi().size());
				if (result.isHasAddrInfo()) {	// 如果为false,则getAllAddr为空
					Log.i(TAG, "addr.size:" + result.getAllAddr().size());
				}
				for (int i = 0; i < result.getAllPoi().size(); i++) {
					PoiInfo info = result.getAllPoi().get(i);
					Log.i(TAG, "info address:" + info.address);	// 地址
					Log.i(TAG, "info city:" + info.city);	// 城市
					Log.i(TAG, "info name:" + info.name);	// 名称
					Log.i(TAG, "info phoneNum:" + info.phoneNum);	// 电话
					Log.i(TAG, "info postCode:" + info.postCode);	// 邮编
					Log.i(TAG, "info uid:" + info.uid);	// uid,用于后面查询DetailResult
					Log.i(TAG, "info hasCaterDetails:" + info.hasCaterDetails);	// 是否有详细信息
					Log.i(TAG, "info isPano:" + info.isPano);	// 是否有全景
					Log.i(TAG, "info location:" + info.location);	// 经纬度
					Log.i(TAG, "info type:" + info.type);	// 类型
				}
			} else {
				Log.i(TAG, "GetPoiResult err:" + result.error);
			}
			
			mHandler.sendEmptyMessage(3);
		}
		
		@Override
		public void onGetPoiDetailResult(PoiDetailResult result) {
			mHandler.sendEmptyMessage(3);
		}
	};
	
	public static void startPoi() {
		Log.i(TAG, "startPoi");
		
		mHandler.sendEmptyMessage(0);
	}
	
	private static void goStartPoi() {
		Log.i(TAG, "goStartPoi");
		
		// 获取本地位置--上传位置信息--等待回调--回调成功--开始查询--等待回调--回调中打印结果
		mPoiSManager = PoiSearch.newInstance();
		mPoiSManager.setOnGetPoiSearchResultListener(mPoiResultListener);
		
		// 定位
		mHandler.sendEmptyMessage(1);
	}
	
	private static void goGetLocation() {
		Log.i(TAG, "goGetLocation");
		
		LocationClientOption locOption = new LocationClientOption();
		locOption.setIgnoreKillProcess(false);
		locOption.setEnableSimulateGps(true);
		locOption.setCoorType("bd09ll");
		
		mLocClient = new LocationClient(mContext);
		mLocClient.setLocOption(locOption);
		mLocClient.registerLocationListener(new BDLocationListener() {
			
			@Override
			public void onReceiveLocation(BDLocation location) {
				Log.i(TAG, "onReceiveLocation");
				
				mLatLng = new LatLng(location.getLatitude(), 
						location.getLongitude());
				mHandler.sendEmptyMessage(2);
				
				// 定位成功后销毁
				mLocClient.stop();
			}
		});
		mLocClient.start();
	}
	
	private static void goPoiSearch(LatLng ll) {
		Log.i(TAG, "goPoiSearch");
		
		PoiNearbySearchOption option = new PoiNearbySearchOption();
		option.location(ll);
		option.radius(3000);
		option.sortType(PoiSortType.distance_from_near_to_far);
		option.keyword("棋牌室");
		option.pageCapacity(10);	// 每页最多含多少条结果
		option.pageNum(0);	// 查询的页码
		
		mPoiSManager.searchNearby(option);
	}
	
	private static void goDestory() {
		Log.i(TAG, "goDestory");
		
		mPoiSManager.destroy();
	}
}

调用方式与之前相似。



注意!这里有坑

  1. 所有流程都在主线程或handler里做,否则可能会报错
  2. 上传信息时,用户名和备注有限制,具体限制未知,如果上传失败,可以尝试修改
  3. Option的pageNum指的是要查询的page的index,从0开始
  4. 周边雷达,需要上传位置信息后,才能被搜索到
  5. 周边雷达的位置信息会一直保留,除非自己主动clear
  6. poi搜索结果中,如果isHasAddrInfo为false,那么getAllAddr将是一个null






  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值