Android百度地图 - 搜索服务之周边检索

jopen 11年前

周边检索:根据检索词、中心点地理坐标和半径与发起周边检索。

实现场景:查找以上海市浦东新区为中心,半径为1000米内所有的“浦东发展银行”(搜周边)。

实现步骤:

一、前提条件:

        搭建百度地图开发环境;

        地图引擎管理对象和显示地图的View对象,都已创建并初始化;

        MapView对象的相关属性已设置,生命周期函数也已处理。

        详见:Android 百度地图SDK (v2.0.0)初探

二、检索以上海市浦东新区为中心,半径为1000米内所有的“浦东发展银行”(搜周边)的具体实现步骤:

        1、创建搜索服务类对象,并初始化。代码如下:

 mMKSearch = new MKSearch();          mMKSearch.init(mBMapManager, new MKSearchListener() {                @Override              public void onGetAddrResult(MKAddrInfo arg0, int arg1) {                  // TODO Auto-generated method stub                }                @Override              public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {                  // TODO Auto-generated method stub                }                @Override              public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {                  // TODO Auto-generated method stub                }                @Override              public void onGetPoiResult(MKPoiResult result, int type, int error) {                              }                @Override              public void onGetPoiDetailSearchResult(int type, int error) {                             }                @Override              public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {                  // TODO Auto-generated method stub                }                @Override              public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {                  // TODO Auto-generated method stub                }                @Override              public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {                  // TODO Auto-generated method stub                }            });

           2、 调用mMKSearch对象的mMKSearch.poiSearchNearBy(arg0, arg1, arg2)方法,参数列表:关键词、中心点地理坐标、半径,单位:米。

       // 根据中心点、半径与检索词发起周边检索.         // 参数列表:关键词、中心点地理坐标、半径,单位:米          mMKSearch.poiSearchNearBy("浦东发展银行", mGeoPoint, 1000);

           3、在onGetPoiResult()回调方法内处理检索到的结果。

@Override              public void onGetPoiResult(MKPoiResult result, int type, int error) {                  if (error != 0) {                      Toast.makeText(BaiduMapPoiOverlayActivity.this,                               "抱歉,未查找到结果",                               Toast.LENGTH_SHORT).show();                  } else {                      if (result == null) {                          Toast.makeText(BaiduMapPoiOverlayActivity.this,                                  "抱歉,您填写的搜索条件,未查找到结果,换个条件试试!",                                  Toast.LENGTH_SHORT).show();                          return;                      }                        // 创建POI内置的Overlay对象                       PoiOverlay poiOverlay = new PoiOverlay(BaiduMapPoiOverlayActivity.this, mMapView);                      // 符合搜索条件的所有点                      poiOverlay.setData(result.getAllPoi());                      // 向覆盖物列表中添加覆盖物对象PoiOverlay                      mMapView.getOverlays().add(poiOverlay);                      // 刷新地图                      mMapView.refresh();                  }              }

           4、运行效果图如下:

Android百度地图 - 搜索服务之周边检索
三、查看检索到的POI详情:

1、在前面我们以上海市浦东新区为中心,半径为1000米内所有的“浦东发展银行”,检索得到的是一个POI的列表。代码如下:

ArrayList<MKPoiInfo> mkPois = result.getAllPoi();

注:a. result是MKPoiResult类对象的一个引用。

        b. POI是中国POI(Point of Interest)数据库的缩写,可以翻译成“兴趣点”, 每个POI包含四方面信息,名称、类别、经度、纬度。这个计划的远景目标是建立全国的POI数据库,并且全部开放。
2、从POI的列表中取出一个元素:

MKPoiInfo mkPoi = mkPois.get(1);

3、发起查看详细信息的请求:

 mMKSearch.poiDetailSearch(mkPoi.uid);

4、需要在AndroidManifest.xml中设置如下信息:

注:调用百度API里的POI详细信息展示Activity,官方给的有错误。

 <activity              android:configChanges="orientation|keyboardHidden"              android:name="com.baidu.mapapi.search.PlaceCaterActivity"              android:theme="@android:style/Theme.NoTitleBar" >          </activity>

5、处理onGetPoiDetailSearchResult()回调方法:

@Override              public void onGetPoiDetailSearchResult(int type, int error) {                  // type - 值为GeoSearchManager.GEO_SEARCH_DETAILS                  if (error != 0) {                      Toast.makeText(BaiduMapPoiOverlayActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();                  } else {                      Toast.makeText(BaiduMapPoiOverlayActivity.this, "成功,查看详情页面", Toast.LENGTH_SHORT).show();                  }              }

6、运行效果图如下:

Android百度地图 - 搜索服务之周边检索
三、完整代码:

1、在AndroidManifest.xml中的配置:

<?xml version="1.0" encoding="utf-8"?>  <manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="com.android.baidu.map"      android:versionCode="1"      android:versionName="1.0" >        <uses-sdk android:minSdkVersion="8" />        <application          android:icon="@drawable/ic_launcher"          android:label="@string/app_name" >          <activity              android:configChanges="orientation|keyboardHidden"              android:label="@string/app_name"              android:name=".BaiduMapPoiOverlayActivity"              android:screenOrientation="sensor" >              <intent-filter >                  <action android:name="android.intent.action.MAIN" />                    <category android:name="android.intent.category.LAUNCHER" />              </intent-filter>          </activity>                    <activity              android:configChanges="orientation|keyboardHidden"              android:name="com.baidu.mapapi.search.PlaceCaterActivity"              android:theme="@android:style/Theme.NoTitleBar" >          </activity>      </application>        <!-- 使用网络功能所需权限 -->      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >      </uses-permission>      <uses-permission android:name="android.permission.INTERNET" >      </uses-permission>      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >      </uses-permission>      <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >      </uses-permission>        <!-- 读取手机的当前状态权限,没有的话会报错,这个是使用百度地图API必须的 -->      <uses-permission android:name="android.permission.READ_PHONE_STATE" >      </uses-permission>        <!-- Cache功能需要读写外部存储器 ,若没这个权限,地图加载不出来 -->      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >      </uses-permission>            <supports-screens          android:anyDensity="true"          android:largeScreens="true"          android:normalScreens="true"          android:resizeable="true"          android:smallScreens="true" />    </manifest>

2、继承自Activity类的子类的完整代码:

package com.android.baidu.map;    import java.util.ArrayList;    import android.app.Activity;  import android.os.Bundle;  import android.widget.Toast;    import com.baidu.mapapi.BMapManager;  import com.baidu.mapapi.MKGeneralListener;  import com.baidu.mapapi.map.MKEvent;  import com.baidu.mapapi.map.MapController;  import com.baidu.mapapi.map.MapView;  import com.baidu.mapapi.map.PoiOverlay;  import com.baidu.mapapi.search.MKAddrInfo;  import com.baidu.mapapi.search.MKBusLineResult;  import com.baidu.mapapi.search.MKDrivingRouteResult;  import com.baidu.mapapi.search.MKPoiInfo;  import com.baidu.mapapi.search.MKPoiResult;  import com.baidu.mapapi.search.MKSearch;  import com.baidu.mapapi.search.MKSearchListener;  import com.baidu.mapapi.search.MKSuggestionResult;  import com.baidu.mapapi.search.MKTransitRouteResult;  import com.baidu.mapapi.search.MKWalkingRouteResult;  import com.baidu.platform.comapi.basestruct.GeoPoint;    /**   * 根据检索词、中心点地理坐标和半径与发起周边检索.   * @author android_ls   *   */  public class BaiduMapPoiOverlayActivity extends Activity {        /**地图引擎管理类*/      private BMapManager mBMapManager = null;        /**显示地图的View*/      private MapView mMapView = null;        /**搜索服务,用于位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索*/      private MKSearch mMKSearch = null;        /**       * 经研究发现在申请KEY时:应用名称一定要写成my_app_应用名(也就是说"my_app_"是必须要有的)。       * 百度地图SDK提供的服务是免费的,接口无使用次数限制。您需先申请密钥(key),才可使用该套SDK。       * */      public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);            // 注意:请在调用setContentView前初始化BMapManager对象,否则会报错          mBMapManager = new BMapManager(this.getApplicationContext());          mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {                @Override              public void onGetNetworkState(int iError) {                  if (iError == MKEvent.ERROR_NETWORK_CONNECT) {                      Toast.makeText(BaiduMapPoiOverlayActivity.this.getApplicationContext(),                              "您的网络出错啦!",                               Toast.LENGTH_LONG).show();                  }              }                @Override              public void onGetPermissionState(int iError) {                  if (iError == MKEvent.ERROR_PERMISSION_DENIED) {                      // 授权Key错误:                      Toast.makeText(BaiduMapPoiOverlayActivity.this.getApplicationContext(),                              "请在 DemoApplication.java文件输入正确的授权Key!",                               Toast.LENGTH_LONG).show();                  }              }          });            setContentView(R.layout.main);            mMapView = (MapView) this.findViewById(R.id.bmapsView);          // 设置启用内置的缩放控件          mMapView.setBuiltInZoomControls(true);            MapController mapController = mMapView.getController();          // 上海市浦东新区的GPS纬度经度值:31.224078,121.540419          GeoPoint mGeoPoint = new GeoPoint(                  (int) (31.224078 * 1E6),                   (int) (121.540419 * 1E6));            // 设置地图的中心点          mapController.setCenter(mGeoPoint);          mapController.setZoom(15);            mMKSearch = new MKSearch();          mMKSearch.init(mBMapManager, new MKSearchListener() {                @Override              public void onGetAddrResult(MKAddrInfo arg0, int arg1) {                  // TODO Auto-generated method stub                }                @Override              public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {                  // TODO Auto-generated method stub                }                @Override              public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {                  // TODO Auto-generated method stub                }                @Override              public void onGetPoiResult(MKPoiResult result, int type, int error) {                  if (error != 0) {                      Toast.makeText(BaiduMapPoiOverlayActivity.this,                               "抱歉,未查找到结果",                               Toast.LENGTH_SHORT).show();                  } else {                      if (result == null) {                          Toast.makeText(BaiduMapPoiOverlayActivity.this,                                  "抱歉,您填写的搜索条件,未查找到结果,换个条件试试!",                                  Toast.LENGTH_SHORT).show();                          return;                      }                        // 创建POI内置的Overlay对象                       PoiOverlay poiOverlay = new PoiOverlay(BaiduMapPoiOverlayActivity.this, mMapView);                      // 符合搜索条件的所有点                      poiOverlay.setData(result.getAllPoi());                      // 向覆盖物列表中添加覆盖物对象PoiOverlay                      mMapView.getOverlays().add(poiOverlay);                      // 刷新地图                      mMapView.refresh();                                           /* 注: POI是中国POI(Point of Interest)数据库的缩写,可以翻译成“兴趣点”,                      * 每个POI包含四方面信息,名称、类别、经度、纬度。                      * 这个计划的远景目标是建立全国的POI数据库,并且全部开放。*/                                            // 当执行完POI检索后,我们会得到一个POI的列表。                      ArrayList<MKPoiInfo> mkPois = result.getAllPoi();                      // 取POI列表中的第二个元素                      MKPoiInfo mkPoi = mkPois.get(1);                      /* 每个POI节点都有个uid属性,我们可以根据这个uid获取关于这个poi的一些更详细的信息。                       * 比如:评论、图片、商户描述等。*/                                            // 发起查看详细信息的请求                      mMKSearch.poiDetailSearch(mkPoi.uid);                  }              }                @Override              public void onGetPoiDetailSearchResult(int type, int error) {                  // type - 值为GeoSearchManager.GEO_SEARCH_DETAILS                  if (error != 0) {                      Toast.makeText(BaiduMapPoiOverlayActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();                  } else {                      Toast.makeText(BaiduMapPoiOverlayActivity.this, "成功,查看详情页面", Toast.LENGTH_SHORT).show();                  }              }                @Override              public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {                  // TODO Auto-generated method stub                }                @Override              public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {                  // TODO Auto-generated method stub                }                @Override              public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {                  // TODO Auto-generated method stub                }            });                    // 根据中心点、半径与检索词发起周边检索.          // 参数列表:关键词、中心点地理坐标、半径,单位:米          mMKSearch.poiSearchNearBy("浦东发展银行", mGeoPoint, 1000);        }        // 重写以下方法,管理API      @Override      protected void onResume() {          mMapView.onResume();          if (mBMapManager != null) {              mBMapManager.start();          }          super.onResume();      }        @Override      protected void onPause() {          mMapView.onPause();          if (mBMapManager != null) {              mBMapManager.stop();          }          super.onPause();      }        @Override      protected void onDestroy() {          mMapView.destroy();          if (mBMapManager != null) {              mBMapManager.destroy();              mBMapManager = null;          }          super.onDestroy();      }  }
来自:http://blog.csdn.net/android_ls/article/details/8578289