Android應用中使用百度地圖API之POI(三)


先看執行后的圖吧:



POI(Point of Interest)。中文能夠翻譯為“興趣點”。在地理信息系統中。一個POI能夠是一棟房子、一個商鋪、一個郵筒、一個公交站等  具體:http://developer.baidu.com/map/sdkandev-4.htm

主要應用 MKSearch 類:

com.baidu.mapapi.search

類 MKSearch

  • java.lang.Object
  • com.baidu.mapapi.search.MKSearch


  • public class MKSearch
    extends java.lang.Object
    搜索服務.

    用於位置檢索、周邊檢索、范圍檢索、公交檢索、駕乘檢索、步行檢索

方法概要

方法  
限定符和類型 方法和說明
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; } }



有關性能的優化,這里不多解說,正在學習中。

。。/呵呵



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM