一。地图层
有两个:
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. 在线建议查询