轉載地址:http://www.cnblogs.com/rocomp/p/4994110.htmlphp
百度地圖移動版API(Android)是一套基於Android設備的應用程序接口,經過該接口,能夠輕鬆的訪問百度服務和數據,構建功能豐富、交互性強的地圖應用程序。
百度地圖移動版API不只包含構建地圖的基本接口,還提供了本地搜索、路線規劃、地圖定位等數據服務html
在Preference中能夠看到Android項目Eclipse默認的數字簽名SHA1java
切換到模擬器安裝目錄下輸入命令命令 "C:\Program Files\Java\jdk1.6.0_45\bin\keytool.exe" -list -v -keystoredebug.keystore
默認密碼是android
也能獲取數字簽名的SHA1node
4.添加權限android
<!-- 這個權限用於進行網絡定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <!-- 這個權限用於訪問GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <!-- 用於訪問wifi網絡信息,wifi信息會用於進行網絡定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <!-- 獲取運營商信息,用於支持提供運營商信息相關的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <!-- 這個權限用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <!-- 用於讀取手機當前的狀態--> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <!-- 寫入擴展存儲,向擴展卡寫入數據,用於寫入離線定位數據--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <!-- 訪問網絡,網絡定位須要上網--> <uses-permission android:name="android.permission.INTERNET" /> <!-- SD卡讀取權限,用戶寫入離線定位數據--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission> <!--容許應用讀取低級別的系統日誌文件 --> <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="33c6iZyFukuzDOg77Wk6wE2t"/>
public class HelloWorld extends Activity{ private static final String TAG ="HelloWorld"; private MapView mapView; private BaiduMap baiduMap; private double latitude = 40.050966;// 緯度 private double longitude = 116.303128;// 經度 private LatLng hmPos = new LatLng(latitude, longitude);// 座標 private MyBaiduSdkReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); intManager(); setContentView(R.layout.common); init(); } private void intManager() { receiver = new MyBaiduSdkReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR); filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); registerReceiver(receiver, filter); } private void init() { mapView = (MapView) findViewById(R.id.mapView); //BaiduMap管理具體的某一個MapView: 旋轉,移動,縮放,事件。。。 baiduMap = mapView.getMap(); //設置縮放級別,默認級別爲12 MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(19);; baiduMap.setMapStatus(mapstatusUpdate); //設置地圖中心點,默認是天安門 MapStatusUpdate mapstatusUpdatePoint = MapStatusUpdateFactory.newLatLng(hmPos); baiduMap.setMapStatus(mapstatusUpdatePoint ); //mapView.showScaleControl(false);//默認是true,顯示縮放按鈕 //mapView.showZoomControls(false);//默認是true,顯示比例尺 } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //旋轉,移動,縮放 switch (keyCode) { case KeyEvent.KEYCODE_1: //放大地圖縮放級別,每次放大一個級別 baiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn()); break; case KeyEvent.KEYCODE_2: //每次縮小一個級別 baiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut()); break; case KeyEvent.KEYCODE_3: //以一個點爲中心旋轉 //獲取地圖當前的狀態 MapStatus mapStatus = baiduMap.getMapStatus(); float rotate = mapStatus.rotate; Log.d(TAG, "rotate:" + rotate); //旋轉範圍 0-360 MapStatus newRotate = new MapStatus.Builder().rotate(rotate+30).build(); baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(newRotate)); break; case KeyEvent.KEYCODE_4: //以一條直線爲軸,旋轉 調整俯仰角 overlook //範圍 0-45 float overlook = baiduMap.getMapStatus().overlook; MapStatus overStatus = new MapStatus.Builder().overlook(overlook-5).build(); baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(overStatus)); break; case KeyEvent.KEYCODE_5: //移動 MapStatusUpdate moveStatusUpdate = MapStatusUpdateFactory.newLatLng(new LatLng(40.065796,116.349868)); //帶動畫的更新地圖狀態,仍是300毫秒 baiduMap.animateMapStatus(moveStatusUpdate); break; default: break; } return super.onKeyDown(keyCode, event); } @Override protected void onDestroy() { //卸載super的先後是沒有卻別的 mapView.onDestroy(); unregisterReceiver(receiver); super.onDestroy(); } @Override protected void onResume() { mapView.onResume(); super.onResume(); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); mapView.onPause(); } class MyBaiduSdkReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) { //網絡錯誤 Toast.makeText(getApplicationContext(), "無網絡", 0).show(); }else if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) { //key校驗失敗 Toast.makeText(getApplicationContext(), "校驗失敗", 0).show(); } } } }
什麼是地圖圖層
地圖能夠包含一個或多個圖層,每一個圖層在每一個級別都是由若干個圖塊組成的,他們覆蓋了地圖的整個表面。例如您所看到的包括街道、興趣點(POI)、學校、公園等內容的地圖展示就是一個圖層,另外交通留香的展示也是經過圖層來實現的。git
圖層分類
baiduMap.setTrafficEnabled(true)
baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE)
衛星地圖是衛星拍攝的真實的地理面貌(其實不少都是飛機航拍的,由於衛星拍照貴啊),因此衛星地圖可用來檢測地面的信息api
覆蓋物的成績壓蓋關係,具體以下(從下至上的順序):
1.基礎底圖(包括底圖、底圖道路、衛星圖等);
2.地形圖圖層(GroundOverlay);
3.熱力圖圖層(HeatMap);
4.實時路況圖圖層(BaiduMap.setTrafficEnabled(true););
5.百度城市熱力圖(BaiduMap.setBaiduHeatMapEnabled(true););
6.底圖標註(指的是底圖上面自帶的那些POI元素);
7.幾何圖形圖層(點、折線、弧線、圓、多邊形);
8.標註圖層(Marker),文字繪製圖層(Text);
9.指南針圖層(當地圖發生旋轉和視角變化時,默認出如今左上角的指南針);
10.定位圖層(BaiduMap.setMyLocationEnabled(true););
11.彈出窗圖層(InfoWindow);
12.自定義View(MapView.addView(View););服務器
切換地圖,交通圖,衛星圖,是否顯示實時交通markdown
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { //切換 地圖、交通圖、 衛星圖 switch (keyCode) { case KeyEvent.KEYCODE_1: //按1 設置顯示底圖 baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); break; case KeyEvent.KEYCODE_2: //衛星圖 baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); break; case KeyEvent.KEYCODE_3: //打開交通圖 baiduMap.setTrafficEnabled(true); break; } return super.onKeyDown(keyCode, event); }
全部疊加或覆蓋到地圖的內容,咱們琮琤爲地圖覆蓋物。如標註、矢量圖性元素(包括:折現和多邊形和圓),定位圖標等。覆蓋物擁有本身的地理座標,當您拖動或縮放地圖時,他們會嚮應的處理網絡
覆蓋物包括:本地覆蓋物和搜索覆蓋物
#### 本地覆蓋物的抽象基類:OverlayOptions(核心類)
弧線覆蓋物:ArcOptions
公交路線覆蓋物:BusLineOverlay
private void draw() { //定義一個圓 : 圓心+半徑 //1.建立本身 CircleOptions circleOptions = new CircleOptions(); //2.給本身設置數據 circleOptions.center(hmPos) //圓心 .radius(1000)//半徑 單位米 .fillColor(0x60ff0000)//填充色 .stroke(new Stroke(2,0x6000ff00));//邊框寬度和顏色 //3.把覆蓋物添加到地圖中 baiduMap.addOverlay(circleOptions); }
效果
添加文字覆蓋物
private void draw() { TextOptions textOptions = new TextOptions(); textOptions.fontColor(0x60ff0000)//設置字體顏色 .text("無良印品,窗前明月光")//文字內容 .position(hmPos)//位置 .fontSize(24)//字體大小 .typeface(Typeface.SERIF)//字體 .rotate(30);//旋轉 baiduMap.addOverlay(textOptions); }
效果
Marker覆蓋物
public class MarkerOptionsDemo extends BaseActivity { private View pop; private TextView title; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); draw(); //點擊某一個Marker,在腦殼上彈出pop initPop(); } private void draw() { BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.eat_icon); MarkerOptions markerOptions = new MarkerOptions(); markerOptions.position(hmPos)//設置位置 .icon(bitmapDescriptor)//設置覆蓋物小圖標 .draggable(true)//設置是否能夠拖拽,默認爲否 .title("中心");//設置標題 baiduMap.addOverlay(markerOptions); markerOptions = new MarkerOptions().title("向北") .position(new LatLng(latitude+0.001, longitude)) .icon(bitmapDescriptor); baiduMap.addOverlay(markerOptions); ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>(); bitmaps.add(bitmapDescriptor); bitmaps.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_geo)); markerOptions = new MarkerOptions().title("向東") .position(new LatLng(latitude, longitude+0.001)) .icons(bitmaps)//圖標設置一個幀動畫,多個圖片來回切換 .period(10);//切換幀的時間間隔 baiduMap.addOverlay(markerOptions); markerOptions = new MarkerOptions().title("向西南") .position(new LatLng(latitude-0.001, longitude-0.001)) .icon(bitmapDescriptor); baiduMap.addOverlay(markerOptions); baiduMap.setOnMarkerClickListener(new OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker result) { //當點擊時,更新pop的位置,設置爲顯示 MapViewLayoutParams layoutParams = new MapViewLayoutParams.Builder() .layoutMode(ELayoutMode.mapMode)//按照經緯度設置位置 .position(result.getPosition())//不能傳null .width(MapViewLayoutParams.WRAP_CONTENT) .height(MapViewLayoutParams.WRAP_CONTENT) .yOffset(-5)//距離position的像素 向下是正值,向上是負值 .build(); mapview.updateViewLayout(pop, layoutParams); pop.setVisibility(View.VISIBLE); title.setText(result.getTitle()); return true; } }); } private void initPop() { //加載pop 添加到mapview,設置爲隱藏 pop = View.inflate(getApplicationContext(), R.layout.pop, null); MapViewLayoutParams layoutParams = new MapViewLayoutParams.Builder() .layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)//按照經緯度設置位置 .position(hmPos)//不能傳null,設置爲mapMode時,必須設置position .width(MapViewLayoutParams.WRAP_CONTENT) .height(MapViewLayoutParams.WRAP_CONTENT) .build(); mapview.addView(pop, layoutParams); pop.setVisibility(View.INVISIBLE); title = (TextView) pop.findViewById(R.id.title); } }
百度地圖移動版API集成搜索服務,包括位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索
核心類
PoiSearch和OnGetPoiSearchResultListener RoutePlanSearch和OnGetRoutePlanResultListener
實現思路
注意,OnGetPoiSearchResultListener只支持一個,一最後一次設置爲準
結合覆蓋物展現搜索
本地搜索覆蓋物:PoiOverlay
駕車路線覆蓋物:DrivingRouteOverlay
步行路線覆蓋物:WalkingRouteOverlay
換乘路線覆蓋物:TransitOverlayPOI(Point of Interest興趣點)搜索有三種方式
根據範圍和檢索詞發起範圍檢索searchInBound
周邊檢索searchNearby
城市poi檢索searchInCity
poi詳細信息檢索 searchPoiDetail
結果的展現: PoiOverlay在OnGetPoiSearchResultListener的onGetPoiResult方法中處理搜索結果
翻頁功能從新調用經過PoiSearch類的searchInXxx()方法並傳遞頁數角標pageNum來實現,該方法是異步函數,搜索成功後會調用註冊的事件處理函數onGetPoiResult 返回查詢頁的結果
在必定範圍內搜索POI
/** * 範圍內搜索 * @author mwp * */ public class PoiSearchInBoundsDemo extends BaseActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); search(); } private void search() { PoiSearch poiSearch = PoiSearch.newInstance(); PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption(); LatLngBounds latLngBounds = new LatLngBounds.Builder() .include(new LatLng(40.049233, 116.302675))//東北的點 .include(new LatLng(40.050645, 116.303695))//西南的點 .build(); //由東北的點和西南的點兩個點肯定搜索的矩形範圍 boundSearchOption.bound(latLngBounds);//設置搜索範圍 boundSearchOption.keyword("加油站");//搜索關鍵字 poiSearch.searchInBound(boundSearchOption);// 只是把範圍能搜索到的poi設置爲 地圖的中心,同時會搜索到範圍外的poi poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult result) { if (result==null || result.error==ERRORNO.RESULT_NOT_FOUND) { Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } //搜索poi的覆蓋物 MyPoiOverlay overlay = new MyPoiOverlay(baiduMap); //把事件分發給overlay,overlay才能處理那個點擊事件 baiduMap.setOnMarkerClickListener(overlay); overlay.setData(result);//設置結果 overlay.addToMap();//把搜索的結果添加到地圖中 overlay.zoomToSpan();//縮放地圖,使全部overlay都在合適的視野內, 注: 該方法只對Marker類型的overlay有效 } @Override public void onGetPoiDetailResult(PoiDetailResult result) { } }); } class MyPoiOverlay extends PoiOverlay{ public MyPoiOverlay(BaiduMap arg0) { super(arg0); } @Override public boolean onPoiClick(int index) { //獲取搜索結果 PoiResult poiResult = getPoiResult(); //獲取點擊的那個poi的信息 PoiInfo poiInfo = poiResult.getAllPoi().get(index); String text = poiInfo.name+","+poiInfo.address; Toast.makeText(getApplicationContext(), text, 0).show(); return super.onPoiClick(index); } } }
搜索結果
周邊搜索
/**
* 周邊搜索
* @author mwp
*
*/
public class PoiSearchNearByDemo extends BaseActivity{ private PoiSearch poiSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); search(); } private void search() { poiSearch = PoiSearch.newInstance(); PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption(); nearbySearchOption.location(hmPos);//設置中心點 nearbySearchOption.radius(1000);//設置半徑 米 nearbySearchOption.keyword("加油站");//關鍵字 poiSearch.searchNearby(nearbySearchOption); poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult result) { if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){ Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } PoiOverlay overlay = new MyPoiOverlay(baiduMap);// 搜索poi的覆蓋物 baiduMap.setOnMarkerClickListener(overlay);// 把事件分發給overlay,overlay才能處理點擊事件 overlay.setData(result);// 設置結果 overlay.addToMap();// 把搜索的結果添加到地圖中 overlay.zoomToSpan();// 縮放地圖,使全部Overlay都在合適的視野內 注: 該方法只對Marker類型的overlay有效 } @Override public void onGetPoiDetailResult(PoiDetailResult result) { if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){ Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } String text = result.getAddress()+ "::" + result.getCommentNum() + result.getEnvironmentRating(); Toast.makeText(getApplicationContext(), text, 0).show(); } }); } class MyPoiOverlay extends PoiOverlay{ public MyPoiOverlay(BaiduMap arg0) { super(arg0); } @Override public boolean onPoiClick(int index) { PoiResult poiResult = getPoiResult(); PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 獲得點擊的那個poi信息 String text = poiInfo.name + "," + poiInfo.address; Toast.makeText(getApplicationContext(), text, 0).show(); PoiDetailSearchOption detailSearchOption = new PoiDetailSearchOption(); detailSearchOption.poiUid(poiInfo.uid);//設置poi的uid poiSearch.searchPoiDetail(detailSearchOption); return super.onPoiClick(index); } } }
搜索結果
城市內搜索
/**
* 城市內搜索
* @author mwp
*
*/
public class PoiSearchIncityDemo extends BaseActivity { private PoiSearch poiSearch; private int currentPageIndex = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); poiSearch = PoiSearch.newInstance(); search(); poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult result) { if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) { Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } String text = "共" + result.getTotalPageNum() + "頁,共" + result.getTotalPoiNum() + "條,當前第" + result.getCurrentPageNum() + "頁,當前頁" + result.getCurrentPageCapacity() + "條"; Toast.makeText(getApplicationContext(), text, 1).show(); baiduMap.clear();//清空地圖全部的Overlay覆蓋物以及InfoWindow PoiOverlay overlay = new MyPoiOverlay(baiduMap); baiduMap.setOnMarkerClickListener(overlay); overlay.setData(result); overlay.addToMap(); overlay.zoomToSpan(); } @Override public void onGetPoiDetailResult(PoiDetailResult arg0) { } }); } private void search() { PoiCitySearchOption citySearchOption = new PoiCitySearchOption(); citySearchOption.city("北京"); citySearchOption.keyword("加油站"); citySearchOption.pageNum(currentPageIndex); poiSearch.searchInCity(citySearchOption); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //每按一下數字鍵1就顯示下一頁的POI if (keyCode == KeyEvent.KEYCODE_1) { currentPageIndex++; search(); } return super.onKeyDown(keyCode, event); } class MyPoiOverlay extends PoiOverlay{ public MyPoiOverlay(BaiduMap arg0) { super(arg0); } @Override public boolean onPoiClick(int index) { PoiResult poiResult = getPoiResult(); PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 獲得點擊的那個poi信息 String text = poiInfo.name + "," + poiInfo.address; Toast.makeText(getApplicationContext(), text, 0).show(); return super.onPoiClick(index); } } }
自駕路線規劃
結果展現: DrivingRouteOverlay
步行路線規劃
步行路線查詢
結果展現: WalkingRouteOverlay
RoutePlanSearch. walkingSearch步行路線搜索.
結果處理: OnGetRoutePlanResultListener. onGetWalkingRouteResult(WalkingRouteResult result)
公交換乘路線規劃
結果展現:TransitRouteOverlay
檢索: RoutePlanSearch. transitSearch
經過TransitRoutePlanOption.policy (int policy) 設置路線規劃策略
結果處理: OnGetRoutePlanResultListener. onGetTransitRouteResult(TransitRouteResult result)
/** * 駕車路線 * @author mwp * */ public class DrivingRouteOverlayDemo extends BaseActivity { private RoutePlanSearch routePlanSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); search(); } private void search() { routePlanSearch = RoutePlanSearch.newInstance(); DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption(); PlanNode from = PlanNode.withLocation(hmPos);//窗前起點 PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));//建立終點 drivingOption.from(from);//設置起點 drivingOption.to(to);//設置終點 List<PlanNode> nodes = new ArrayList<PlanNode>(); nodes.add(PlanNode.withCityNameAndPlaceName("北京", "天安門")); drivingOption.passBy(nodes); drivingOption.policy(DrivingPolicy.ECAR_DIS_FIRST);//設置策略,駕乘檢索策略常量:最短距離 routePlanSearch.drivingSearch(drivingOption); routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() { @Override public void onGetWalkingRouteResult(WalkingRouteResult arg0) { } @Override public void onGetTransitRouteResult(TransitRouteResult arg0) { } // 自駕搜索結果回調 @Override public void onGetDrivingRouteResult(DrivingRouteResult result) { if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) { Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } DrivingRouteOverlay drivingOverlay = new MyDrivingOverlay(baiduMap); baiduMap.setOnMarkerClickListener(drivingOverlay); drivingOverlay.setData(result.getRouteLines().get(0));//設置線路爲搜索結果的第一條 drivingOverlay.addToMap(); drivingOverlay.zoomToSpan(); } }); } class MyDrivingOverlay extends DrivingRouteOverlay{ public MyDrivingOverlay(BaiduMap arg0) { super(arg0); } @Override public BitmapDescriptor getStartMarker() { // 覆寫此方法以改變默認起點圖標 return BitmapDescriptorFactory.fromResource(R.drawable.icon_st); } @Override public BitmapDescriptor getTerminalMarker() { // 覆寫此方法以改變默認終點圖標 return BitmapDescriptorFactory.fromResource(R.drawable.icon_en); } } }
搜索結果
步行線路規劃
/**
* 步行路線
* @author mwp
*
*/
public class WalkingRouteOverlayDemo extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); search(); } private void search() { RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance(); WalkingRoutePlanOption walkingOption = new WalkingRoutePlanOption(); PlanNode from = PlanNode.withLocation(hmPos);//建立起點 PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));// 建立終點 walkingOption.from(from); walkingOption.to(to); routePlanSearch.walkingSearch(walkingOption); routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() { @Override public void onGetWalkingRouteResult(WalkingRouteResult result) { if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) { Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } WalkingRouteOverlay overlay = new WalkingRouteOverlay(baiduMap); baiduMap.setOnMarkerClickListener(overlay); overlay.setData(result.getRouteLines().get(0)); overlay.addToMap(); overlay.zoomToSpan(); } @Override public void onGetTransitRouteResult(TransitRouteResult arg0) { } @Override public void onGetDrivingRouteResult(DrivingRouteResult arg0) { } }); } }
搜索結果
公交換乘規劃
/** * 公交換乘路線規劃 * @author mwp * */ public class TransitRouteOverlayDemo extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); search(); } private void search() { RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance(); TransitRoutePlanOption transitOption = new TransitRoutePlanOption(); PlanNode from = PlanNode.withLocation(hmPos);// 建立起點 PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));// 建立終點 transitOption.from(from); transitOption.to(to); transitOption.city("北京");//公交換乘只能在一個城市中,不能跨城市 transitOption.policy(TransitPolicy.EBUS_WALK_FIRST);//公交檢索策略常量:最少步行距離 routePlanSearch.transitSearch(transitOption); routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() { @Override public void onGetWalkingRouteResult(WalkingRouteResult arg0) { } @Override public void onGetTransitRouteResult(TransitRouteResult result) { if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) { Toast.makeText(getApplicationContext(), "未搜索到結果", 0).show(); return; } TransitRouteOverlay overlay = new TransitRouteOverlay(baiduMap); baiduMap.setOnMarkerClickListener(overlay); overlay.setData(result.getRouteLines().get(0)); overlay.addToMap(); overlay.zoomToSpan(); } @Override public void onGetDrivingRouteResult(DrivingRouteResult arg0) { } }); } class MyDrivingOverlay extends DrivingRouteOverlay{ public MyDrivingOverlay(BaiduMap arg0) { super(arg0); } @Override public BitmapDescriptor getStartMarker() { //覆寫此方法以改變默認起點圖標 return BitmapDescriptorFactory.fromResource(R.drawable.icon_st); } @Override public BitmapDescriptor getTerminalMarker() { //覆寫此方法以改變默認終點圖標 return BitmapDescriptorFactory.fromResource(R.drawable.icon_en); } } }
GeoCoder.geocode(GeoCodeOption option)
根據地址名獲取地址信息 異步函數,返回結果在OnGetGeoCoderResultListener裏的onGetGeoCodeResult方法通知
GeoCoder.reverseGeoCode(ReverseGeoCodeOption option)
根據地理座標點獲取地址信息 異步函數,返回結果在OnGetGeoCoderResultListener裏的onGetReverseGeoCodeResult方法通知
SuggestionSearch . requestSuggestion(SuggestionSearchOption option)
查詢一系列與指定key相關的內容,結果中包括城市及包含key的名稱
結果處理OnGetSuggestionResultListener . onGetSuggestionResult(SuggestionResult result)
在百度地圖移動版API中,提供一個重要的特點功能:定位,經過這個功能,能獲取到用戶當前所在位置。
在程序中,若是使用此功能,必須註冊GPS和網絡的使用權限。
在獲取用戶位置時,優先使用GPS進行定位;若是GPS定位沒有打開或者沒有可用位置信息,則會經過判斷網絡是否鏈接(即確認手機是否能上網,不管是鏈接 2G/3G或Wi-Fi網絡),若是是,則經過請求百度網絡定位服務,返回網絡定位結果。爲了使得到的網絡定位結果更加精確,請打開手機的Wi-Fi開 關。
目前系統自帶的網絡定位服務精度低,且服務不穩定、精度低,而且從將來的趨勢看,基站定位是不可控的(移動公司隨時可能更改基站編號以壟判定位服務),而 Wi-Fi定位則否則,它是一種精度更高、不受管制的定位方法。國內其它使用Wi-Fi定位的地圖軟件,Wi-Fi定位基本不可用,百度的定位服務量化指 標優秀,網絡接口返回速度快(服務端每次定位響應時間50毫秒之內),平均精度70米,其中Wi-Fi精度40米左右,基站定位精度200米左右,覆蓋率 98%,在國內處於一枝獨秀的地位。
注意
關於經緯度的說明:該經緯度信息是通過加密處理,因此在其它地圖工具中測得的經緯度 信息不適合百度的座標系統。
使用百度經緯度座標,能夠經過http://api.map.baidu.com/lbsapi/getpoint/index.html查詢地理座標若是須要在百度地圖上顯示使用其餘座標系統的位置,請發郵件至mapapi@baidu.com申請座標轉換接口http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0
/** * 定位 * * @author mwp * */ public class LocationDemo extends BaseActivity { private LocationClient locationClient; private BitmapDescriptor geo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); lacate(); } private void lacate() { locationClient = new LocationClient(getApplicationContext()); LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationMode.Hight_Accuracy);// 設置定位模式 option.setCoorType("bd0911");// 返回的定位結果是百度經緯度,默認值gcj02 option.setScanSpan(5000);// 設置發起定位請求的間隔時間爲5000ms option.setIsNeedAddress(true);// 返回的定位結果包含地址信息 option.setNeedDeviceDirect(true);// 返回的定位結果包含手機機頭的方向 locationClient.setLocOption(option); locationClient.registerLocationListener(new BDLocationListener() { @Override public void onReceiveLocation(BDLocation result) { if (result != null) { MyLocationData data = new MyLocationData.Builder() .latitude(result.getLatitude()) .longitude(result.getLongitude()).build(); baiduMap.setMyLocationData(data); } } }); geo = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo); MyLocationConfiguration configuration = new MyLocationConfiguration( MyLocationConfiguration.LocationMode.FOLLOWING, true, geo); baiduMap.setMyLocationConfigeration(configuration);// 設置定位模式 baiduMap.setMyLocationEnabled(true);// 打開定位圖層 } @Override protected void onStart() { locationClient.start(); super.onStart(); } @Override protected void onPause() { locationClient.stop(); super.onPause(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_1: //正常 baiduMap.setMyLocationConfigeration(new MyLocationConfiguration( MyLocationConfiguration.LocationMode.NORMAL, true, geo)); break; case KeyEvent.KEYCODE_2: //羅盤 baiduMap.setMyLocationConfigeration(new MyLocationConfiguration( MyLocationConfiguration.LocationMode.COMPASS, true, geo)); break; case KeyEvent.KEYCODE_3: //跟隨 baiduMap.setMyLocationConfigeration(new MyLocationConfiguration( MyLocationConfiguration.LocationMode.FOLLOWING, true, geo)); break; default: break; } return super.onKeyDown(keyCode, event); } }
離線文件下載
http://shouji.baidu.com/map/map.html?from=3052,指定機型和城市下載對應的離線地圖
/** 離線地圖初始化 **/ 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 offlinemapnum:%d", state)); break; case MKOfflineMap.TYPE_VER_UPDATE: Log.d("OfflineDemo", String.format("new offlinemapver")); break; } } } ); /** 離線地圖導入離線包 **/ intnum = mOffline.scan();