百度地图SDK集成搜索服务包括:位置检索、周边检索、范围检索、公交检索、驾乘检索等,首先实例化MKSearch对象,然后初始化init该MKSearch对象并指定MKSearchListener对象监听器,并通过调用相应的方法实现异步搜索服务。检索服务使用完成之后,需要调用MKSearch的destory()方法来释放资源。
public class MySearchListener implements MKSearchListener { @Override public void onGetAddrResult(MKAddrInfo result, int iError) { //返回地址信息搜索结果 } @Override public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) { //返回驾乘路线搜索结果 } @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { //返回poi搜索结果 } @Override public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) { //返回公交搜索结果 } @Override public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) { //返回步行路线搜索结果 } @Override public void onGetBusDetailResult(MKBusLineResult result, int iError) { //返回公交车详情信息搜索结果 } @Override public void onGetSuggestionResult(MKSuggestionResult result, int iError) { //返回联想词信息搜索结果 } @Override public void onGetShareUrlResult(MKShareUrlResult result , int type, int error) { //在此处理短串请求返回结果. } @Override public void onGetPoiDetailSearchResult(int arg0, int arg1) { } }
(1).矩形区域搜索
// 北京西站 GeoPoint ptLB = new GeoPoint((int) (39.901375 * 1E6), (int) (116.329099 * 1E6)); // 北京北站 GeoPoint ptRT = new GeoPoint((int) (39.949404 * 1E6), (int) (116.360719 * 1E6)); mkSearch.poiSearchInbounds("KFC", ptLB, ptRT);//在2个点所形成的矩形区域进行搜索(2).城市搜索
mkSearch.poiSearchInCity("北京", "饭店");(3).圆形区域搜索
// 成功返回0,否则返回-1 mkSearch.poiSearchNearBy("饭店", new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)), 5000);//radius - 半径,单位:米
@Override public void onGetPoiResult(MKPoiResult res, int type, int error) { // 错误号可参考MKEvent中的定义 if (error == MKEvent.ERROR_RESULT_NOT_FOUND) { Toast.makeText(getApplicationContext(), "抱歉,未找到结果", Toast.LENGTH_LONG).show(); return; } else if (error != 0 || res == null) { Toast.makeText(getApplicationContext(), "搜索出错啦..", Toast.LENGTH_LONG).show(); return; } // 将poi结果显示到地图上 PoiOverlay poiOverlay = new PoiOverlay(this, mMapView); poiOverlay.setData(res.getAllPoi()); mMapView.getOverlays().clear(); mMapView.getOverlays().add(poiOverlay); mMapView.refresh(); // 当ePoiType为2(公交线路)或4(地铁线路)时, poi坐标为空 for (MKPoiInfo info : res.getAllPoi()) { if (info.pt != null) { mMapView.getController().animateTo(info.pt); break; } } }对于搜索出来通过PoiOverlay绘制在地图上的每个点,百度地图有默认的点击事件,可以继承PoiOverlay类,可以通过覆写onTap方法public void onGetPoiResult(MKPoiResult res, int type, int error) { // 错误号可参考MKEvent中的定义 if (error == MKEvent.ERROR_RESULT_NOT_FOUND) { Toast.makeText(getApplicationContext(), "抱歉,未找到结果", Toast.LENGTH_LONG).show(); return; } else if (error != 0 || res == null) { Toast.makeText(getApplicationContext(), "搜索出错啦..", Toast.LENGTH_LONG).show(); return; } /////////////////////////////////////////////// //继承PoiOverlay类,可以通过覆写onTap方法,可以处理点击事件 MyPoiOverlay poiOverlay = new MyPoiOverlay(this, mMapView); ////////////////////////////////////////////// poiOverlay.setData(res.getAllPoi()); mMapView.getOverlays().clear(); mMapView.getOverlays().add(poiOverlay); mMapView.refresh(); // 当ePoiType为2(公交线路)或4(地铁线路)时, poi坐标为空 for (MKPoiInfo info : res.getAllPoi()) { if (info.pt != null) { mMapView.getController().animateTo(info.pt); break; } } }private class MyPoiOverlay extends PoiOverlay { public MyPoiOverlay(Activity activity, MapView mapView) { super(activity, mapView); } @Override protected boolean onTap(int i) { //覆写该方法, MKPoiInfo info = getPoi(i); Toast.makeText(getApplicationContext(), info.address + ":" + info.name, 0).show(); return true; } }
mMKSearch.reverseGeocode(new GeoPoint(40057031, 116307852)); //逆地址解析 mMKSearch.geocode(key, city);//地址解析reverseGeocode和geocode的返回结果在都在MKSearchListener里的onGetAddrResult方法中,具体区分是逆地址解析的结果还是地址解析的结果需要判断MKAddrInfo中的type字段,type字段为MKAddrInfo.MK_GEOCODE的是地理编码的结果、type字段为MKAddrInfo.MK_REVERSEGEOCODE的是逆地理编码的结果.
@Override public void onGetAddrResult(MKAddrInfo res, int error) { if (error != 0) { String str = String.format("错误号:%d", error); Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG) .show(); return; } // 地图移动到该点 mMapView.getController().animateTo(res.geoPt); if (res.type == MKAddrInfo.MK_GEOCODE) { // 地理编码:通过地址检索坐标点 String strInfo = String.format("纬度:%f 经度:%f", res.geoPt.getLatitudeE6() / 1e6, res.geoPt.getLongitudeE6() / 1e6); Toast.makeText(getApplicationContext(), strInfo, Toast.LENGTH_LONG) .show(); } if (res.type == MKAddrInfo.MK_REVERSEGEOCODE) { // 反地理编码:通过坐标点检索详细地址及周边poi String strInfo = res.strAddr; Toast.makeText(getApplicationContext(), strInfo, Toast.LENGTH_LONG) .show(); } }