转载请标明出处:http://blog.csdn.net/tanzuai/article/details/43835431
目前百度地图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); }
@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; } }
/** * 影响搜索按钮点击事件 * * @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(); }
下面是本篇博客的源码下载地址:
Android 百度地图 SDK v3_3_0 (五) ---POI搜索和在线建议查询功能
原文地址:http://blog.csdn.net/tanzuai/article/details/43835431