先看執行后的圖吧:
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
搜索服務.
用于位置檢索、周邊檢索、范圍檢索、公交檢索、駕乘檢索、步行檢索
字段概要
字段
限定符和類型
字段和說明
static int
static int
static int
static int
公交檢索策略常量:最少步行距離
static int
static int
static int
static int
static int
static int
static int
static int
static int
方法概要
方法
限定符和類型
方法和說明
int
公交路線具體信息搜索 異步函數。返回結果在MKSearchListener里的onGetBusDetailResult方法通知
void
銷毀MKSearch 模塊 , 當不再使用Search 功能時。須要調用此函數
int
MKPlanNode?start,
java.lang.String?endCity,?MKPlanNode?end)
駕乘路線搜索.
int
MKPlanNode?start,
java.lang.String?endCity,?MKPlanNode?end,
java.util.List?wpNodes)
駕車路線搜索,可設置途經點 異步函數。返回結果在MKSearchListener里的onGetDrivingRouteResult方法通知
int
依據地址名獲取地址信息 異步函數,返回結果在MKSearchListener里的onGetAddrResult方法通知
int
獲取指定頁的的poi結果.
boolean
初使化,使用完畢后。請調用 destroy 函數釋放資源
int
poi具體信息檢索
boolean
獲取POI信息共享短url.
boolean
GeoPoint?location,
java.lang.String?name, java.lang.String?address)
獲取地址信息共享短URL.
int
依據范圍和檢索詞發起范圍檢索.
int
城市poi檢索.
int
GeoPoint?pt,
int?radius)
依據中心點、半徑與檢索詞發起周邊檢索.
int
依據地理坐標點獲取地址信息 異步函數,返回結果在MKSearchListener里的onGetAddrResult方法通知
int
設置駕車路線規劃策略.
void
int
設置路線規劃策略.
int
聯想詞檢索,依據模糊的不完備的檢索詞返回精確的建議搜索詞 異步函數,返回結果在MKSearchListener里的onGetSuggestionResult方法通知
int
MKPlanNode?start,?MKPlanNode?end)
公交路線搜索.
int
MKPlanNode?start,
java.lang.String?endCity,?MKPlanNode?end)
步行路線搜索.
通過上面的閱讀應該有所了解了吧,直接代碼了。
。
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();
//POI
private MKSearch mMKSearch = null;
private Spinner detail;
private List poi;
private ArrayAdapter< String> adapter;
private String poiName="";
@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);
//poi
mMKSearch = new MKSearch();
detail=(Spinner)findViewById(R.id.detail);
poi = new ArrayList();
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("超市");
adapter=new ArrayAdapter(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)效率更高
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;
}
}
有關性能的優化,這里不多解說,正在學習中。
。。/呵呵