摘要:POI即關鍵興趣點,好比人民大學、新世界華聯、306醫院、沙縣小吃、百度大廈,這些都是POI點。百度地圖SDK查詢POI有三種接口,分別是城市內搜索poiSearchInCity、周邊搜索poiSearchNearBy、範圍搜索poiSearchInbounds。其中周邊和範圍搜索還分別有多關鍵搜索,支持1-10個多關鍵詞。php
----------------------------------------------------------------------html
系列閱讀:
一、【百度地圖-安卓SDK】從頭開始寫android程序
http://www.cnblogs.com/milkmap/archive/2011/11/25/2263475.html
二、【「零起點」--百度地圖手機SDK】如何建立一張地圖
http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.html
三、【「零起點」--百度地圖手機SDK】如何使用離線地圖?
http://www.cnblogs.com/milkmap/archive/2012/05/21/2511928.htmljava
四、【「零起點」--百度地圖手機SDK】如何添加地圖圖層+按鈕事件+水平垂直佈局?android
http://www.cnblogs.com/milkmap/archive/2012/05/25/2518454.html
-----------------------------------------------------------------------api
1、選擇一個POI搜索接口app
官網的類參考上有所有接口的說明:http://dev.baidu.com/wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0/%E7%B1%BB%E5%8F%82%E8%80%83/MKSearchide
以範圍檢索爲例,咱們查詢一個矩形範圍內的味多美有多少。函數
第一個參數是關鍵詞,這裏寫的是味多美。工具
第二個參數,是矩形的左下角座標。第三個參數,是矩形右上角座標。佈局
取座標的可視化工具:http://dev.baidu.com/wiki/static/map/API/tool/getPoint/
myMKSearch.poiSearchInbounds("味多美",new GeoPoint((int) (39.863116 * 1E6), (int) (116.199024 * 1E6)),new GeoPoint((int) (39.90298 * 1E6), (int) (116.338728 * 1E6)));
2、初始化
須要申明變量,而後初始化搜索接口。
/** 寫在activity裏面頂部 **/MKSearch myMKSearch = null; //POI搜索變量申明/** 寫在oncreate裏面 **/myMKSearch = new MKSearch(); //初始化。
3、設置回調函數
onGetPoiResult是POI搜索的回調函數。 在裏面設置了,若是查詢到結果,就將結果添加到地圖上。
myMKSearch.init(mBMapMan, new MKSearchListener(){ @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { if (result == null) { return; } PoiOverlay poioverlay = new PoiOverlay(SearchPOIActivity.this, mMapView); poioverlay.setData(result.getAllPoi()); mMapView.getOverlays().add(poioverlay); } @Override ...... }
不過,以爲百度地圖SDK在這裏有個很奇怪的地方。我明明只使用POI搜索啊,但是在回調函數裏,必需要寫出公交、駕車等的回調函數,即便是空的,也必須寫,否則就會報錯。以下圖:
一、把駕車回調函數註釋了,就報錯
二、必需要將其餘回調函數代碼補齊,纔不報錯。(總以爲,這個有點兒不合理……)
4、效果圖
5、其餘POI搜索接口
如下三個接口,選一個寫就能夠了。
//一、城市poi檢索 myMKSearch.poiSearchInCity("北京", "德莊火鍋"); //二、根據範圍和檢索詞發起範圍檢索|多關鍵詞poiMultiSearchInbounds myMKSearch.poiSearchInbounds("味多美",new GeoPoint((int) (39.863116 * 1E6), (int) (116.199024 * 1E6)),new GeoPoint((int) (39.90298 * 1E6), (int) (116.338728 * 1E6))); //三、中心點5000米內的KFC有多少|多關鍵詞poiMultiSearchNearBy myMKSearch.poiSearchNearBy("KFC", new GeoPoint((int) (39.920 * 1E6), (int) (116.410 * 1E6)), 5000);
6、關於佈局
這個教程的佈局和上一個教程保持不變,我就把按鈕的layout註釋了。
佈局的詳細代碼能夠參見上一個教程~
7、所有源代碼
package com.baidu.searchpoi; import android.app.Activity; import android.os.Bundle; /** 引入類 **/ import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.drawable.Drawable; import android.location.Location; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.GeoPoint; import com.baidu.mapapi.ItemizedOverlay; import com.baidu.mapapi.LocationListener; import com.baidu.mapapi.MKAddrInfo; import com.baidu.mapapi.MKBusLineResult; import com.baidu.mapapi.MKDrivingRouteResult; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.MKLocationManager; import com.baidu.mapapi.MKOLUpdateElement; import com.baidu.mapapi.MKOfflineMap; import com.baidu.mapapi.MKOfflineMapListener; import com.baidu.mapapi.MKPlanNode; 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.MyLocationOverlay; import com.baidu.mapapi.Overlay; import com.baidu.mapapi.OverlayItem; import com.baidu.mapapi.PoiOverlay; import com.baidu.mapapi.RouteOverlay; import com.baidu.mapapi.TransitOverlay; /** activity **/ public class SearchPOIActivity extends MapActivity { //申明變量 BMapManager mBMapMan = null; MapView mMapView = null; MKOfflineMap mOffline = null; //離線地圖變量 MapController mMapController = null; //縮放平移地圖 MKSearch myMKSearch = null; //POI搜索 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mBMapMan = new BMapManager(getApplication()); mBMapMan.init("4AA2949E616E069C37CDC3152E8C401A05A0035D", null); super.initMapActivity(mBMapMan); mMapView = (MapView) findViewById(R.id.bmapsView); mMapView.setBuiltInZoomControls(true); //設置啓用內置的縮放控件 mMapController = mMapView.getController(); // 獲得mMapView的控制權,能夠用它控制和驅動平移和縮放 //GeoPoint point = new GeoPoint((int) (39.93 * 1E6),(int) (116.42 * 1E6)); //用給定的經緯度構造一個GeoPoint,單位是微度 (度 * 1E6) GeoPoint point = new GeoPoint((int) (30.670007 * 1E6),(int) (104.092569 * 1E6)); mMapController.setCenter(point); //設置地圖中心點 mMapController.setZoom(13); //設置地圖zoom級別 //mMapView.getOverlays().add(new MyOverlay()); //添加覆蓋物 /** 離線地圖初始化 **/ mOffline = new MKOfflineMap(); mOffline.init(mBMapMan, new MKOfflineMapListener() { public void onGetOfflineMapState(int type, int state) { switch (type) { case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: { MKOLUpdateElement update = mOffline.getUpdateInfo(state); //mText.setText(String.format("%s : %d%%", update.cityName, update.ratio)); } break; case MKOfflineMap.TYPE_NEW_OFFLINE: Log.d("OfflineDemo", String.format("add offlinemap num:%d", state)); break; case MKOfflineMap.TYPE_VER_UPDATE: Log.d("OfflineDemo", String.format("new offlinemap ver")); break; } } } ); /** 離線地圖導入離線包 **/ int num = mOffline.scan(); //if (num != 0) mText.setText(String.format("已安裝%d個離線包", num)); /** POI搜索 **/ myMKSearch = new MKSearch(); /** 回調函數 **/ myMKSearch.init(mBMapMan, new MKSearchListener(){ @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { if (result == null) { return; } PoiOverlay poioverlay = new PoiOverlay(SearchPOIActivity.this, mMapView); poioverlay.setData(result.getAllPoi()); mMapView.getOverlays().add(poioverlay); mMapView.getController().animateTo(result.getPoi(0).pt); //手動設定地圖的中心點 mMapView.invalidate(); //手動刷新地圖 //疑問1,若是是外省,如何設置覆蓋物的最佳顯示區域?無viewport接口 //疑問2,爲什麼不能直接顯示搜索結果,要先點擊一下地圖?刷新地圖 } public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { } public void onGetTransitRouteResult(MKTransitRouteResult res, int error) { } public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { } public void onGetAddrResult(MKAddrInfo res, int error) { } public void onGetBusDetailResult(MKBusLineResult result, int iError) { } }); //一、城市poi檢索 //myMKSearch.poiSearchInCity("成都", "紅星路"); //二、根據範圍和檢索詞發起範圍檢索|多關鍵詞poiMultiSearchInbounds myMKSearch.poiSearchInbounds("味多美",new GeoPoint((int) (39.863116 * 1E6), (int) (116.199024 * 1E6)),new GeoPoint((int) (39.90298 * 1E6), (int) (116.338728 * 1E6))); //三、中心點5000米內的KFC有多少|多關鍵詞poiMultiSearchNearBy //myMKSearch.poiSearchNearBy("KFC", new GeoPoint((int) (39.920 * 1E6), (int) (116.410 * 1E6)), 5000); } @Override protected boolean isRouteDisplayed() { return false; } @Override protected void onDestroy() { if (mBMapMan != null) { mBMapMan.destroy(); mBMapMan = null; } super.onDestroy(); } @Override protected void onPause() { if (mBMapMan != null) { mBMapMan.stop(); } super.onPause(); } @Override protected void onResume() { if (mBMapMan != null) { mBMapMan.start(); } super.onResume(); }