百度地图集成概要
第三篇 检索功能实现
废话不多说了直接干...
首先在 initMap() 方法里创建POI 检索实例
//创建POI检索实例
mPoiSearch = PoiSearch.newInstance();
点击搜索时 进入 getPoiSearch() 方法,开始我们的poi检索之旅
首先检索之前就要关闭我们的软键盘
// 关闭软键盘
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}
之后呢
final OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
public void onGetPoiResult(PoiResult result) {
L.e("poi查询结果回调:" + result.toString());
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
if (baiduMap != null) {
baiduMap.clear();
}
MyOverlayManager myOverlayManager = new MyOverlayManager(baiduMap);
myOverlayManager.setData(result, makerIcon);
myOverlayManager.addToMap();
myOverlayManager.zoomToSpan();
baiduMap.setOnMarkerClickListener(myOverlayManager);
} else {
getLatLng();
}
}
public void onGetPoiDetailResult(PoiDetailResult result) {
// poi详情查询结果回调
L.e("poi详情查询结果回调:" + result.toString());
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
// poi室内检索结果回调
L.e("poi室内检索结果回调:" + poiIndoorResult.toString());
}
};
mPoiSearch.setOnGetPoiSearchResultListener(poiListener); // 设置检索监听回调
mPoiSearch.searchInCity(new PoiCitySearchOption()
.city(mBdLocationListener.sCityStr) // 城市
.keyword(mFindContent.getText().toString()) // 检索的关键字
.pageNum(0) // 分页编号 这里只要第一页前五条
.pageCapacity(5)); // 设置每页几条 默认10条
}
写到这里你会注意到上面有一个自己键的类MyOverlayManager 这个是管理Marker的
主要用途就是让我们的这里查找出来的每页的 Maker 适应到页面上的视野区。
下面就是那个类
// 覆盖物
public class MyOverlayManager extends OverlayManager {
private PoiResult mPoiResult;
private int[] mImg;
public MyOverlayManager(BaiduMap baiduMap) {
super(baiduMap);
}
public void setData(PoiResult poiResult, int[] img) {
mPoiResult = poiResult;
mImg = img;
}
@Override
public List<OverlayOptions> getOverlayOptions() {
ArrayList<OverlayOptions> arrayList = null;
if (mPoiResult != null || mPoiResult.getAllPoi() != null) {
arrayList = new ArrayList<>();
for (int i = 0; i < mPoiResult.getAllPoi().size(); i++) {
if (mPoiResult.getAllPoi().get(i).location == null)
continue;
// 给marker加上标签
Bundle bundle = new Bundle();
bundle.putInt("index", i);
arrayList.add(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(mImg[i]))
.position(mPoiResult.getAllPoi().get(i).location));
}
}
return arrayList;
}
@Override
public boolean onMarkerClick(Marker marker) {
if (marker.getExtraInfo() != null) {
int index = marker.getExtraInfo().getInt("index");
PoiInfo poi = mPoiResult.getAllPoi().get(index);
return true;
}
return false;
}
@Override
public boolean onPolylineClick(Polyline polyline) {
return false;
}
}
如果你是写的 你会发现百度包中根本没有 OverlayManager 啊,
如果你直接复制 你也会发现导包的时候是让你新建有木有......
我也找了半天,终于在我以前的百度代码中找到了这类的代码,不得不鄙视下度娘!
下面是代码的下载地址:算是帮助类吧
http://download.csdn.net/detail/qq_35352552/9800453
下载完成之后解压出来直接复制到 java 包下
然后导包即可;
下面是检索的所有代码
private int makerIcon[] = new int[]{R.drawable.maker_1, R.drawable.maker_2, R.drawable.maker_3, R.drawable.maker_4, R.drawable.maker_5};
// 检索功能
public void getPoiSearch() {
// 关闭软键盘
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}
final OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
public void onGetPoiResult(PoiResult result) {
L.e("poi查询结果回调:" + result.toString());
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
if (baiduMap != null) {
baiduMap.clear();
}
MyOverlayManager myOverlayManager = new MyOverlayManager(baiduMap);
myOverlayManager.setData(result, makerIcon); // 设置数据
myOverlayManager.addToMap(); // 将所有Overlay 添加到地图上
myOverlayManager.zoomToSpan(); // 所有Overlay都在合适的视野内
baiduMap.setOnMarkerClickListener(myOverlayManager);
} else {
getLatLng();
}
}
public void onGetPoiDetailResult(PoiDetailResult result) {
// poi详情查询结果回调
L.e("poi详情查询结果回调:" + result.toString());
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
// poi室内检索结果回调
L.e("poi室内检索结果回调:" + poiIndoorResult.toString());
}
};
mPoiSearch.setOnGetPoiSearchResultListener(poiListener);// 设置检索监听回调
mPoiSearch.searchInCity(new PoiCitySearchOption()
.city(mBdLocationListener.sCityStr) // 城市
.keyword(mFindContent.getText().toString()) // 检索的关键字
.pageNum(0) // 分页编号 这里只要第一页前五条
.pageCapacity(5)); // 设置每页几条 默认10条
}
// 覆盖物
public class MyOverlayManager extends OverlayManager {
private PoiResult mPoiResult;
private int[] mImg;
public MyOverlayManager(BaiduMap baiduMap) {
super(baiduMap);
}
public void setData(PoiResult poiResult, int[] img) {
mPoiResult = poiResult;
mImg = img;
}
@Override
public List<OverlayOptions> getOverlayOptions() {
ArrayList<OverlayOptions> arrayList = null;
if (mPoiResult != null || mPoiResult.getAllPoi() != null) {
arrayList = new ArrayList<>();
for (int i = 0; i < mPoiResult.getAllPoi().size(); i++) {
if (mPoiResult.getAllPoi().get(i).location == null)
continue;
// 给marker加上标签
Bundle bundle = new Bundle();
bundle.putInt("index", i);
arrayList.add(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(mImg[i]))
.position(mPoiResult.getAllPoi().get(i).location));
// 这里可以吧信息放入一个list集合在listView 中显示并操作
}
}
return arrayList;
}
@Override
public boolean onMarkerClick(Marker marker) {
// 点击Marker 的操作
if (marker.getExtraInfo() != null) {
int index = marker.getExtraInfo().getInt("index");
PoiInfo poi = mPoiResult.getAllPoi().get(index);
// String name = poi.name; // poi名称 *
// String city = poi.city; // 城市
// String address = poi.address; // 地址信息
// LatLng location = poi.location; // 坐标 *
return true;
}
return false;
}
@Override
public boolean onPolylineClick(Polyline polyline) {
return false;
}
}
其他的操作,根据需求而定了...