Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android百度地圖搜索服務之周邊檢索使用示例

Android百度地圖搜索服務之周邊檢索使用示例

編輯:Android開發實例

周邊檢索:根據檢索詞、中心點地理坐標和半徑與發起周邊檢索。

實現場景:查找以上海市浦東新區為中心,半徑為1000米內所有的“浦東發展銀行”(搜周邊)。

實現步驟:

一、前提條件:

        搭建百度地圖開發環境;

        地圖引擎管理對象和顯示地圖的View對象,都已創建並初始化;

        MapView對象的相關屬性已設置,生命周期函數也已處理。

        詳見:Android百度地圖SDK版本v2.0.0試用

二、檢索以上海市浦東新區為中心,半徑為1000米內所有的“浦東發展銀行”(搜周邊)的具體實現步驟:

        1、創建搜索服務類對象,並初始化。代碼如下:

  1. mMKSearch = new MKSearch();  
  2.        mMKSearch.init(mBMapManager, new MKSearchListener() {  
  3.  
  4.            @Override 
  5.            public void onGetAddrResult(MKAddrInfo arg0, int arg1) {  
  6.                // TODO Auto-generated method stub  
  7.  
  8.            }  
  9.  
  10.            @Override 
  11.            public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {  
  12.                // TODO Auto-generated method stub  
  13.  
  14.            }  
  15.  
  16.            @Override 
  17.            public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {  
  18.                // TODO Auto-generated method stub  
  19.  
  20.            }  
  21.  
  22.            @Override 
  23.            public void onGetPoiResult(MKPoiResult result, int type, int error) {  
  24.                
  25.            }  
  26.  
  27.            @Override 
  28.            public void onGetPoiDetailSearchResult(int type, int error) {  
  29.               
  30.            }  
  31.  
  32.            @Override 
  33.            public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {  
  34.                // TODO Auto-generated method stub  
  35.  
  36.            }  
  37.  
  38.            @Override 
  39.            public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {  
  40.                // TODO Auto-generated method stub  
  41.  
  42.            }  
  43.  
  44.            @Override 
  45.            public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {  
  46.                // TODO Auto-generated method stub  
  47.  
  48.            }  
  49.  
  50.        });  

           2、 調用mMKSearch對象的mMKSearch.poiSearchNearBy(arg0, arg1, arg2)方法,參數列表:關鍵詞、中心點地理坐標、半徑,單位:米。

  1. // 根據中心點、半徑與檢索詞發起周邊檢索.  
  2. // 參數列表:關鍵詞、中心點地理坐標、半徑,單位:米  
  3.  mMKSearch.poiSearchNearBy("浦東發展銀行", mGeoPoint, 1000); 

           3、在onGetPoiResult()回調方法內處理檢索到的結果。

  1. @Override 
  2.             public void onGetPoiResult(MKPoiResult result, int type, int error) {  
  3.                 if (error != 0) {  
  4.                     Toast.makeText(BaiduMapPoiOverlayActivity.this,   
  5.                             "抱歉,未查找到結果",   
  6.                             Toast.LENGTH_SHORT).show();  
  7.                 } else {  
  8.                     if (result == null) {  
  9.                         Toast.makeText(BaiduMapPoiOverlayActivity.this,  
  10.                                 "抱歉,您填寫的搜索條件,未查找到結果,換個條件試試!",  
  11.                                 Toast.LENGTH_SHORT).show();  
  12.                         return;  
  13.                     }  
  14.  
  15.                     // 創建POI內置的Overlay對象   
  16.                     PoiOverlay poiOverlay = new PoiOverlay(BaiduMapPoiOverlayActivity.this, mMapView);  
  17.                     // 符合搜索條件的所有點  
  18.                     poiOverlay.setData(result.getAllPoi());  
  19.                     // 向覆蓋物列表中添加覆蓋物對象PoiOverlay  
  20.                     mMapView.getOverlays().add(poiOverlay);  
  21.                     // 刷新地圖  
  22.                     mMapView.refresh();  
  23.                 }  
  24.             }  

           4、運行效果圖如下:


三、查看檢索到的POI詳情:

1、在前面我們以上海市浦東新區為中心,半徑為1000米內所有的“浦東發展銀行”,檢索得到的是一個POI的列表。代碼如下:

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

