Android百度地图 - 搜索服务之周边检索
周边检索:根据检索词、中心点地理坐标和半径与发起周边检索。
实现场景:查找以上海市浦东新区为中心,半径为1000米内所有的“浦东发展银行”(搜周边)。
实现步骤:
一、前提条件:
搭建百度地图开发环境;
地图引擎管理对象和显示地图的View对象,都已创建并初始化;
MapView对象的相关属性已设置,生命周期函数也已处理。
二、检索以上海市浦东新区为中心,半径为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、运行效果图如下:
三、查看检索到的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、运行效果图如下:
三、完整代码:
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