Android_百度地图BaiduMap_搜索服务

来源:互联网 发布:java互联网必读 编辑:程序博客网 时间:2024/06/15 07:38

        Android_百度地图BaiduMap_搜索服务       

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

目录(?)[+]

  1. 搜索概述
  2. 搜索种类
    1. 1矩形区域搜索
    2. 2城市搜索
    3. 3圆形区域搜索
  3. 搜索结果
  4. 地址信息查询

1.搜索概述

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

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public class MySearchListenerimplements 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.     } 

2.搜索种类

(1).矩形区域搜索

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  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个点所形成的矩形区域进行搜索 

(2).城市搜索

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. mkSearch.poiSearchInCity("北京","饭店"); 

(3).圆形区域搜索

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. // 成功返回0,否则返回-1 
  2. mkSearch.poiSearchNearBy("饭店", new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)),5000);//radius - 半径,单位:米 

3.搜索结果

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  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.     } 
对于搜索出来通过PoiOverlay绘制在地图上的每个点,百度地图有默认的点击事件,可以继承PoiOverlay类,可以通过覆写onTap方法

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  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.     } 
[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. private class MyPoiOverlayextends 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.  

4.地址信息查询

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. mMKSearch.reverseGeocode(new GeoPoint(40057031,116307852)); //逆地址解析 
  2. mMKSearch.geocode(key, city);//地址解析 

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

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  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.     } 
0 0
原创粉丝点击