注:a. result是MKPoiResult類對象的一個引用。

        b. POI是中國POI(Point of Interest)數據庫的縮寫,可以翻譯成“興趣點”, 每個POI包含四方面信息,名稱、類別、經度、緯度。這個計劃的遠景目標是建立全國的POI數據庫,並且全部開放。
2、從POI的列表中取出一個元素:

  1. MKPoiInfo mkPoi = mkPois.get(1); 

3、發起查看詳細信息的請求:

  1. mMKSearch.poiDetailSearch(mkPoi.uid); 

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

注:調用百度API裡的POI詳細信息展示Activity,官方給的有錯誤。

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

5、處理onGetPoiDetailSearchResult()回調方法:

  1. @Override 
  2.             public void onGetPoiDetailSearchResult(int type, int error) {  
  3.                 // type - 值為GeoSearchManager.GEO_SEARCH_DETAILS  
  4.                 if (error != 0) {  
  5.                     Toast.makeText(BaiduMapPoiOverlayActivity.this, "抱歉,未找到結果", Toast.LENGTH_SHORT).show();  
  6.                 } else {  
  7.                     Toast.makeText(BaiduMapPoiOverlayActivity.this, "成功,查看詳情頁面", Toast.LENGTH_SHORT).show();  
  8.                 }  
  9.             }  

6、運行效果圖如下:


 

三、完整代碼:

1、在AndroidManifest.xml中的配置:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     package="com.android.baidu.map" 
  4.     android:versionCode="1" 
  5.     android:versionName="1.0" > 
  6.  
  7.     <uses-sdk android:minSdkVersion="8" /> 
  8.  
  9.     <application 
  10.         android:icon="@drawable/ic_launcher" 
  11.         android:label="@string/app_name" > 
  12.         <activity 
  13.             android:configChanges="orientation|keyboardHidden" 
  14.             android:label="@string/app_name" 
  15.             android:name=".BaiduMapPoiOverlayActivity" 
  16.             android:screenOrientation="sensor" > 
  17.             <intent-filter > 
  18.                 <action android:name="android.intent.action.MAIN" /> 
  19.  
  20.                 <category android:name="android.intent.category.LAUNCHER" /> 
  21.             </intent-filter> 
  22.         </activity> 
  23.           
  24.         <activity 
  25.             android:configChanges="orientation|keyboardHidden" 
  26.             android:name="com.baidu.mapapi.search.PlaceCaterActivity" 
  27.             android:theme="@android:style/Theme.NoTitleBar" > 
  28.         </activity> 
  29.     </application> 
  30.  
  31.     <!-- 使用網絡功能所需權限 --> 
  32.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > 
  33.     </uses-permission> 
  34.     <uses-permission android:name="android.permission.INTERNET" > 
  35.     </uses-permission> 
  36.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > 
  37.     </uses-permission> 
  38.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > 
  39.     </uses-permission> 
  40.  
  41.     <!-- 讀取手機的當前狀態權限,沒有的話會報錯,這個是使用百度地圖API必須的 --> 
  42.     <uses-permission android:name="android.permission.READ_PHONE_STATE" > 
  43.     </uses-permission> 
  44.  
  45.     <!-- Cache功能需要讀寫外部存儲器 ,若沒這個權限,地圖加載不出來 --> 
  46.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > 
  47.     </uses-permission> 
  48.       
  49.     <supports-screens 
  50.         android:anyDensity="true" 
  51.         android:largeScreens="true" 
  52.         android:normalScreens="true" 
  53.         android:resizeable="true" 
  54.         android:smallScreens="true" /> 
  55.  
  56. </manifest> 

