Android_百度地图BaiduMap_搜索服务

1.搜索概述

百度地图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) {
		
	}
}

2.搜索种类

(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 - 半径,单位:米 

3.搜索结果

@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;
	}

}

4.地址信息查询

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();
	}
}

你可能感兴趣的:(android,百度地图,MKPoiResult,MKSearch)