Android_百度地图BaiduMap_搜索服务

        Android_百度地图BaiduMap_搜索服务       

        分类:            Android基础百度地图 588人阅读 评论(0) 收藏 举报

1.搜索概述

百度地图SDK集成搜索服务包括:位置检索、周边检索、范围检索、公交检索、驾乘检索等,首先实例化MKSearch对象,然后初始化init该MKSearch对象并指定MKSearchListener对象监听器,并通过调用相应的方法实现异步搜索服务。检索服务使用完成之后,需要调用MKSearch的destory()方法来释放资源

  1. public class MySearchListener implements MKSearchListener {   
  2.     @Override   
  3.     public void onGetAddrResult(MKAddrInfo result, int iError) {   
  4.            //返回地址信息搜索结果   
  5.     }   
  6.     @Override   
  7.     public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {   
  8.             //返回驾乘路线搜索结果   
  9.     }   
  10.     @Override   
  11.     public void onGetPoiResult(MKPoiResult result, int type, int iError) {   
  12.             //返回poi搜索结果   
  13.     }   
  14.     @Override   
  15.     public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {   
  16.             //返回公交搜索结果   
  17.     }   
  18.     @Override   
  19.     public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {   
  20.             //返回步行路线搜索结果   
  21.     }   
  22.     @Override       
  23.     public void onGetBusDetailResult(MKBusLineResult result, int iError) {   
  24.             //返回公交车详情信息搜索结果   
  25.     } 
  26.      
  27.     @Override 
  28.     public void onGetSuggestionResult(MKSuggestionResult result, int iError) {   
  29.             //返回联想词信息搜索结果   
  30.     } 
  31.      @Override  
  32.      public void onGetShareUrlResult(MKShareUrlResult result , int type, int error) { 
  33.            //在此处理短串请求返回结果.  
  34.     } 
  35.     @Override 
  36.     public void onGetPoiDetailSearchResult(int arg0, int arg1) { 
  37.          
  38.     } 
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) {
		
	}
}

2.搜索种类

(1).矩形区域搜索

  1. // 北京西站 
  2. GeoPoint ptLB = new GeoPoint((int) (39.901375 * 1E6), (int) (116.329099 * 1E6)); 
  3. // 北京北站 
  4. GeoPoint ptRT = new GeoPoint((int) (39.949404 * 1E6), (int) (116.360719 * 1E6)); 
  5. mkSearch.poiSearchInbounds("KFC", ptLB, ptRT);//在2个点所形成的矩形区域进行搜索 
// 北京西站
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).城市搜索

  1. mkSearch.poiSearchInCity("北京", "饭店"); 
mkSearch.poiSearchInCity("北京", "饭店");

(3).圆形区域搜索

  1. // 成功返回0,否则返回-1 
  2. mkSearch.poiSearchNearBy("饭店", new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)), 5000);//radius - 半径,单位:米  
// 成功返回0,否则返回-1
mkSearch.poiSearchNearBy("饭店", new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)), 5000);//radius - 半径,单位:米 