2、繼承自Activity類的子類的完整代碼:

  1. package com.android.baidu.map;  
  2.  
  3. import java.util.ArrayList;  
  4.  
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.widget.Toast;  
  8.  
  9. import com.baidu.mapapi.BMapManager;  
  10. import com.baidu.mapapi.MKGeneralListener;  
  11. import com.baidu.mapapi.map.MKEvent;  
  12. import com.baidu.mapapi.map.MapController;  
  13. import com.baidu.mapapi.map.MapView;  
  14. import com.baidu.mapapi.map.PoiOverlay;  
  15. import com.baidu.mapapi.search.MKAddrInfo;  
  16. import com.baidu.mapapi.search.MKBusLineResult;  
  17. import com.baidu.mapapi.search.MKDrivingRouteResult;  
  18. import com.baidu.mapapi.search.MKPoiInfo;  
  19. import com.baidu.mapapi.search.MKPoiResult;  
  20. import com.baidu.mapapi.search.MKSearch;  
  21. import com.baidu.mapapi.search.MKSearchListener;  
  22. import com.baidu.mapapi.search.MKSuggestionResult;  
  23. import com.baidu.mapapi.search.MKTransitRouteResult;  
  24. import com.baidu.mapapi.search.MKWalkingRouteResult;  
  25. import com.baidu.platform.comapi.basestruct.GeoPoint;  
  26.  
  27. /**  
  28.  * 根據檢索詞、中心點地理坐標和半徑與發起周邊檢索.  
  29.  * @author android_ls  
  30.  *  
  31.  */ 
  32. public class BaiduMapPoiOverlayActivity extends Activity {  
  33.  
  34.     /**地圖引擎管理類*/ 
  35.     private BMapManager mBMapManager = null;  
  36.  
  37.     /**顯示地圖的View*/ 
  38.     private MapView mMapView = null;  
  39.  
  40.     /**搜索服務,用於位置檢索、周邊檢索、范圍檢索、公交檢索、駕乘檢索、步行檢索*/ 
  41.     private MKSearch mMKSearch = null;  
  42.  
  43.     /**  
  44.      * 經研究發現在申請KEY時:應用名稱一定要寫成my_app_應用名(也就是說"my_app_"是必須要有的)。  
  45.      * 百度地圖SDK提供的服務是免費的,接口無使用次數限制。您需先申請密鑰(key),才可使用該套SDK。  
  46.      * */ 
  47.     public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";  
  48.  
  49.     @Override 
  50.     public void onCreate(Bundle savedInstanceState) {  
  51.         super.onCreate(savedInstanceState);  
  52.  
  53.         // 注意:請在調用setContentView前初始化BMapManager對象,否則會報錯  
  54.         mBMapManager = new BMapManager(this.getApplicationContext());  
  55.         mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {  
  56.  
  57.             @Override 
  58.             public void onGetNetworkState(int iError) {  
  59.                 if (iError == MKEvent.ERROR_NETWORK_CONNECT) {  
  60.                     Toast.makeText(BaiduMapPoiOverlayActivity.this.getApplicationContext(),  
  61.                             "您的網絡出錯啦!",   
  62.                             Toast.LENGTH_LONG).show();  
  63.                 }  
  64.             }  
  65.  
  66.             @Override 
  67.             public void onGetPermissionState(int iError) {  
  68.                 if (iError == MKEvent.ERROR_PERMISSION_DENIED) {  
  69.                     // 授權Key錯誤:  
  70.                     Toast.makeText(BaiduMapPoiOverlayActivity.this.getApplicationContext(),  
  71.                             "請在 DemoApplication.java文件輸入正確的授權Key!",   
  72.                             Toast.LENGTH_LONG).show();  
  73.                 }  
  74.             }  
  75.         });  
  76.  
  77.         setContentView(R.layout.main);  
  78.  
  79.         mMapView = (MapView) this.findViewById(R.id.bmapsView);  
  80.         // 設置啟用內置的縮放控件  
  81.         mMapView.setBuiltInZoomControls(true);  
  82.  
  83.         MapController mapController = mMapView.getController();  
  84.         // 上海市浦東新區的GPS緯度經度值:31.224078,121.540419  
  85.         GeoPoint mGeoPoint = new GeoPoint(  
  86.                 (int) (31.224078 * 1E6),   
  87.                 (int) (121.540419 * 1E6));  
  88.  
  89.         // 設置地圖的中心點  
  90.         mapController.setCenter(mGeoPoint);  
  91.         mapController.setZoom(15);  
  92.  
  93.         mMKSearch = new MKSearch();  
  94.         mMKSearch.init(mBMapManager, new MKSearchListener() {  
  95.  
  96.             @Override 
  97.             public void onGetAddrResult(MKAddrInfo arg0, int arg1) {  
  98.                 // TODO Auto-generated method stub  
  99.  
  100.             }  
  101.  
  102.             @Override 
  103.             public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {  
  104.                 // TODO Auto-generated method stub  
  105.  
  106.             }  
  107.  
  108.             @Override 
  109.             public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {  
  110.                 // TODO Auto-generated method stub  
  111.  
  112.             }  
  113.  
  114.             @Override 
  115.             public void onGetPoiResult(MKPoiResult result, int type, int error) {  
  116.                 if (error != 0) {  
  117.                     Toast.makeText(BaiduMapPoiOverlayActivity.this,   
  118.                             "抱歉,未查找到結果",   
  119.                             Toast.LENGTH_SHORT).show();  
  120.                 } else {  
  121.                     if (result == null) {  
  122.                         Toast.makeText(BaiduMapPoiOverlayActivity.this,  
  123.                                 "抱歉,您填寫的搜索條件,未查找到結果,換個條件試試!",  
  124.                                 Toast.LENGTH_SHORT).show();  
  125.                         return;  
  126.                     }  
  127.  
  128.                     // 創建POI內置的Overlay對象   
  129.                     PoiOverlay poiOverlay = new PoiOverlay(BaiduMapPoiOverlayActivity.this, mMapView);  
  130.                     // 符合搜索條件的所有點  
  131.                     poiOverlay.setData(result.getAllPoi());  
  132.                     // 向覆蓋物列表中添加覆蓋物對象PoiOverlay  
  133.                     mMapView.getOverlays().add(poiOverlay);  
  134.                     // 刷新地圖  
  135.                     mMapView.refresh();  
  136.                       
  137.                    /* 注: POI是中國POI(Point of Interest)數據庫的縮寫,可以翻譯成“興趣點”,  
  138.                     * 每個POI包含四方面信息,名稱、類別、經度、緯度。  
  139.                     * 這個計劃的遠景目標是建立全國的POI數據庫,並且全部開放。*/ 
  140.                       
  141.                     // 當執行完POI檢索後,我們會得到一個POI的列表。  
  142.                     ArrayList<MKPoiInfo> mkPois = result.getAllPoi();  
  143.                     // 取POI列表中的第二個元素  
  144.                     MKPoiInfo mkPoi = mkPois.get(1);  
  145.                     /* 每個POI節點都有個uid屬性,我們可以根據這個uid獲取關於這個poi的一些更詳細的信息。  
  146.                      * 比如:評論、圖片、商戶描述等。*/ 
  147.                       
  148.                     // 發起查看詳細信息的請求  
  149.                     mMKSearch.poiDetailSearch(mkPoi.uid);  
  150.                 }  
  151.             }  
  152.  
  153.             @Override 
  154.             public void onGetPoiDetailSearchResult(int type, int error) {  
  155.                 // type - 值為GeoSearchManager.GEO_SEARCH_DETAILS  
  156.                 if (error != 0) {  
  157.                     Toast.makeText(BaiduMapPoiOverlayActivity.this, "抱歉,未找到結果", Toast.LENGTH_SHORT).show();  
  158.                 } else {  
  159.                     Toast.makeText(BaiduMapPoiOverlayActivity.this, "成功,查看詳情頁面", Toast.LENGTH_SHORT).show();  
  160.                 }  
  161.             }  
  162.  
  163.             @Override 
  164.             public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {  
  165.                 // TODO Auto-generated method stub  
  166.  
  167.             }  
  168.  
  169.             @Override 
  170.             public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {  
  171.                 // TODO Auto-generated method stub  
  172.  
  173.             }  
  174.  
  175.             @Override 
  176.             public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {  
  177.                 // TODO Auto-generated method stub  
  178.  
  179.             }  
  180.  
  181.         });  
  182.           
  183.         // 根據中心點、半徑與檢索詞發起周邊檢索.  
  184.         // 參數列表:關鍵詞、中心點地理坐標、半徑,單位:米  
  185.         mMKSearch.poiSearchNearBy("浦東發展銀行", mGeoPoint, 1000);  
  186.  
  187.     }  
  188.  
  189.     // 重寫以下方法,管理API  
  190.     @Override 
  191.     protected void onResume() {  
  192.         mMapView.onResume();  
  193.         if (mBMapManager != null) {  
  194.             mBMapManager.start();  
  195.         }  
  196.         super.onResume();  
  197.     }  
  198.  
  199.     @Override 
  200.     protected void onPause() {  
  201.         mMapView.onPause();  
  202.         if (mBMapManager != null) {  
  203.             mBMapManager.stop();  
  204.         }  
  205.         super.onPause();  
  206.     }  
  207.  
  208.     @Override 
  209.     protected void onDestroy() {  
  210.         mMapView.destroy();  
  211.         if (mBMapManager != null) {  
  212.             mBMapManager.destroy();  
  213.             mBMapManager = null;  
  214.         }  
  215.         super.onDestroy();  
  216.     }  
  217. }  

 

轉自:http://blog.csdn.net/android_ls/article/details/8578289

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved