先看執行后的圖吧:



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 intEBUS_NO_SUBWAY公交檢索策略常量:不含地鐵static intEBUS_TIME_FIRST公交檢索策略常量:時間優先static intEBUS_TRANSFER_FIRST公交檢索策略常量:最少換乘static intEBUS_WALK_FIRST公交檢索策略常量:最少步行距離static intECAR_AVOID_JAM駕車策略: 躲避擁堵static intECAR_DIS_FIRST駕乘檢索策略常量:最短距離static intECAR_FEE_FIRST駕乘檢索策略常量:較少費用static intECAR_TIME_FIRST駕乘檢索策略常量:時間優先static intPOI_DETAIL_SEARCHpoi具體信息檢索頁面static intTYPE_AREA_MULTI_POI_LIST多keyword范圍搜索、周邊搜索poi列表static intTYPE_AREA_POI_LIST范圍搜索、周邊搜索poi列表static intTYPE_CITY_LIST城市列表static intTYPE_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;
}
}
有關性能的優化,這里不多解說,正在學習中。
。。/呵呵
