目前百度地图SDK所集成的检索服务包括:POI检索、公交信息查询、线路规划、地理编码、在线建议查询、短串分享。
本篇博客将先介绍POI检索和在线建议查询(在地图地位功能基础上实现的,还不知道定位的童靴,请参考Android 百度地图 SDK v3.3.0 (二)--- 地图定位和图层展示)
百度地图SDK提供三种类型的POI检索:周边检索、区域检索和城市内检索。下面将以城市内检索为例,向大家介绍如何使用检索服务。
在介绍检索服务之前,想上一张要实现的效果图:
好了!现在我们上代码,来实现上面的功能(代码中都做了相应的注解)
1.创建POI和在线建议查询实例
/**
* 初始化搜索模块,注册搜索事件监听
*/
private void initPOIListener() {
//POI检索实例
mPoiSearch = PoiSearch.newInstance();
//创建POI检索监听者
mPoiSearch.setOnGetPoiSearchResultListener(this);
//联想词检索实例
mSuggestionSearch = SuggestionSearch.newInstance();
//联想词检索监听者
mSuggestionSearch.setOnGetSuggestionResultListener(this);
}
2.
创建POI检索监听者,并做相关的事件处理
@Override
public void onGetSuggestionResult(SuggestionResult res) {
if (res == null || res.getAllSuggestions() == null) {
return;
}
sugAdapter.clear();
for (SuggestionResult.SuggestionInfo info : res.getAllSuggestions()) {
if (info.key != null)
sugAdapter.add(info.key);
}
sugAdapter.notifyDataSetChanged();
}
@Override
public void onGetPoiDetailResult(PoiDetailResult result) {
// 未找到了结果
if (result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(MainActivity.this,
result.getName() + ": " + result.getAddress(),
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onGetPoiResult(PoiResult result) {
// 未找到结果
if (result == null
|| result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
Toast.makeText(MainActivity.this, "未找到结果", Toast.LENGTH_LONG)
.show();
return;
}
// 结果没有异常,找到了结果
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
mBaiduMap.clear();
PoiOverlay overlay = new MyPoiOverlay(mBaiduMap);
mBaiduMap.setOnMarkerClickListener(overlay);
overlay.setData(result);
overlay.addToMap();
overlay.zoomToSpan();
return;
}
// 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {
String strInfo = "在";
for (CityInfo cityInfo : result.getSuggestCityList()) {
strInfo += cityInfo.city;
strInfo += ",";
}
strInfo += "找到结果";
Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG)
.show();
}
}
/**
* 提供了在地图上标识搜索结果的方法
*
* @author TanZuAi
*
*/
private class MyPoiOverlay extends PoiOverlay {
public MyPoiOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
@Override
public boolean onPoiClick(int index) {
super.onPoiClick(index);
// 获取poi覆盖物的详细信息
PoiInfo poi = getPoiResult().getAllPoi().get(index);
// uid是POI检索中获取的POI ID信息
mPoiSearch.searchPoiDetail((new PoiDetailSearchOption())
.poiUid(poi.uid));
return true;
}
}
3.设置按钮的相关事件。
/**
* 影响搜索按钮点击事件
*
* @param v
*/
public void searchButtonProcess(View v) {
EditText editCity = (EditText) findViewById(R.id.city);// 输入的城市
EditText editSearchKey = (EditText) findViewById(R.id.searchkey);// 输入的关键词
// 发起检索请求
mPoiSearch.searchInCity((new PoiCitySearchOption())
.city(editCity.getText().toString())// 根据城市
.keyword(editSearchKey.getText().toString())// 根据关键字
.pageNum(load_Index));// 查询的页数
}
/**
* 每添加一页进行查询
*
* @param v
*/
public void goToNextPage(View v) {
load_Index++;
searchButtonProcess(null);
} 4.为了节省电量和资源,得设置搜索的相关生命周期
@Override
protected void onDestroy() {
mPoiSearch.destroy();
mSuggestionSearch.destroy();
// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
好了!代码实现已经介绍完毕!相信大家都看的懂!有什么不懂的或者建议,可以在下面留言!
下面是本篇博客的源码下载地址: