百度地圖實(shí)例開發(fā)


申請(qǐng)密鑰AndroidSDK:應(yīng)用程序包名+數(shù)字簽名

As查看數(shù)字簽名:cmd-----cd .android---------keytool -list -v-keystoredebug.keystore------密鑰口令是Android

其中keytool為jdk自帶工具;keystorefile為Android 簽名證書文件

Eclipse查看數(shù)字簽名:windows -> preferance ->android -> build

配置環(huán)境及發(fā)布

Android Studio工程配置方法

在工程app/libs目錄下放入baidumapapi_vX_X_X.jar包

在src/main/目錄下新建jniLibs目錄

91:A3:6B:83:0C:6F:CC:78:89:B8:89:80:40:A3:0A:2A:C5:E6:34:BE

1.1????Hello BaiduMap


xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.xys.baidumapapplication.MainActivity">

android:id="@+id/bmapView"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:clickable="true"/>

權(quán)限配置:


package="com.xys.baidumapapplication">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">


android:name="com.baidu.lbsapi.API_KEY"

android:value="wNQzIKaz9u7QQ6p734TfshyNFpaDl4gM"/>


添加用于實(shí)現(xiàn)定位的服務(wù)

-->

android:name="com.baidu.location.f"

android:enabled="true"

android:process=":remote">


App Indexing.? See https://g.co/AppIndexing/AndroidStudiofor more information. -->

android:name="com.google.android.gms.version"

android:value="@integer/google_play_services_version"/>

示例代碼:

public classMainActivityextendsActivity {

/*

*顯示基礎(chǔ)地圖,并提供key是否正確的驗(yàn)證

* */

MapViewmMapView=null;

privateBroadcastReceivermReceiver;

privateBaiduMapmBaiduMap;

@Override

protected voidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

//在使用SDK各組件之前初始化context信息,傳入ApplicationContext

//注意該方法要再setContentView方法之前實(shí)現(xiàn)

SDKInitializer.initialize(getApplicationContext());

setContentView(R.layout.activity_main);

//獲取地圖控件引用

mMapView= (MapView)findViewById(R.id.bmapView);

//注冊(cè)SDK廣播監(jiān)聽者

IntentFilteriFilter =newIntentFilter();

iFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK);//key正常

iFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);//key驗(yàn)證出錯(cuò)

iFilter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);//網(wǎng)絡(luò)出錯(cuò)

mReceiver=newSDKReceiver();

registerReceiver(mReceiver,iFilter);

//可以通過以下幾種方式實(shí)現(xiàn)地圖特殊顯示

mBaiduMap=mMapView.getMap();

//衛(wèi)星地圖

//mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);

//普通地圖

mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);

//空白地圖,基礎(chǔ)地圖瓦片將不會(huì)被渲染。在地圖類型中設(shè)置為NONE,將不會(huì)使用流量下載基礎(chǔ)地圖瓦片圖層。使用場(chǎng)景:與瓦片圖層一起使用,節(jié)省流量,提升自定義瓦片圖下載速度。

//mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);

//2.開啟交通圖

//mBaiduMap.setTrafficEnabled(true);

//3.開啟百度城市熱力圖

//mBaiduMap.setBaiduHeatMapEnabled(true);

//4、定義Maker坐標(biāo)點(diǎn),LatLng經(jīng)緯度封裝類

/**

*構(gòu)造方法參數(shù)

* 1、緯度

* 2、經(jīng)度

*/LatLng point =newLatLng(31.384289,121.497907);

//構(gòu)建Marker圖標(biāo)

BitmapDescriptorbitmap = BitmapDescriptorFactory

.fromResource(R.mipmap.icon_marka);

//構(gòu)建MarkerOption,用于在地圖上添加Marker

OverlayOptionsoption =newMarkerOptions()

.position(point)

.icon(bitmap)

.draggable(true);//設(shè)置手勢(shì)拖拽

//在地圖上添加Marker,并顯示,參數(shù)代表圖層對(duì)象

mBaiduMap.addOverlay(option);

//設(shè)置讓地圖的中心點(diǎn)移動(dòng)到某位置

MapStatus.Buildermb =newMapStatus.Builder();

mb.target(point);

mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mb.build()));

}

@Override

protected voidonDestroy() {

super.onDestroy();

//在activity執(zhí)行onDestroy時(shí)執(zhí)行mMapView.onDestroy(),實(shí)現(xiàn)地圖生命周期管理

mMapView.onDestroy();

}

@Override

protected voidonResume() {

super.onResume();

//在activity執(zhí)行onResume時(shí)執(zhí)行mMapView. onResume (),實(shí)現(xiàn)地圖生命周期管理

mMapView.onResume();

}

@Override

protected voidonPause() {

super.onPause();

//在activity執(zhí)行onPause時(shí)執(zhí)行mMapView. onPause (),實(shí)現(xiàn)地圖生命周期管理

mMapView.onPause();

}

/**

*構(gòu)造廣播監(jiān)聽類,監(jiān)聽SDK key驗(yàn)證以及網(wǎng)絡(luò)異常廣播

*/public classSDKReceiverextendsBroadcastReceiver{

public voidonReceive(Context context,Intent intent) {

String s = intent.getAction();

Log.d("","action:"+ s);

if(s.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {

Toast.makeText(MainActivity.this,"key驗(yàn)證出錯(cuò)!請(qǐng)?jiān)贏ndroidManifest.xml文件中檢查key設(shè)置",Toast.LENGTH_SHORT).show();

}else if(s

.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK)) {

Toast.makeText(MainActivity.this,"key驗(yàn)證成功!功能可以正常使用",Toast.LENGTH_SHORT).show();

}else if(s

.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {

Toast.makeText(MainActivity.this,"網(wǎng)絡(luò)出錯(cuò)",Toast.LENGTH_SHORT).show();

}

}

}

}

1.2????基礎(chǔ)地圖

1、地圖圖層

什么是地圖圖層?

地圖可以包含一個(gè)或多個(gè)圖層,每個(gè)圖層在每個(gè)級(jí)別都是由若干個(gè)圖塊組成的,它們覆蓋了地圖的整個(gè)表面。

例如您所看到包括街道、興趣點(diǎn)、學(xué)校、公園等內(nèi)容的地圖展現(xiàn)就是一個(gè)圖層。

目前百度地圖SDK所提供的地圖等級(jí)為3-19級(jí),所包含的信息有建筑物、道路、河流、學(xué)校、公園等內(nèi)容。

地圖覆蓋物

所有疊加或覆蓋到地圖的內(nèi)容,我們統(tǒng)稱為地圖覆蓋物

標(biāo)注、矢量圖形元素(包括:折線、多邊形和圓等)、定位圖標(biāo)等。

覆蓋物擁有自己的地理坐標(biāo),當(dāng)您拖動(dòng)或縮放地圖時(shí),它們會(huì)相應(yīng)的移動(dòng)。

覆蓋物按從下到上層次覆蓋關(guān)系

1、基礎(chǔ)底圖(包括底圖、底圖道路、衛(wèi)星圖等)

2、地形圖圖層(GroundOverlay)

3、熱力圖圖層(HeatMap)

4、實(shí)時(shí)路況圖圖層(BaiduMap.setTrafficEnabled(true);

5、百度城市熱力圖(BaiduMap.setBaiduHeatMapEnabled(true);

6、底圖標(biāo)注(指的是底圖上面自帶的那些POI元素)

7、幾何圖形圖層(點(diǎn)、折線、弧線、圓、多邊形)

8、標(biāo)注圖層(Marker),文字繪制圖層(Text)

9、指南針圖層(當(dāng)?shù)貓D發(fā)生旋轉(zhuǎn)和視角變化時(shí),默認(rèn)出現(xiàn)在左上角的指南針)

10、定位圖層(BaiduMap.setMyLocationEnabled(true);

11、彈出窗圖層(InfoWindow)

12、自定義View(MapView.addView(View);)

2、地圖類型

普通矢量地圖

mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);

衛(wèi)星地圖

mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);

實(shí)時(shí)交通圖

當(dāng)前,全國(guó)范圍內(nèi)已支持多個(gè)城市實(shí)時(shí)路況查詢,且會(huì)陸續(xù)開通其他城市。

開啟交通圖:mBaiduMap.setTrafficEnabled(true);

3、覆蓋物

開發(fā)者可根據(jù)自己實(shí)際的業(yè)務(wù)需求,利用標(biāo)注覆蓋物,在地圖指定的位置上添加標(biāo)注信息。

本地覆蓋物

本地覆蓋物的抽象基類:OverlayOptions

標(biāo)注覆蓋物(Marker

使用步驟

定義Marker坐標(biāo)點(diǎn)

LatLngpoint = new LatLng(39.963175, 116.400244);

構(gòu)建Marker圖標(biāo)

BitmapDescriptorbitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);

不用時(shí)及時(shí) recycle回收資源 :bitmap.recycle();

構(gòu)建MarkerOption,用于在地圖上添加Marker

OverlayOptionsoption = new MarkerOptions()

.position(point)// Marker的位置

.icon(bitmap);? // Marker的圖標(biāo)

.zIndex(9)? // 設(shè)置marker所在層級(jí)

.draggable(true);? // 設(shè)置手勢(shì)拖拽

在地圖上添加Marker,并顯示

mBaiduMap.addOverlay(option);

設(shè)置Marker的點(diǎn)擊事件

mBaiduMap.setOnMarkerClickListener(OnMarkerClickListener)

手勢(shì)拖拽的標(biāo)注

設(shè)置可拖拽

OverlayOptionsoptions = new MarkerOptions()

.position(pointA)? //設(shè)置marker的位置

.icon(bdA)? //設(shè)置marker圖標(biāo)

.zIndex(9)? //設(shè)置marker所在層級(jí)(默認(rèn):12)

.draggable(true);? //設(shè)置手勢(shì)拖拽

將Marker添加到地圖上

marker= (Marker) (mBaiduMap.addOverlay(options));

設(shè)置marker拖拽的監(jiān)聽

BaiduMap.setOnMarkerDragListener(OnMarkerDragListener)

動(dòng)畫效果的Marker

注:自v3.3.0版本起,SDK提供了給Marker增加動(dòng)畫的能力

實(shí)例化ArrayList,增加動(dòng)畫相關(guān)的圖片資源

通過MarkerOptions的icons設(shè)置動(dòng)畫的一組圖片資源,再通過period設(shè)置多少幀刷新一次圖片資源

幾何圖形覆蓋物

點(diǎn)(Dot): DotOptions

折線(Polyline):PolylineOptions

弧線(Arc):ArcOptions

圓(Circle):CircleOptions

多邊形(Polygon):PolygonOptions

文字覆蓋物:TextOptions

彈出窗覆蓋物:InfoWindow

地形圖圖層:GroundOverlay

搜索覆蓋物

顯示和管理多個(gè)Overlay的基類:OverlayManager

POI本地搜索覆蓋物:PoiOverlay

公交信息覆蓋物:BusLineOverlay

換乘線路覆蓋物:TransitRouteOverlay

駕車路線覆蓋物:DrivingRouteOverlay

步行路線覆蓋物:WalkingRouteOverlay

1.3????POI檢索---興趣點(diǎn)搜索

POI檢索

POI(Point ofInterest),中文可以翻譯為“興趣點(diǎn)”。在地理信息系統(tǒng)中,一個(gè)POI可以是一棟房子、一個(gè)商鋪、一個(gè)郵筒、一個(gè)公交站等。

百度地圖SDK提供三種類型的POI檢索

周邊檢索

區(qū)域檢索

城市內(nèi)檢索

importcom.xys.utlis.PoiOverlay;

importJava.util.List;

/**

* Created by xuyangsheng on 2015/4/3.

*/public classPointSearchActivityextendsActivity {

/*

*實(shí)現(xiàn)興趣點(diǎn)檢索的功能

*如:搜索上海內(nèi)所有KFC

*或者自身周邊10000米范圍內(nèi)的KFC

*并且將搜索結(jié)果顯示到MapView上

* */

privateMapViewmMapView;

privateBaiduMapmBaiduMap;

privatePoiSearchmPoiSearch;

@Override

protected voidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

//在使用SDK各組件之前初始化context信息,傳入ApplicationContext

//注意該方法要再setContentView方法之前實(shí)現(xiàn)

SDKInitializer.initialize(getApplicationContext());

setContentView(R.layout.activity_search);

mMapView= (MapView)this.findViewById(R.id.mapView);

Log.i("===","=====onCreate mapView"+mMapView);

mBaiduMap=mMapView.getMap();

//第一步,創(chuàng)建POI檢索實(shí)例

mPoiSearch= PoiSearch.newInstance();

//第二步,設(shè)置POI檢索監(jiān)聽者

mPoiSearch.setOnGetPoiSearchResultListener(newOnGetPoiSearchResultListener(){

/***

*當(dāng)調(diào)用searchInCity,searchNearby,seachInBound方法

*得到搜索結(jié)果之后調(diào)用的方法

*@parampoiResult參數(shù)代表搜索的結(jié)果

*/@Override

public voidonGetPoiResult(PoiResultpoiResult) {

//滿足if條件時(shí),代表地圖成功搜索出結(jié)果

if(poiResult.error==SearchResult.ERRORNO.NO_ERROR){

//將搜索結(jié)果輸出

Log.i("===","======上海市共有的KFC的個(gè)數(shù)為:"+poiResult.getTotalPoiNum());

Listlist = poiResult.getAllPoi();

for(PoiInfo pi : list) {??? Log.i("====","===該poi點(diǎn)的地址信息為:"+ pi.address+"? "+ pi.name);}//將搜索結(jié)果顯示到地圖上//清除地圖上顯示的內(nèi)容mBaiduMap.clear();//創(chuàng)建PoiOverlay,即顯示搜索結(jié)果的圖層/*

*注:如果后期需要設(shè)置poi點(diǎn)的點(diǎn)擊事件,那么就需要通過new

*子類的方式獲取PoiOverlay對(duì)象*如果后期不需要設(shè)置poi點(diǎn)的點(diǎn)擊事件,那么也可以直接* new PoiOverlay對(duì)象* */PoiOverlayoverlay =newMyPointOverlay(mBaiduMap);//設(shè)置overlay可以處理標(biāo)注點(diǎn)擊事件mBaiduMap.setOnMarkerClickListener(overlay);//設(shè)置PoiOverlay數(shù)據(jù)overlay.setData(poiResult);//添加PoiOverlay到地圖中overlay.addToMap();//讓地圖自動(dòng)縮放,滿足讓所有的結(jié)果點(diǎn)都顯示到屏幕上overlay.zoomToSpan();}

}//當(dāng)通過searchPoiDetail方法查詢指定poi點(diǎn)的詳細(xì)信息,得到結(jié)果后運(yùn)行此方法@Overridepublic voidonGetPoiDetailResult(PoiDetailResult poiDetailResult) {??????????????? Log.i("===","======? poi的名稱和營(yíng)業(yè)時(shí)間:"+poiDetailResult.getName()+"? "+poiDetailResult.getShopHours());}

});MapStatus.Builder mb =newMapStatus.Builder();mb.target(newLatLng(31.384289,121.497907));mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mb.build()));}/**

*處理按鈕點(diǎn)擊事件*/public voidclick(View v){switch(v.getId()) {caseR.id.button://第三步,發(fā)起檢索請(qǐng)求mPoiSearch.searchInCity(newPoiCitySearchOption()

.city("上海")//設(shè)置在哪個(gè)城市范圍內(nèi)進(jìn)行搜索.keyword("KFC")//設(shè)置搜索關(guān)鍵字.pageCapacity(8)//設(shè)置每頁(yè)容量,默認(rèn)為每頁(yè)10條.pageNum(10)//分頁(yè)編號(hào));

break;

caseR.id.button2:mPoiSearch.searchNearby(newPoiNearbySearchOption()

.keyword("蘭州拉面")//搜索關(guān)鍵字.location(newLatLng(31.384289,121.497907))//設(shè)置搜索的中心點(diǎn).radius(10000)//設(shè)置搜索半徑);

break;}

}/**

*創(chuàng)建一個(gè)用于顯示搜索結(jié)果的圖層的子類*/private classMyPointOverlayextendsPoiOverlay{publicMyPointOverlay(BaiduMap baiduMap){super(baiduMap);}//當(dāng)poi點(diǎn)被點(diǎn)擊時(shí)運(yùn)行的方法@Overridepublic booleanonPoiClick(intindex) {super.onPoiClick(index);PoiInfo poiInfo = getPoiResult().getAllPoi().get(index);//可以通過方法搜索指定poi點(diǎn)的詳細(xì)信息mPoiSearch.searchPoiDetail(newPoiDetailSearchOption().poiUid(poiInfo.uid));

return true;}

}@Overrideprotected voidonDestroy() {super.onDestroy();//在activity執(zhí)行onDestroy時(shí)執(zhí)行mMapView.onDestroy(),實(shí)現(xiàn)地圖生命周期管理mMapView.onDestroy();}@Overrideprotected voidonResume() {super.onResume();//在activity執(zhí)行onResume時(shí)執(zhí)行mMapView. onResume (),實(shí)現(xiàn)地圖生命周期管理mMapView.onResume();}@Overrideprotected voidonPause() {super.onPause();//在activity執(zhí)行onPause時(shí)執(zhí)行mMapView. onPause (),實(shí)現(xiàn)地圖生命周期管理mMapView.onPause();}

}

1.4????路徑規(guī)劃

/**

* Created by xuyangsheng on 2015/4/3.

*用于實(shí)現(xiàn)地圖的路徑規(guī)劃功能

*/public classRoutePlanActivityextendsActivity {

privateMapViewmMapView;

BaiduMapmBaiduMap;

//用于進(jìn)行路徑規(guī)劃的檢索類

privateRoutePlanSearchmSearch;

privateWalkingRouteResultwalkingRouteResult;

@Override

protected voidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

//在使用SDK各組件之前初始化context信息,傳入ApplicationContext

//注意該方法要再setContentView方法之前實(shí)現(xiàn)

SDKInitializer.initialize(getApplicationContext());

setContentView(R.layout.activity_route);

mMapView= (MapView)findViewById(R.id.bmapViewa);

mBaiduMap=mMapView.getMap();

LatLng point =newLatLng(31.384289,121.497907);

//構(gòu)建Marker圖標(biāo)

BitmapDescriptorbitmap = BitmapDescriptorFactory

.fromResource(R.mipmap.icon_marka);

//構(gòu)建MarkerOption,用于在地圖上添加Marker

OverlayOptionsoption =newMarkerOptions()

.position(point)

.icon(bitmap)

.draggable(true);//設(shè)置手勢(shì)拖拽

//在地圖上添加Marker,并顯示,參數(shù)代表圖層對(duì)象

mBaiduMap.addOverlay(option);

//將地圖中心移動(dòng)到寶山區(qū)

finalMapStatus.Buildermb =newMapStatus.Builder();

mb.target(point);

mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mb.build()));

//1.創(chuàng)建公交線路規(guī)劃?rùn)z索實(shí)例

mSearch=RoutePlanSearch.newInstance();

//2.設(shè)置公交線路規(guī)劃?rùn)z索監(jiān)聽者

mSearch.setOnGetRoutePlanResultListener(newOnGetRoutePlanResultListener(){

//當(dāng)?shù)玫讲叫新肪€時(shí)運(yùn)行此方法

@Override

public voidonGetWalkingRouteResult(WalkingRouteResultwalkingRouteResult) {

Log.i("===","====? getwalking "+walkingRouteResult.error);

if(walkingRouteResult.error==SearchResult.ERRORNO.NO_ERROR) {

Log.i("===","===本次步行的總距離和預(yù)計(jì)總時(shí)長(zhǎng)為:"+walkingRouteResult.getRouteLines().get(0).getDistance()+"? "+walkingRouteResult.getRouteLines().get(0).getDuration());

RoutePlanActivity.this.walkingRouteResult= walkingRouteResult;

/*

*獲取第一種步行路線

* */

WalkingRouteLineline = walkingRouteResult.getRouteLines().get(0);

//獲取該種步行方式的所有行進(jìn)路段

Liststeps = line.getAllStep();

for(WalkingRouteLine.WalkingStepstep : steps) {

//獲取路段整體指示信息

Log.i("====","=====? "+step.getInstructions());

}

mBaiduMap.clear();

WalkingRouteOverlayoverlay =newMyWalking(mBaiduMap);

mBaiduMap.setOnMarkerClickListener(overlay);

overlay.setData(walkingRouteResult.getRouteLines().get(0));

overlay.addToMap();

overlay.zoomToSpan();

}

}

//當(dāng)獲得公交路線時(shí)運(yùn)行的方法

@Override

public voidonGetTransitRouteResult(TransitRouteResulttransitRouteResult) {

if(transitRouteResult.error==SearchResult.ERRORNO.NO_ERROR) {

Log.i("===","===本次步行的總距離和預(yù)計(jì)總時(shí)長(zhǎng)為:"+transitRouteResult.getRouteLines().get(0).getDistance()+"? "+transitRouteResult.getRouteLines().get(0).getDuration());

TransitRouteLineline = transitRouteResult.getRouteLines().get(0);

Liststeps = line.getAllStep();

for(TransitRouteLine.TransitStepstep : steps) {

//獲取路段整體指示信息

Log.i("====","=====? "+step.getInstructions());

}

mBaiduMap.clear();

TransitRouteOverlayoverlay =newMyTransit(mBaiduMap);

mBaiduMap.setOnMarkerClickListener(overlay);

overlay.setData(transitRouteResult.getRouteLines().get(0));

overlay.addToMap();

overlay.zoomToSpan();

}

}

//當(dāng)獲得駕車路線時(shí)運(yùn)行的方法

@Override

public voidonGetDrivingRouteResult(DrivingRouteResultdrivingRouteResult) {

if(drivingRouteResult.error==SearchResult.ERRORNO.NO_ERROR) {

Log.i("===","===本次步行的總距離和預(yù)計(jì)總時(shí)長(zhǎng)為:"+drivingRouteResult.getRouteLines().get(0).getDistance()+"? "+drivingRouteResult.getRouteLines().get(0).getDuration());

/*

*獲取第一種步行路線

* */

DrivingRouteLineline = drivingRouteResult.getRouteLines().get(0);

//獲取該種步行方式的所有行進(jìn)路段

Liststeps = line.getAllStep();

for(DrivingRouteLine.DrivingStepstep : steps) {

//獲取路段整體指示信息

Log.i("====","=====? "+step.getInstructions());

}

mBaiduMap.clear();

DrivingRouteOverlayoverlay =newMyDriving(mBaiduMap);

mBaiduMap.setOnMarkerClickListener(overlay);

overlay.setData(drivingRouteResult.getRouteLines().get(0));

overlay.addToMap();

overlay.zoomToSpan();

}

}

//當(dāng)獲得騎行路線時(shí)運(yùn)行的方法

@Override

public voidonGetBikingRouteResult(BikingRouteResultbikingRouteResult) {

if(bikingRouteResult.error==SearchResult.ERRORNO.NO_ERROR) {

Log.i("===","===本次步行的總距離和預(yù)計(jì)總時(shí)長(zhǎng)為:"+ bikingRouteResult.getRouteLines().get(0).getDistance()+"? "+bikingRouteResult.getRouteLines().get(0).getDuration());

/*

*獲取第一種步行路線

* */

BikingRouteLineline = bikingRouteResult.getRouteLines().get(0);

//獲取該種步行方式的所有行進(jìn)路段

Liststeps = line.getAllStep();

for(BikingRouteLine.BikingStepstep : steps) {

//獲取路段整體指示信息

Log.i("====","=====? "+step.getInstructions());

}

mBaiduMap.clear();

BikingRouteOverlayoverlay =newMyBiking(mBaiduMap);

mBaiduMap.setOnMarkerClickListener(overlay);

overlay.setData(bikingRouteResult.getRouteLines().get(0));

overlay.addToMap();

overlay.zoomToSpan();

}

}

});

}