3.搜索结果

  1. @Override 
  2. public void onGetPoiResult(MKPoiResult res, int type, int error) { 
  3.     // 错误号可参考MKEvent中的定义 
  4.     if (error == MKEvent.ERROR_RESULT_NOT_FOUND) { 
  5.         Toast.makeText(getApplicationContext(), "抱歉,未找到结果"
  6.                 Toast.LENGTH_LONG).show(); 
  7.         return
  8.     } else if (error != 0 || res == null) { 
  9.         Toast.makeText(getApplicationContext(), "搜索出错啦.."
  10.                 Toast.LENGTH_LONG).show(); 
  11.         return
  12.     } 
  13.     // 将poi结果显示到地图上 
  14.     PoiOverlay poiOverlay = new PoiOverlay(this, mMapView); 
  15.     poiOverlay.setData(res.getAllPoi()); 
  16.     mMapView.getOverlays().clear(); 
  17.     mMapView.getOverlays().add(poiOverlay); 
  18.     mMapView.refresh(); 
  19.     // 当ePoiType为2(公交线路)或4(地铁线路)时, poi坐标为空 
  20.     for (MKPoiInfo info : res.getAllPoi()) { 
  21.         if (info.pt != null) { 
  22.             mMapView.getController().animateTo(info.pt); 
  23.             break
  24.         } 
  25.     } 
@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方法

  1. public void onGetPoiResult(MKPoiResult res, int type, int error) { 
  2.     // 错误号可参考MKEvent中的定义 
  3.     if (error == MKEvent.ERROR_RESULT_NOT_FOUND) { 
  4.         Toast.makeText(getApplicationContext(), "抱歉,未找到结果"
  5.                 Toast.LENGTH_LONG).show(); 
  6.         return
  7.     } else if (error != 0 || res == null) { 
  8.         Toast.makeText(getApplicationContext(), "搜索出错啦.."
  9.                 Toast.LENGTH_LONG).show(); 
  10.         return
  11.     } 
  12.     /// 
  13.     //继承PoiOverlay类,可以通过覆写onTap方法,可以处理点击事件 
  14.     MyPoiOverlay poiOverlay = new MyPoiOverlay(this, mMapView); 
  15.     // 
  16.      
  17.     poiOverlay.setData(res.getAllPoi()); 
  18.     mMapView.getOverlays().clear(); 
  19.     mMapView.getOverlays().add(poiOverlay); 
  20.     mMapView.refresh(); 
  21.     // 当ePoiType为2(公交线路)或4(地铁线路)时, poi坐标为空 
  22.     for (MKPoiInfo info : res.getAllPoi()) { 
  23.         if (info.pt != null) { 
  24.             mMapView.getController().animateTo(info.pt); 
  25.             break
  26.         } 
  27.     } 
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;
		}
	}
}
  1. private class MyPoiOverlay extends PoiOverlay { 
  2.  
  3.     public MyPoiOverlay(Activity activity, MapView mapView) { 
  4.         super(activity, mapView); 
  5.     } 
  6.  
  7.     @Override 
  8.     protected boolean onTap(int i) { 
  9.         //覆写该方法, 
  10.         MKPoiInfo info = getPoi(i); 
  11.         Toast.makeText(getApplicationContext(), 
  12.                 info.address + ":" + info.name, 0).show(); 
  13.         return true
  14.     } 
  15.  
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;
	}

}

4.地址信息查询

  1. mMKSearch.reverseGeocode(new GeoPoint(40057031, 116307852)); //逆地址解析 
  2. mMKSearch.geocode(key, city);//地址解析 
mMKSearch.reverseGeocode(new GeoPoint(40057031, 116307852)); //逆地址解析
mMKSearch.geocode(key, city);//地址解析

reverseGeocode和geocode的返回结果在都在MKSearchListener里的onGetAddrResult方法中,具体区分是逆地址解析的结果还是地址解析的结果需要判断MKAddrInfo中的type字段,type字段为MKAddrInfo.MK_GEOCODE的是地理编码的结果、type字段为MKAddrInfo.MK_REVERSEGEOCODE的是逆地理编码的结果.

  1. @Override 
  2. public void onGetAddrResult(MKAddrInfo res, int error) { 
  3.     if (error != 0) { 
  4.         String str = String.format("错误号:%d", error); 
  5.         Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG) 
  6.                 .show(); 
  7.         return
  8.     } 
  9.     // 地图移动到该点 
  10.     mMapView.getController().animateTo(res.geoPt); 
  11.     if (res.type == MKAddrInfo.MK_GEOCODE) { 
  12.         // 地理编码:通过地址检索坐标点 
  13.         String strInfo = String.format("纬度:%f 经度:%f"
  14.                 res.geoPt.getLatitudeE6() / 1e6, 
  15.                 res.geoPt.getLongitudeE6() / 1e6); 
  16.         Toast.makeText(getApplicationContext(), strInfo, Toast.LENGTH_LONG) 
  17.                 .show(); 
  18.     } 
  19.     if (res.type == MKAddrInfo.MK_REVERSEGEOCODE) { 
  20.         // 反地理编码:通过坐标点检索详细地址及周边poi 
  21.         String strInfo = res.strAddr; 
  22.         Toast.makeText(getApplicationContext(), strInfo, Toast.LENGTH_LONG) 
  23.                 .show(); 
  24.     } 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值