先看執行后的圖吧:
POI(Point of Interest)。中文能夠翻譯為“興趣點”。在地理信息系統中。一個POI能夠是一棟房子、一個商鋪、一個郵筒、一個公交站等 具體:http://developer.baidu.com/map/sdkandev-4.htm
主要應用 MKSearch 類:
類 MKSearch
- java.lang.Object
- com.baidu.mapapi.search.MKSearch
-
public class MKSearch extends java.lang.Object
搜索服務.用於位置檢索、周邊檢索、范圍檢索、公交檢索、駕乘檢索、步行檢索
-
-
字段概要
限定符和類型 字段和說明 static int
EBUS_NO_SUBWAY
公交檢索策略常量:不含地鐵static int
EBUS_TIME_FIRST
公交檢索策略常量:時間優先static int
EBUS_TRANSFER_FIRST
公交檢索策略常量:最少換乘static int
EBUS_WALK_FIRST
公交檢索策略常量:最少步行距離static int
ECAR_AVOID_JAM
駕車策略: 躲避擁堵static int
ECAR_DIS_FIRST
駕乘檢索策略常量:最短距離static int
ECAR_FEE_FIRST
駕乘檢索策略常量:較少費用static int
ECAR_TIME_FIRST
駕乘檢索策略常量:時間優先static int
POI_DETAIL_SEARCH
poi具體信息檢索頁面static int
TYPE_AREA_MULTI_POI_LIST
多keyword范圍搜索、周邊搜索poi列表static int
TYPE_AREA_POI_LIST
范圍搜索、周邊搜索poi列表static int
TYPE_CITY_LIST
城市列表static int
TYPE_POI_LIST
城市內搜索poi列表
-
方法概要
限定符和類型 | 方法和說明 |
---|---|
int |
busLineSearch(java.lang.String city, java.lang.String busLineUid)
公交路線具體信息搜索 異步函數。返回結果在MKSearchListener里的onGetBusDetailResult方法通知
|
void |
destory()
銷毀MKSearch 模塊 , 當不再使用Search 功能時。須要調用此函數
|
int |
drivingSearch(java.lang.String startCity, MKPlanNode start, java.lang.String endCity, MKPlanNode end)
駕乘路線搜索.
|
int |
drivingSearch(java.lang.String startCity, MKPlanNode start, java.lang.String endCity, MKPlanNode end, java.util.List<MKWpNode> wpNodes)
駕車路線搜索,可設置途經點 異步函數。返回結果在MKSearchListener里的onGetDrivingRouteResult方法通知
|
int |
geocode(java.lang.String strAddr, java.lang.String city)
依據地址名獲取地址信息 異步函數,返回結果在MKSearchListener里的onGetAddrResult方法通知
|
int |
getPoiPageCapacity()
返回每頁容量
|
int |
goToPoiPage(int num)
獲取指定頁的的poi結果.
|
boolean |
init(BMapManager bmapMan, MKSearchListener listener)
初使化,使用完畢后。請調用 destroy 函數釋放資源
|
int |
poiDetailSearch(java.lang.String uid)
poi具體信息檢索
|
boolean |
poiDetailShareURLSearch(java.lang.String poiUid)
獲取POI信息共享短url.
|
boolean |
poiRGCShareURLSearch(GeoPoint location, java.lang.String name, java.lang.String address)
獲取地址信息共享短URL.
|
int |
poiSearchInbounds(java.lang.String key, GeoPoint ptLB, GeoPoint ptRT)
依據范圍和檢索詞發起范圍檢索.
|
int |
poiSearchInCity(java.lang.String city, java.lang.String key)
城市poi檢索.
|
int |
poiSearchNearBy(java.lang.String key, GeoPoint pt, int radius)
依據中心點、半徑與檢索詞發起周邊檢索.
|
int |
reverseGeocode(GeoPoint pt)
依據地理坐標點獲取地址信息 異步函數,返回結果在MKSearchListener里的onGetAddrResult方法通知
|
int |
setDrivingPolicy(int policy)
設置駕車路線規划策略.
|
void |
setPoiPageCapacity(int num)
設置每頁容量.
|
int |
setTransitPolicy(int policy)
設置路線規划策略.
|
int |
suggestionSearch(java.lang.String key, java.lang.String city)
聯想詞檢索,依據模糊的不完備的檢索詞返回精確的建議搜索詞 異步函數,返回結果在MKSearchListener里的onGetSuggestionResult方法通知
|
int |
transitSearch(java.lang.String city, MKPlanNode start, MKPlanNode end)
公交路線搜索.
|
int |
walkingSearch(java.lang.String startCity, MKPlanNode start, java.lang.String endCity, MKPlanNode end)
步行路線搜索.
|
通過上面的閱讀應該有所了解了吧,直接代碼了。
。
這里的代碼和前面(http://blog.csdn.net/majianjie/article/details/27958929)的代碼變化不大:
MainActivity.java
package com.majianjie.baidumap; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.MeasureSpec; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.map.LocationData; import com.baidu.mapapi.map.MKEvent; import com.baidu.mapapi.map.MKMapViewListener; import com.baidu.mapapi.map.MapController; import com.baidu.mapapi.map.MapPoi; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationOverlay; import com.baidu.mapapi.map.PoiOverlay; import com.baidu.mapapi.map.PopupClickListener; import com.baidu.mapapi.map.PopupOverlay; 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.MKShareUrlResult; 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; import com.example.baidumap.R; public class MainActivity extends Activity { //聲明控件 private Button request; private static StringBuilder sb = new StringBuilder(); private int i=1; private Toast mToast=null; private BMapManager mBMapManager=null; private MapView mMapView = null; //MapView 是地圖主控件 private MapController mMapController = null;//用MapController完畢地圖控制 private LocationClient mLocClient; public LocationData mLocData = null; private LocationOverlay myLocationOverlay = null;//定位圖層 private boolean isRequest = false;//是否手動觸發請求定位 private boolean isFirstLoc = true;//是否首次定位 private PopupOverlay mPopupOverlay = null;//彈出泡泡圖層。瀏覽節點時使用 private View viewCache=null; public BDLocation location = new BDLocation(); <span style="color:#ff6666;"> //POI private MKSearch mMKSearch = null; private Spinner detail; private List<String> poi; private ArrayAdapter< String> adapter; private String poiName="";</span> @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //**使用地圖sdk前需先初始化BMapManager。這個必須在setContentView()先初始化 mBMapManager = new BMapManager(this); //第一個參數是API key, 第二個參數是經常使用事件監聽,用來處理通常的網絡錯誤,授權驗證錯誤等,你也能夠不加入這個回調接口 mBMapManager.init("LDtH1sVwr7kygaF0aTqaVwWU", new MKGeneralListener() { //授權錯誤的時候調用的回調函數 @Override public void onGetPermissionState(int iError) { if (iError == MKEvent.ERROR_PERMISSION_DENIED) { showToast("API KEY錯誤, 請檢查!"); } } //一些網絡狀態的錯誤處理回調函數 @Override public void onGetNetworkState(int iError) { if (iError == MKEvent.ERROR_NETWORK_CONNECT) { Toast.makeText(getApplication(), "您的網絡出錯啦!", Toast.LENGTH_LONG).show(); } } }); //初始化 init(); //單擊事件 click(); } //* 顯示Toast消息 private void showToast(String msg){ if(mToast == null){ mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT); }else{ mToast.setText(msg); mToast.setDuration(Toast.LENGTH_SHORT); } mToast.show(); } private void click() { request.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { requestLocation(); } }); } @Override protected void onResume() { //MapView的生命周期與Activity同步。當activity掛起時需調用MapView.onPause() mMapView.onResume(); mBMapManager.start();//又一次啟動 mMKSearch.init(mBMapManager, new MySearchListener()); super.onResume(); } @Override protected void onPause() { //MapView的生命周期與Activity同步,當activity掛起時需調用MapView.onPause() mMapView.onPause(); super.onPause(); } private void init() { //使用自定義的title,注意順序 setContentView(R.layout.activity_main); //activity的布局 //這里是加入自定義的titlebtn.xml //通過id找到他們 mMapView = (com.baidu.mapapi.map.MapView) findViewById(R.id.bmapView); mMapController=mMapView.getController(); //獲取地圖控制器 mMapController.enableClick(true); //設置地圖是否響應點擊事件 request=(Button)findViewById(R.id.request); viewCache = LayoutInflater.from(this).inflate(R.layout.pop_layout, null); mPopupOverlay= new PopupOverlay(mMapView, new PopupClickListener() {// * 點擊彈出窗體圖層回調的方法 @Override public void onClickedPopup(int arg0) { //隱藏彈出窗體圖層 mPopupOverlay.hidePop(); } }); mMapController.enableClick(true); //* 設置地圖是否響應點擊事件 . mMapController.setZoom(12); // * 設置地圖縮放級別 mMapView.setBuiltInZoomControls(true); // * 顯示內置縮放控件 mMapView.setTraffic(true); <span style="color:#ff6666;"> //poi mMKSearch = new MKSearch(); detail=(Spinner)findViewById(R.id.detail); poi = new ArrayList<String>(); poi.add("請選擇"); poi.add("ATM"); poi.add("旅館"); poi.add("餐廳"); poi.add("公園"); poi.add("葯店"); poi.add("圖書館"); poi.add("景點"); poi.add("醫院"); poi.add("KFC"); poi.add("學校"); poi.add("超市"); </span> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,poi); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); detail.setAdapter(adapter); detail.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View v,int position, long id) { poiName=(parent.getSelectedItem().toString()); if(poiName.equals("請選擇")){} else{ mMKSearch.init(mBMapManager, new MySearchListener());//注意,MKSearchListener僅僅支持一個。以最后一次設置為准 mMKSearch.poiSearchNearBy(poiName, new GeoPoint((int) (39.907004 * 1E6), (int) (119.54048 * 1E6)), 5000); } } @Override public void onNothingSelected(AdapterView<?> arg0) {} }); mLocData = new LocationData(); mLocClient = new LocationClient(getApplicationContext()); // 定位SDK的核心類 //實例化定位服務。LocationClient類必須在主線程中聲明 mLocClient.registerLocationListener(new BDLocationListenerImpl());//注冊定位監聽接口 /** * 設置定位參數 */ LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); //打開GPRS option.setAddrType("all");//返回的定位結果包括地址信息 option.setCoorType("bd09ll");//返回的定位結果是百度經緯度,默認值gcj02 option.setScanSpan(5000); //設置發起定位請求的間隔時間為5000ms option.disableCache(false);//禁止啟用緩存定位 //option.setPoiNumber(5); //最多返回POI個數 //option.setPoiDistance(1000); //poi查詢距離 //option.setPoiExtraInfo(true); //是否須要POI的電話和地址等具體信息 mLocClient.setLocOption(option); mLocClient.start(); // 調用此方法開始定位 myLocationOverlay = new LocationOverlay(mMapView);//定位圖層初始化 //將定位數據設置到定位圖層里 myLocationOverlay.setMarker(getResources().getDrawable(R.drawable.set)); //加入定位圖層 mMapView.getOverlays().add(myLocationOverlay); myLocationOverlay.enableCompass(); //更新圖層數據運行刷新后生效 mMapView.refresh(); /* //准備要加入的Overlay double mLat1 = 39.910159; double mLon1 = 119.544697; // 用給定的經緯度構造GeoPoint,單位是微度 (度 * 1E6) GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6)); //准備overlay圖像數據,依據實情情況修復 Drawable mark= getResources().getDrawable(R.drawable.set); //用OverlayItem准備Overlay數據 OverlayItem item1 = new OverlayItem(p1,"item1","item1"); //使用setMarker()方法設置overlay圖片,假設不設置則使用構建ItemizedOverlay時的默認設置 //創建IteminizedOverlay CustomItemizedOverlay itemOverlay = new CustomItemizedOverlay(mark, mMapView); //將IteminizedOverlay加入到MapView中 mMapView.getOverlays().clear(); mMapView.getOverlays().add(itemOverlay); //如今全部准備工作已准備好,使用下面方法管理overlay. //加入overlay, 當批量加入Overlay時使用addItem(List<OverlayItem>)效率更高 itemOverlay.addItem(item1); //刪除overlay . //itemOverlay.removeItem(itemOverlay.getItem(0)); //mMapView.refresh(); //清除overlay // itemOverlay.removeAll(); // mMapView.refresh(); mMapView.refresh(); */ // mMapController.setCenter(p1); mMapView.regMapViewListener(mBMapManager, new MKMapViewListener() { // * 地圖移動完畢時會回調此接口 方法 @Override public void onMapMoveFinish() { //showToast("地圖移動完畢。"); } //* 地圖加載完畢回調此接口方法 @Override public void onMapLoadFinish() { showToast("地圖加載完畢!"); } //* 地圖完畢帶動畫的操作(如: animationTo())后。此回調被觸發 @Override public void onMapAnimationFinish() { } //當調用過 mMapView.getCurrentMap()后,此回調會被觸發 可在此保存截圖至存儲設備 @Override public void onGetCurrentMap(Bitmap arg0) { } //* 點擊地圖上被標記的點回調此方法 @Override public void onClickMapPoi(MapPoi arg0) { if (arg0 != null){ showToast(arg0.strText); } } }); } class MySearchListener implements MKSearchListener{ @Override public void onGetAddrResult(MKAddrInfo arg0, int arg1) {} @Override public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {} @Override public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {} @Override public void onGetPoiDetailSearchResult(int arg0, int arg1) {} @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { if (result == null) { return; } // 清除地圖上已有的全部覆蓋物 mMapView.getOverlays().clear(); // PoiOverlay是baidu map api提供的用於顯示POI的Overlay PoiOverlay poioverlay = new PoiOverlay(MainActivity.this, mMapView); // 設置搜索到的POI數據 poioverlay.setData(result.getAllPoi()); // 在地圖上顯示PoiOverlay(將搜索到的興趣點標注在地圖上) mMapView.getOverlays().add(poioverlay); if(result.getNumPois() > 0) { // 設置當中一個搜索結果所在地理坐標為地圖的中心 MKPoiInfo poiInfo = result.getPoi(0); mMapController.setCenter(poiInfo.pt); } // sb.append("共搜索到").append(result.getNumPois()).append("個POI\n"); sb.append("POI信息:").append("\n"); // 遍歷當前頁返回的POI(默認僅僅返回10個) for (MKPoiInfo poiInfo : result.getAllPoi()) { sb.append(i+" 名稱:").append(poiInfo.name).append("\n"); sb.append("地址:").append(poiInfo.address).append("\n"); i++; } // 通過AlertDialog顯示當前頁搜索到的POI new AlertDialog.Builder(MainActivity.this) .setTitle("搜索到的POI信息") .setMessage(sb.toString()) .setPositiveButton("關閉", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); sb.delete(0,sb.length()); i=1; } }).create().show(); } @Override public void onGetShareUrlResult(MKShareUrlResult arg0, int arg1,int arg2) {} @Override public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {} @Override /** * 公交換乘路線搜索結果 * * @param result 搜索結果 * @param iError 錯誤號(0表示正確返回) */ public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {} @Override /** * 步行路線搜索結果 * * @param result 搜索結果 * @param iError 錯誤號(0表示正確返回) */ public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {} } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); CreateMenu(menu); return true; } private void CreateMenu(Menu menu){ MenuItem mnu1 =menu.add(0,0,0,"顯示衛星地圖"); { mnu1.setAlphabeticShortcut('a');//設置快捷鍵 //mnu1.serIcon(R.drawable.icon);//設置圖片 } MenuItem mnu2 =menu.add(0,1,1,"顯示街道地圖"); { mnu2.setAlphabeticShortcut('b');//設置快捷鍵 //mnu1.serIcon(R.drawable.icon);//設置圖片 } MenuItem mnu3 =menu.add(0,2,2,"3D地圖"); { mnu3.setAlphabeticShortcut('c');//設置快捷鍵 //mnu1.serIcon(R.drawable.icon);//設置圖片 } } @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId() == 0){ mMapView.setSatellite(true); //設置顯示為衛星地圖: mMapView.setTraffic(false); }else if(item.getItemId() == 1){ mMapView.setTraffic(true); //顯示街道地圖 mMapView.setSatellite(false); }else if(item.getItemId() == 2){ //mMapView.se } return true; } public class BDLocationListenerImpl implements BDLocationListener { // * 接收異步返回的定位結果。參數是BDLocation類型參數 @Override public void onReceiveLocation(BDLocation location) { if (location == null) { return; } MainActivity.this.location = location; mLocData.latitude = location.getLatitude(); mLocData.longitude = location.getLongitude(); //假設不顯示定位精度圈,將accuracy賦值為0就可以 mLocData.accuracy = location.getRadius(); mLocData.direction = location.getDerect(); //將定位數據設置到定位圖層里 myLocationOverlay.setData(mLocData); //更新圖層數據運行刷新后生效 mMapView.refresh(); if(isFirstLoc || isRequest){ //將給定的位置點以動畫形式移動至地圖中心 mMapController.animateTo(new GeoPoint( (int) (location.getLatitude() * 1e6), (int) (location.getLongitude() * 1e6))); showPopupOverlay(location); //加載時候就彈出 isRequest = false; } isFirstLoc = false; } // 接收異步返回的POI查詢結果。參數是BDLocation類型參數 @Override public void onReceivePoi(BDLocation poiLocation) { } } private void requestLocation() { isRequest = true; if(mLocClient != null && mLocClient.isStarted()){ showToast("正在定位......"); mLocClient.requestLocation(); } } //繼承MyLocationOverlay重寫dispatchTap方法 private class LocationOverlay extends MyLocationOverlay{ public LocationOverlay(MapView arg0) { super(arg0); } // * 在“我的位置”坐標上處理點擊事件。 @Override protected boolean dispatchTap() { //點擊我的位置顯示PopupOverlay showPopupOverlay(location); return super.dispatchTap(); } @Override public void setMarker(Drawable arg0) { super.setMarker(arg0); } } @Override protected void onDestroy() { //MapView的生命周期與Activity同步,當activity銷毀時需調用MapView.destroy() mMapView.destroy(); //退出應用調用BMapManager的destroy()方法 if(mBMapManager != null){ mBMapManager.destroy(); mBMapManager = null; } //退出時銷毀定位 if (mLocClient != null){ mLocClient.stop(); } super.onDestroy(); } //* 顯示彈出窗體圖層PopupOverlay private void showPopupOverlay(BDLocation location){ TextView popText = ((TextView)viewCache.findViewById(R.id.location_tips)); popText.setText("[我的位置]\n" + location.getAddrStr()); mPopupOverlay.showPopup(getBitmapFromView(popText), new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)), 15); } // * 將View轉換成Bitmap的方法 public static Bitmap getBitmapFromView(View view) { view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); view.buildDrawingCache(); Bitmap bitmap = view.getDrawingCache(); return bitmap; } }
有關性能的優化,這里不多解說,正在學習中。
。。/呵呵