public voidclick(View v) {

//通過經(jīng)緯度獲取起點(diǎn)PlanNode對(duì)象

PlanNode start =PlanNode.withLocation(newLatLng(31.384289,121.497907));

//通過城市名稱和地址名稱獲取PlanNode對(duì)象

PlanNode end =PlanNode.withCityNameAndPlaceName("上海","虹口足球場(chǎng)地鐵站");

switch(v.getId()) {

caseR.id.button3://公交

mSearch.transitSearch(newTransitRoutePlanOption()

.city("上海")//設(shè)置城市信息

.from(start)//設(shè)置起點(diǎn)信息

.to(end)//設(shè)置終點(diǎn)信息

.policy(TransitRoutePlanOption.TransitPolicy.EBUS_TIME_FIRST)//設(shè)置換成策略,如時(shí)間最短,步行最少等

);

break;

caseR.id.button4://駕車

mSearch.drivingSearch(newDrivingRoutePlanOption()

.from(start)

.to(end)

.policy(DrivingRoutePlanOption.DrivingPolicy.ECAR_AVOID_JAM)//設(shè)置駕車策略,如時(shí)間最少,避免擁堵等

.trafficPolicy(DrivingRoutePlanOption.DrivingTrafficPolicy.ROUTE_PATH_AND_TRAFFIC)//設(shè)置是否支持路況數(shù)據(jù)

);

break;

caseR.id.button5://步行

mSearch.walkingSearch(newWalkingRoutePlanOption()

.from(start)//設(shè)置起點(diǎn)

.to(end));//設(shè)置終點(diǎn)

break;

caseR.id.button6://騎行

mSearch.bikingSearch(newBikingRoutePlanOption()

.from(start)

.to(end)

);

break;

}

}

//自定義步行圖層的子類

classMyWalkingextendsWalkingRouteOverlay{

publicMyWalking(BaiduMapbaiduMap) {

super(baiduMap);

}

//通過返回值控制起點(diǎn)圖標(biāo)的顯示

@Override

publicBitmapDescriptorgetStartMarker() {

returnBitmapDescriptorFactory.fromResource(R.mipmap.icon_st);

}

//通過返回值控制終點(diǎn)圖標(biāo)的顯示

@Override

publicBitmapDescriptorgetTerminalMarker() {

returnBitmapDescriptorFactory.fromResource(R.mipmap.icon_en);

}

//當(dāng)路徑中的節(jié)點(diǎn)被點(diǎn)擊時(shí)運(yùn)行的方法

@Override

public booleanonRouteNodeClick(inti) {

WalkingRouteLine.WalkingStepselect =walkingRouteResult.getRouteLines().get(0).getAllStep().get(i);

Toast.makeText(RoutePlanActivity.this,"--"+select.getInstructions(),Toast.LENGTH_SHORT).show();

return true;

}

}

