本文主要講解如何通過百度地圖API搜尋指定位置附近的POI(Point of Interest,興趣點),如超市、餐廳、ATM、KTV等等。
雖然在上一篇文章中講到,在根據經緯度查詢地址資訊的同時,也會獲得該地址周圍的一些POI,但那些POI具有不確定性(可能是餐廳、銀行、酒吧,也有可能是學校、醫院、超市),並且很可能都不是我們所感興趣的地方。
我想大家可能都有過這樣的經曆:兜裡揣著一張銀行卡,在街上到處找自動取款機(ATM)。在這個情境中,ATM就是的興趣點,我們想做的事情就是找到離自己較近的一些ATM然後取款,此時我們並不關心附近有哪些超市、酒吧,因為這些地方沒辦法取錢!
說了這麼多,一方面是加深大家對POI這個詞的認識,另一方面也是為了讓大家明白我們接下來要做的事情。理論性的東西就不再多講了,直接來看例子。
1)布局檔案res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><com.baidu.mapapi.MapView android:id="@+id/map_View"android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /></LinearLayout>
2)繼承了com.baidu.mapapi.MapActivity的Activity類
package com.liufeng.baidumap;<br />import android.os.Bundle;<br />import com.baidu.mapapi.BMapManager;<br />import com.baidu.mapapi.GeoPoint;<br />import com.baidu.mapapi.MKAddrInfo;<br />import com.baidu.mapapi.MKDrivingRouteResult;<br />import com.baidu.mapapi.MKPoiResult;<br />import com.baidu.mapapi.MKSearch;<br />import com.baidu.mapapi.MKSearchListener;<br />import com.baidu.mapapi.MKTransitRouteResult;<br />import com.baidu.mapapi.MKWalkingRouteResult;<br />import com.baidu.mapapi.MapActivity;<br />import com.baidu.mapapi.MapController;<br />import com.baidu.mapapi.MapView;<br />import com.baidu.mapapi.PoiOverlay;public class PoiSearchActivity extends MapActivity {<br /> // 定義地圖引擎管理類<br /> private BMapManager mapManager;<br /> // 定義搜尋服務類<br /> private MKSearch mMKSearch;<br /> private MapView mapView;<br /> private MapController mapController;<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);<br /> // 初始化MapActivity<br /> mapManager = new BMapManager(getApplication());<br /> // init方法的第一個參數需填入申請的API<br /> KeymapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null);<br /> super.initMapActivity(mapManager);<br /> mapView = (MapView) findViewById(R.id.map_View);<br /> // 設定地圖模式為交通地圖<br /> mapView.setTraffic(true);<br /> // 設定啟用內建的縮放控制項<br /> mapView.setBuiltInZoomControls(true);<br /> // 構造一個經緯度點(貴州大學校門口)<br /> GeoPoint geoPoint = new GeoPoint((int) (26.449446 * 1E6), (int) (106.682949 * 1E6));<br /> // 取得地圖控制器對象,用於控制MapView<br /> mapController = mapView.getController();<br /> // 設定地圖的中心<br /> mapController.setCenter(geoPoint);<br /> // 設定地圖預設的縮放層級<br /> mapController.setZoom(16);<br /> // 初始化MKSearch<br /> mMKSearch = new MKSearch();<br /> mMKSearch.init(mapManager, new MySearchListener());<br /> // 搜尋貴州大學校門口附近500米範圍的自動取款機<br /> mMKSearch.poiSearchNearBy("ATM", geoPoint, 500);<br /> }<br /> @Override<br /> protected boolean isRouteDisplayed() {<br /> return false;<br /> }<br /> @Override<br /> protected void onDestroy() {<br /> if (mapManager != null)<br /> {<br /> // 程式退出前需調用此方法<br /> mapManager.destroy();<br /> mapManager = null;<br /> }<br /> super.onDestroy();<br /> }<br /> @Override<br /> protected void onPause() {<br /> if (mapManager != null)<br /> {<br /> // 終止百度地圖<br /> APImapManager.stop();<br /> }<br /> super.onPause();<br /> }<br /> @Override<br /> protected void onResume() {<br /> if (mapManager != null) {<br /> // 開啟百度地圖<br /> APImapManager.start();<br /> }<br /> super.onResume();<br /> }<br /> /** * 實現MKSearchListener介面,用於實現非同步搜尋服務<br /> * * @author liufeng<br /> */<br /> public class MySearchListener implements MKSearchListener {<br />/** * 根據經緯度搜尋地址資訊結果<br />* * @param result 搜尋結果<br />* @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br /> public void onGetAddrResult(MKAddrInfo result, int iError) {<br /> }<br />/** * 駕車路線搜尋結果<br /> * * @param result 搜尋結果<br />* @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {<br />}<br />/** * POI搜尋結果(範圍檢索、城市POI檢索、周邊檢索)<br /> * * @param result 搜尋結果 * @param type 返回結果類型(11,12,21:poi列表 7:城市列表)<br />* @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetPoiResult(MKPoiResult result, int type, int iError) {<br /> if (result == null)<br /> {<br /> return;<br /> }<br />// PoiOverlay是baidu map api提供的用於顯示POI的OverlayPoiOverlay<br /> poioverlay = new PoiOverlay(PoiSearchActivity.this, mapView);<br />// 設定搜尋到的POI資料<br />poioverlay.setData(result.getAllPoi());<br />// 在地圖上顯示PoiOverlay(將搜尋到的興趣點標註在地圖上)<br />mapView.getOverlays().add(poioverlay);<br />}<br />/** * 公交轉乘路線搜尋結果<br />* * @param result 搜尋結果<br />* @param iError 錯誤號碼(0表示正確返回)<br /> */<br />@Override<br />public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {}<br />/** * 步行路線搜尋結果<br />* * @param result 搜尋結果<br />* @param iError 錯誤號碼(0表示正確返回)<br />*/<br />@Override<br />public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {}}}
3)AndroidManifest.xml中的配置
package com.liufeng.baidumap;import android.os.Bundle;import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.GeoPoint;import com.baidu.mapapi.MKAddrInfo;import com.baidu.mapapi.MKDrivingRouteResult;import com.baidu.mapapi.MKPoiResult;import com.baidu.mapapi.MKSearch;import com.baidu.mapapi.MKSearchListener;import com.baidu.mapapi.MKTransitRouteResult;import com.baidu.mapapi.MKWalkingRouteResult;import com.baidu.mapapi.MapActivity;import com.baidu.mapapi.MapController;import com.baidu.mapapi.MapView;import com.baidu.mapapi.PoiOverlay;public class PoiSearchActivity extends MapActivity {// 定義地圖引擎管理類private BMapManager mapManager;// 定義搜尋服務類private MKSearch mMKSearch;private MapView mapView;private MapController mapController;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// 初始化MapActivitymapManager = new BMapManager(getApplication());// init方法的第一個參數需填入申請的API KeymapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null);super.initMapActivity(mapManager);mapView = (MapView) findViewById(R.id.map_View);// 設定地圖模式為交通地圖mapView.setTraffic(true);// 設定啟用內建的縮放控制項mapView.setBuiltInZoomControls(true);// 構造一個經緯度點(貴州大學校門口)GeoPoint geoPoint = new GeoPoint((int) (26.449446 * 1E6), (int) (106.682949 * 1E6));// 取得地圖控制器對象,用於控制MapViewmapController = mapView.getController();// 設定地圖的中心mapController.setCenter(geoPoint);// 設定地圖預設的縮放層級mapController.setZoom(16);// 初始化MKSearchmMKSearch = new MKSearch();mMKSearch.init(mapManager, new MySearchListener());// 搜尋貴州大學校門口附近500米範圍的自動取款機mMKSearch.poiSearchNearBy("ATM", geoPoint, 500);}@Overrideprotected boolean isRouteDisplayed() {return false;}@Overrideprotected void onDestroy() {if (mapManager != null) {// 程式退出前需調用此方法mapManager.destroy();mapManager = null;}super.onDestroy();}@Overrideprotected void onPause() {if (mapManager != null) {// 終止百度地圖APImapManager.stop();}super.onPause();}@Overrideprotected void onResume() {if (mapManager != null) {// 開啟百度地圖APImapManager.start();}super.onResume();}/** * 實現MKSearchListener介面,用於實現非同步搜尋服務 * * @author liufeng */public class MySearchListener implements MKSearchListener {/** * 根據經緯度搜尋地址資訊結果 * * @param result 搜尋結果 * @param iError 錯誤號碼(0表示正確返回) */@Overridepublic void onGetAddrResult(MKAddrInfo result, int iError) {}/** * 駕車路線搜尋結果 * * @param result 搜尋結果 * @param iError 錯誤號碼(0表示正確返回) */@Overridepublic void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {}/** * POI搜尋結果(範圍檢索、城市POI檢索、周邊檢索) * * @param result 搜尋結果 * @param type 返回結果類型(11,12,21:poi列表 7:城市列表) * @param iError 錯誤號碼(0表示正確返回) */@Overridepublic void onGetPoiResult(MKPoiResult result, int type, int iError) {if (result == null) {return;}// PoiOverlay是baidu map api提供的用於顯示POI的OverlayPoiOverlay poioverlay = new PoiOverlay(PoiSearchActivity.this, mapView);// 設定搜尋到的POI資料poioverlay.setData(result.getAllPoi());// 在地圖上顯示PoiOverlay(將搜尋到的興趣點標註在地圖上)mapView.getOverlays().add(poioverlay);}/** * 公交轉乘路線搜尋結果 * * @param result 搜尋結果 * @param iError 錯誤號碼(0表示正確返回) */@Overridepublic void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {}/** * 步行路線搜尋結果 * * @param result 搜尋結果 * @param iError 錯誤號碼(0表示正確返回) */@Overridepublic void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {}}}
4)運行結果
我們要搜尋的是貴州大學校門口500米範圍內的ATM,可以在地圖上看到,搜尋到了5個興趣點(即A,B,C,D,E標註的位置),點擊任何一個興趣點,會顯示該興趣點的名稱。
備忘:在本例中,搜尋到POI之後,我們直接採用了baibu map api所提示的PoiOverlay將興趣點標註在地圖上。可能大家會有這樣的需要:除了將搜尋到的POI標註在地圖上之外,我還想得到這些POI的資訊,如“名稱”、“地址”、“經緯度”等,這個問題其實在上一篇已經解答過,這裡再次提一下。
請看PoiSearchActivity類的第135-136行,代碼如下:
// 設定搜尋到的POI資料
poioverlay.setData(result.getAllPoi());
我們調用了搜尋結果類的getAllPoi()方法,它返回的是ArrayList<MKPoiInfo>,即POI資訊集合,MKPoiInfo類是一個普通的Java類,我們來看下它裡面所包含的屬性:
/** * MKPoiInfo是興趣點資訊類 */public class MKPoiInfo {// POI名稱public String name;// POI地址public String address;// POI所在城市public String city;// POI聯絡電話public String phoneNum;// POI郵遞區號public String postCode;// POI類型public int ePoiType;// POI地理座標(經緯度)public GeoPoint pt;}
這樣,只要遍曆ArrayList<MKPoiInfo>就能得到所有POI的相關資訊了。完!
原文出處:http://blog.csdn.net/lyq8479/article/details/6394998