Baidu地图开发(2)

一。地图层 

有两个:

mMapView.setTraffic(true);
mMapView.setSatellite(true);

二。搜索服务 

  1 。搜索服务 

百度地图 通过初始化 MKSearch 类,注册搜索结果的监听对象  MKSearchListener,实现异步的搜索服务 。检索服务 用完

后,要调用 MKsearch的destroy() 方法释放资源 。

首先,我们定义 MySearchListener实现 MKSearchListener的接口,

public class MySearchListener implements MKSearchListener{
//里面有各种override
}

再在MyMapActivity中添加成员

MKSearch mMKSearch = null ;

并在onCreate()中进行初始化

mMkSearch = new MKSearch();
mMkSearch.init(mBMapManager, new MySearchListener(this , mMapView ));
//注意,MKSearchListener只支持一个,以最后一次设置为准


2. 兴趣点的检索

    2.1在一个指定的矩形内进行查找 ,进过关键字,所使用的方法是

poiSearchInbounds(String key ,GeoPoint ptLB ,GeoPoint ptRT) ;

核心 代码 如下:

如要查找 北京西 站 与北站 为顶点的矩形内的KFC 

//北京 西站
		GeoPoint ptLB = new GeoPoint((int)(116.327841*1E6),(int) (39.900676*1E6));
		//北京北站
		GeoPoint ptRT = new GeoPoint( (int)(39.949404 * 1E6),(int)(116.360719 * 1E6));  
		mMkSearch.poiSearchInbounds("KFC", ptLB, ptRT);

2.2城市检索

在一个城市 内查找,用的是 

poiSearchInCity(String city ,String key );
如
poiSearchInCity("北京“ ,"KFC");

2.3 周边 检索 

以一个点为圆心

poiSearchNearby (String key ,GeoPoint pt ,int radius );
mMKSearch.poiSearchNearBy("KFC", new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)), 5000);

2.4 展示结果 

实现MySearchListener的onGetPoiResult,并展示检索结果:

首先加入构造 方法:

Context context;
	MapView mMapView;
	
	public MySearchListener(Context context, MapView mMapView) {
		// TODO Auto-generated constructor stub
		this.context=context;
		this.mMapView= mMapView;
	}

@Override
public void onGetPoiResult(MKPoiResult res, int type, int error) {
  // 错误号可参考MKEvent中的定义
  if ( error == MKEvent.ERROR_RESULT_NOT_FOUND){
    Toast.makeText(MyMapActivity.this, "抱歉,未找到结果",Toast.LENGTH_LONG).show();
    return ;
        }
        else if (error != 0 || res == null) {
    Toast.makeText(MyMapActivity.this, "搜索出错啦..", Toast.LENGTH_LONG).show();
    return;
  }
  // 将poi结果显示到地图上
  PoiOverlay poiOverlay = new PoiOverlay((Activity)context, 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;
    }
    }
}

3. 地址信息查询

  根据地理坐标查询信息。

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

reverseGeocode和geocode的返回结果在都在MKSearchListener里的onGetAddrResult方法中,具体区分是逆地址解析的结果还是地址解析的结果需要判断MKAddrInfo中的type字段,type字段为MKAddrInfo.MK_GEOCODE的是地理编码的结果、type字段为MKAddrInfo.MK_REVERSEGEOCODE的是逆地理编码的结果,核心代码如下所示,具体使用方法请参考官方Demo:

MySearchListener()中的代码 为

@Override
	public void onGetAddrResult(MKAddrInfo res, int error) {
		// TODO Auto-generated method stub
		if (error!=0){
			String str = String.format("错误号:%d", error);
			Toast.makeText(context, str, Toast.LENGTH_SHORT)
			.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(context, strInfo, Toast.LENGTH_SHORT).show();
		}
		if (res.type==MKAddrInfo.MK_REVERSEGEOCODE){
			//反地理编码,通过坐标点查询
			String strInfo= res.strAddr;
			Toast.makeText(context, strInfo, Toast.LENGTH_SHORT).show();
			
		}
	}

4. 在线建议查询





你可能感兴趣的:(Baidu地图开发(2))