classMyTransitextendsTransitRouteOverlay{

/**

*構(gòu)造函數(shù)

*

*@parambaiduMap該TransitRouteOverlay引用的BaiduMap對(duì)象

*/publicMyTransit(BaiduMapbaiduMap) {

super(baiduMap);

}

//通過返回值控制起點(diǎn)圖標(biāo)的顯示

@Override

publicBitmapDescriptorgetStartMarker() {

returnBitmapDescriptorFactory.fromResource(R.mipmap.icon_st);

}

//通過返回值控制終點(diǎn)圖標(biāo)的顯示

@Override

publicBitmapDescriptorgetTerminalMarker() {

returnBitmapDescriptorFactory.fromResource(R.mipmap.icon_en);

}

}

classMyDrivingextendsDrivingRouteOverlay{

/**

*構(gòu)造函數(shù)

*

*@parambaiduMap該TransitRouteOverlay引用的BaiduMap對(duì)象

*/publicMyDriving(BaiduMapbaiduMap) {

super(baiduMap);

}

//通過返回值控制起點(diǎn)圖標(biāo)的顯示

@Override

publicBitmapDescriptorgetStartMarker() {

returnBitmapDescriptorFactory.fromResource(R.mipmap.icon_st);

}

//通過返回值控制終點(diǎn)圖標(biāo)的顯示

@Override

publicBitmapDescriptorgetTerminalMarker() {

returnBitmapDescriptorFactory.fromResource(R.mipmap.icon_en);

}

}

classMyBikingextendsBikingRouteOverlay{

/**

*構(gòu)造函數(shù)

*

*@parambaiduMap該TransitRouteOverlay引用的BaiduMap對(duì)象

*/publicMyBiking(BaiduMapbaiduMap) {

super(baiduMap);

}

//通過返回值控制起點(diǎn)圖標(biāo)的顯示

@Override

publicBitmapDescriptorgetStartMarker() {

returnBitmapDescriptorFactory.fromResource(R.mipmap.icon_st);

}

//通過返回值控制終點(diǎn)圖標(biāo)的顯示

@Override

publicBitmapDescriptorgetTerminalMarker() {

returnBitmapDescriptorFactory.fromResource(R.mipmap.icon_en);

}

}

@Override

protected voidonDestroy() {

super.onDestroy();

//在activity執(zhí)行onDestroy時(shí)執(zhí)行mMapView.onDestroy(),實(shí)現(xiàn)地圖生命周期管理

mMapView.onDestroy();

}

@Override

protected voidonResume() {

super.onResume();

//在activity執(zhí)行onResume時(shí)執(zhí)行mMapView. onResume (),實(shí)現(xiàn)地圖生命周期管理

mMapView.onResume();

}

@Override

protected voidonPause() {

super.onPause();

//在activity執(zhí)行onPause時(shí)執(zhí)行mMapView. onPause (),實(shí)現(xiàn)地圖生命周期管理

mMapView.onPause();

}

}

1.5????百度地圖定位

/**

* Created by xuyangsheng on 2015/4/4.

*實(shí)現(xiàn)地圖的定位功能

*/public classLocationActivityextendsActivity {

privateMapViewmMapView;

privateBaiduMapmBaiduMap;

private booleanisFirstLoc=true;

privateBitmapDescriptormCurrentMarker;

privateLocationClientmLocationClient;

@Override

protected voidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

SDKInitializer.initialize(getApplicationContext());

setContentView(R.layout.activity_location);

mMapView= (MapView)this.findViewById(R.id.l_bampView);

mBaiduMap=mMapView.getMap();

//開啟定位圖層

mBaiduMap.setMyLocationEnabled(true);

mCurrentMarker=BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka);

mBaiduMap.setMyLocationConfigeration(newMyLocationConfiguration(

MyLocationConfiguration.LocationMode.COMPASS,true,mCurrentMarker

));

//1、初始化LocationClient類

mLocationClient=newLocationClient(getApplicationContext());//聲明LocationClient

//2、注冊(cè)定位的監(jiān)聽事件

