搜索周边的核心类是PoiSearch,核心回调接口是OnGetPoiSearchResultListener,
在其回调方法onGetPoiDetailResult(PoiDetailResult poiDetailResult)的参数
poiDetailResult中包含百度服务器端返回的搜索结果.
详细代码如下:
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private MapView mMapView;// 地图视图
private BaiduMap mBaiduMap;// 地图控制器 setMapStatus(mMapStatusUpdate);
private MapStatus mMapStatus;// 地图当前状态
private MapStatusUpdate mMapStatusUpdate;// 地图将要变化成的状态
private Button btn_location;// 定位button
private Button btn_search;// 搜索button
public LocationClient mLocationClient = null;// 定位的核心类:LocationClient
public BDLocationListener myLocationListener = new MyLocationListener();// 定位的回调接口
private LatLng mCurrentLatLng;// 当前经纬度坐标
private PoiSearch mPoiSearch;// poi检索核心类
private MySearchResultListener mySearchResultListener;// poi检索核心接口
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
// 该方法要在setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
init();
// 设置是否允许定位图层,只有先允许定位图层后设置定位数据才会生效
mBaiduMap.setMyLocationEnabled(true);
btn_search.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
search();
}
});
btn_location.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
location();
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);// 开启卫星图
// 获得地图的当前状态的信息
mMapStatus = new MapStatus.Builder().zoom(15)
.target(mCurrentLatLng).build();
// 设置地图将要变成的状态
mMapStatusUpdate = MapStatusUpdateFactory
.newMapStatus(mMapStatus);
mBaiduMap.setMapStatus(mMapStatusUpdate);// 设置地图的变化
}
});
}
private void init() {
// 获得地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
// 获得地图控制器
mBaiduMap = mMapView.getMap();// MapView与BaiduMap一一对应
// 定位核心类
mLocationClient = new LocationClient(getApplicationContext());
// 定位回调接口
myLocationListener = new MyLocationListener();
// 定位按钮
btn_location = (Button) findViewById(R.id.location);
//poi搜索核心类
mPoiSearch = PoiSearch.newInstance();
//poi搜索回调接口
mySearchResultListener = new MySearchResultListener();
// 搜索按钮
btn_search = (Button) findViewById(R.id.search);
}
/**
* 定位
*/
private void location() {
// 设置mLocationClient数据,如是否打开GPS,使用LocationClientOption类.
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(3000);// 设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
option.setOpenGps(true);// 打开GPS
mLocationClient.setLocOption(option);
mLocationClient.registerLocationListener(myLocationListener);
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// mapView 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
return;
// 获取服务器回传的当前经纬度
mCurrentLatLng = new LatLng(location.getLatitude(),
location.getLongitude());
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())// 获取定位精度
.latitude(location.getLatitude())// 获取纬度坐标
.longitude(location.getLongitude())// 获取精度坐标
.build();
mBaiduMap.setMyLocationData(locData);// 设置定位数据
}
}
/**
* poi检索(圆形)
*/
private void search() {
mPoiSearch.setOnGetPoiSearchResultListener(mySearchResultListener);
// PoiSearch需要设置相关参数,比如关键字,距离等
PoiNearbySearchOption pnso = new PoiNearbySearchOption();
pnso.keyword("美食");
pnso.location(mCurrentLatLng);
pnso.radius(1000);
mPoiSearch.searchNearby(pnso);
}
public class MySearchResultListener implements OnGetPoiSearchResultListener {
@Override
public void onGetPoiDetailResult(final PoiDetailResult poiDetailResult) {
if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) {
// 检索失败
} else {
// 点击marker showInfoWindow
mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
private BitmapDescriptor descriptor;
@Override
public boolean onMarkerClick(Marker arg0) {
// 设置弹窗 (View arg0, LatLng arg1, int arg2) y 偏移量 ,
Button btn = new Button(getApplicationContext());
btn.setBackgroundColor(0xAA00FF00);
btn.setText(poiDetailResult.getName());
// btn 变成 View 图片
descriptor = BitmapDescriptorFactory.fromView(btn);
InfoWindow mInfoWindow = new InfoWindow(descriptor,
poiDetailResult.getLocation(), -60,
new OnInfoWindowClickListener() {
public void onInfoWindowClick() {
// 点击infoWindow可以触发二次检索,跳转界面
// 隐藏弹窗!
mBaiduMap.hideInfoWindow();
}
});
mBaiduMap.showInfoWindow(mInfoWindow);
return false;
}
});
}
}
@Override
public void onGetPoiResult(PoiResult poiResult) {
// 首先判断检索结果是否有错,在判断检索结果是否为空
if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
if (poiResult != null) {
mBaiduMap.clear();
// 绑定Overlay
MyPoiOverlay poiOverlay = new MyPoiOverlay(mBaiduMap);
mBaiduMap.setOnMarkerClickListener(poiOverlay);
// 设置数据到overlay
poiOverlay.setData(poiResult);
poiOverlay.addToMap();
// 缩放地图,使所有Overlay都在合适的视野内 注: 该方法只对Marker类型的overlay有效
poiOverlay.zoomToSpan();
}
} else {
Toast.makeText(getApplicationContext(), "无结果",
Toast.LENGTH_SHORT).show();
}
}
}
// 自定义PoiOverlay
class MyPoiOverlay extends PoiOverlay {
public MyPoiOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
@Override
public boolean onPoiClick(int index) {
super.onPoiClick(index);
PoiInfo poi = getPoiResult().getAllPoi().get(index);
mPoiSearch.searchPoiDetail((new PoiDetailSearchOption())
.poiUid(poi.uid));
return super.onPoiClick(index);
}
}
@Override
protected void onStart() {
location();
mLocationClient.start();// 开启定位请求
super.onStart();
}
@Override
protected void onResume() {
mMapView.onResume();
super.onResume();
}
@Override
protected void onPause() {
mLocationClient.stop();// 停止定位
mMapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mMapView.onDestroy();
super.onDestroy();
}
}
**此demo已上传csdn,下载地址为:
http://download.csdn.net/detail/csdn1027719307/8700107**