mLocationClient.registerLocationListener(newBDLocationListener(){

/**

*當(dāng)獲取得到定位結(jié)果時(shí),就會(huì)運(yùn)行此方法

*參數(shù)代表當(dāng)前定位到的位置信息

*/@Override

public voidonReceiveLocation(BDLocationbdLocation) {

Log.i("===","=====當(dāng)前定位到的經(jīng)緯度為:"+bdLocation.getLongitude()+" "+bdLocation.getLatitude());

Log.i("===","=====當(dāng)前位置的地址信息為:"+bdLocation.getAddrStr()+" "+bdLocation.getAddress());

MyLocationData? locData =newMyLocationData.Builder()

.accuracy(bdLocation.getRadius())

//此設(shè)置開發(fā)者獲取到的方向信息,順時(shí)針0-360

.direction(100).latitude(bdLocation.getLatitude())

.longitude(bdLocation.getLongitude()).build();

mBaiduMap.setMyLocationData(locData);

if(isFirstLoc){

isFirstLoc=false;

LatLng ll =newLatLng(bdLocation.getLatitude(),

bdLocation.getLongitude());

MapStatus.Builderbuilder =newMapStatus.Builder();

builder.target(ll).zoom(18.0f);

mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));

}

}

});

//3、配置定位SDK參數(shù)

initLocation();

//開始定位

mLocationClient.start();

}

private voidinitLocation(){

LocationClientOption option =newLocationClientOption();

//可選,默認(rèn)高精度,設(shè)置定位模式,高精度、低功耗、僅設(shè)備

option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);

option.setCoorType("bd0911");//可選,默認(rèn)gcj02,設(shè)置返回的定位結(jié)果坐標(biāo)系

intspan =1000;

option.setScanSpan(span);//可選,默認(rèn)0,即僅定位一次,設(shè)置發(fā)起定位請(qǐng)求的間隔需要大于等于1000ms才是有效的

option.setIsNeedAddress(true);//可選,設(shè)置是否需要地址信息,默認(rèn)不需要

option.setOpenGps(true);//可選,默認(rèn)false,設(shè)置是否使用gps

option.setLocationNotify(true);//可選,默認(rèn)false,設(shè)置是否當(dāng)gps有效時(shí)按照1S1次頻率輸出GPS結(jié)果

option.setIsNeedLocationDescribe(true);//可選,默認(rèn)false,設(shè)置是否需要位置語(yǔ)義化結(jié)果,可以在BDLocation.getLocationDescribe里得到,結(jié)果類似于“在北京天安門附近”

option.setIsNeedLocationPoiList(true);//可選,默認(rèn)false,設(shè)置是否需要POI結(jié)果,可以在BDLocation.getPoiList里得到

option.setIgnoreKillProcess(false);//可選,默認(rèn)true,定位SDK內(nèi)部是一個(gè)SERVICE,并放到了獨(dú)立進(jìn)程,設(shè)置是否在stop的時(shí)候殺死這個(gè)進(jìn)程,默認(rèn)不殺死

option.SetIgnoreCacheException(false);//可選,默認(rèn)false,設(shè)置是否收集CRASH信息,默認(rèn)收集

option.setEnableSimulateGps(false);//可選,默認(rèn)false,設(shè)置是否需要過濾gps仿真結(jié)果,默認(rèn)需要

mLocationClient.setLocOption(option);

}

@Override

protected voidonDestroy() {

mLocationClient.stop();//停止定位

mBaiduMap.setMyLocationEnabled(false);//關(guān)閉定位圖層

mMapView.onDestroy();

super.onDestroy();

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 來聊聊怎么接入百度地圖吧 百度地圖SDK接入 其實(shí)這個(gè)環(huán)境配置在百度官方的介紹上面已經(jīng)很詳細(xì)了,我也差不多是都是根...
    Discredited閱讀 736評(píng)論 0 0
  • 慕課視頻:Android-百度地圖之導(dǎo)航http://www.imooc.com/learn/670Android...
    alialiali閱讀 1,210評(píng)論 0 3
  • 寫在前面本來想使用百度定位的SDK把定位功能實(shí)現(xiàn)了,可無奈遇上個(gè)坑到寫這篇blog為止都還沒有解決。故所以把使用百...
    Vane_Subin閱讀 8,848評(píng)論 8 14
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,349評(píng)論 25 708
  • H,大一認(rèn)識(shí)的一個(gè)姑娘,認(rèn)識(shí)她也真是很有意思的一段故事。 舍友在學(xué)校的棋弈協(xié)會(huì),某天問我要不要去報(bào)名競(jìng)選棋弈協(xié)會(huì)的...
    脫韁小光閱讀 439評(píng)論 0 2