百度地圖實例開發

java

申請密鑰AndroidSDK:應用程序包名+數字簽名android

As查看數字簽名:cmd-----cd .android---------keytool -list -v-keystore debug.keystore------密鑰口令是androidgit

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

Eclipse查看數字簽名:windows -> preferance ->android -> buildapi

配置環境及發佈bash

Android Studio工程配置方法網絡

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

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

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

1.1 Hello BaiduMap

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.xys.baidumapapplication.MainActivity">

<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"/>
</RelativeLayout>

權限配置:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xys.baidumapapplication">

<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>
<!-- 這個權限用於進行網絡定位 -->
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 這個權限用於訪問GPS定位 -->
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- 用於訪問wifi網絡信息,wifi信息會用於進行網絡定位 -->
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 獲取運營商信息,用於支持提供運營商信息相關的接口 -->
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 用於讀取手機當前的狀態 -->
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
<!-- 寫入擴展存儲,向擴展卡寫入數據,用於寫入離線定位數據 -->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 訪問網絡,網絡定位須要上網 -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.GET_TASKS"/>

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- 添加百度開發密鑰 -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="wNQzIKaz9u7QQ6p734TfshyNFpaDl4gM"/>

<activity android:name=".PointSearchActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

<!--
添加用於實現定位的服務
-->
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote">
</service><!-- ATTENTION:This was auto-generated to add Google Play services to your project for
App Indexing. See https://g.co/AppIndexing/AndroidStudiofor more information. -->
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
</application>

</manifest>

示例代碼:

public class MainActivity extends Activity {

/*
* 顯示基礎地圖,並提供key是否正確的驗證
* */
MapView mMapView = null;
private BroadcastReceivermReceiver;
private BaiduMap mBaiduMap;

@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各組件以前初始化context信息,傳入ApplicationContext
//注意該方法要再setContentView方法以前實現
SDKInitializer.

initialize
(getApplicationContext());
setContentView(R.layout.
activity_main
);
//獲取地圖控件引用
mMapView = (MapView)findViewById(R.id.
bmapView
);

//註冊SDK廣播監聽者
IntentFilteriFilter = new IntentFilter();
iFilter.addAction(SDKInitializer.
SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK
); //key正常
iFilter.addAction(SDKInitializer.
SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR
);//key驗證出錯
iFilter.addAction(SDKInitializer.
SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR
);//網絡出錯
mReceiver = new SDKReceiver();
registerReceiver(mReceiver, iFilter);

//能夠經過如下幾種方式實現地圖特殊顯示
mBaiduMap = mMapView.getMap();
//衛星地圖
//mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//普通地圖
mBaiduMap.setMapType(BaiduMap.
MAP_TYPE_NORMAL
);
//空白地圖, 基礎地圖瓦片將不會被渲染。在地圖類型中設置爲NONE,將不會使用流量下載基礎地圖瓦片圖層。使用場景:與瓦片圖層一塊兒使用,節省流量,提高自定義瓦片圖下載速度。
//mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);

//2.開啓交通圖
//mBaiduMap.setTrafficEnabled(true);

//3.開啓百度城市熱力圖
//mBaiduMap.setBaiduHeatMapEnabled(true);

//四、定義Maker座標點,LatLng經緯度封裝類
/**
* 構造方法參數
* 一、緯度
* 二、經度
*/
LatLng point = new LatLng(31.384289, 121.497907);
//構建Marker圖標
BitmapDescriptorbitmap = BitmapDescriptorFactory
.
fromResource
(R.mipmap.
icon_marka
);
//構建MarkerOption,用於在地圖上添加Marker
OverlayOptionsoption = new MarkerOptions()
.position(point)
.icon(bitmap)
.draggable(true);//設置手勢拖拽
//在地圖上添加Marker,並顯示,參數表明圖層對象
mBaiduMap.addOverlay(option);

//設置讓地圖的中心點移動到某位置
MapStatus.Buildermb = new MapStatus.Builder();
mb.target(point);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.
newMapStatus
(mb.build()));


}

@Override
protected void onDestroy() {
super.onDestroy();
//在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
mMapView.onDestroy();
}

@Override
protected void onResume() {
super.onResume();
//在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
mMapView.onResume();
}

@Override
protected void onPause() {
super.onPause();
//在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
mMapView.onPause();
}


/**
* 構造廣播監聽類,監聽 SDK key 驗證以及網絡異常廣播
*/
public class SDKReceiver extends BroadcastReceiver{
public void onReceive(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 驗證出錯! 請在 AndroidManifest.xml 文件中檢查key 設置", Toast.
LENGTH_SHORT
).show();
} else if (s
.equals(SDKInitializer.
SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_OK
)) {

Toast.
makeText
(MainActivity.this, "key 驗證成功! 功能能夠正常使用",Toast.
LENGTH_SHORT
).show();

} else if (s
.equals(SDKInitializer.
SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR
)) {
Toast.
makeText
(MainActivity.this, "網絡出錯", Toast.
LENGTH_SHORT
).show();
}
}
}

}

1.2 基礎地圖

一、地圖圖層

什麼是地圖圖層?

地圖能夠包含一個或多個圖層,每一個圖層在每一個級別都是由若干個圖塊組成的,它們覆蓋了地圖的整個表面。

例如您所看到包括街道、興趣點、學校、公園等內容的地圖展示就是一個圖層。

目前百度地圖SDK所提供的地圖等級爲3-19級,所包含的信息有建築物、道路、河流、學校、公園等內容。

地圖覆蓋物

全部疊加或覆蓋到地圖的內容,咱們統稱爲地圖覆蓋物

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

覆蓋物擁有本身的地理座標,當您拖動或縮放地圖時,它們會相應的移動。

覆蓋物按從下到上層次覆蓋關係

一、基礎底圖(包括底圖、底圖道路、衛星圖等)

二、地形圖圖層(GroundOverlay)

三、熱力圖圖層(HeatMap)

四、實時路況圖圖層(BaiduMap.setTrafficEnabled(true);

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

六、底圖標註(指的是底圖上面自帶的那些POI元素)

七、幾何圖形圖層(點、折線、弧線、圓、多邊形)

八、標註圖層(Marker),文字繪製圖層(Text)

九、指南針圖層(當地圖發生旋轉和視角變化時,默認出如今左上角的指南針)

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

十一、彈出窗圖層(InfoWindow)

十二、自定義View(MapView.addView(View);)

二、地圖類型

普通矢量地圖

mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);

衛星地圖

mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);

實時交通圖

當前,全國範圍內已支持多個城市實時路況查詢,且會陸續開通其餘城市。

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

三、覆蓋物

開發者可根據本身實際的業務需求,利用標註覆蓋物,在地圖指定的位置上添加標註信息。

本地覆蓋物

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

標註覆蓋物(Marker

使用步驟

定義Marker座標點

LatLngpoint = new LatLng(39.963175, 116.400244);

構建Marker圖標

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

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

構建MarkerOption,用於在地圖上添加Marker

OverlayOptionsoption = new MarkerOptions()

.position(point)// Marker的位置

.icon(bitmap); // Marker的圖標

.zIndex(9) // 設置marker所在層級

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

在地圖上添加Marker,並顯示

mBaiduMap.addOverlay(option);

設置Marker的點擊事件

mBaiduMap.setOnMarkerClickListener(OnMarkerClickListener)

手勢拖拽的標註

設置可拖拽

OverlayOptionsoptions = new MarkerOptions()

.position(pointA) //設置marker的位置

.icon(bdA) //設置marker圖標

.zIndex(9) //設置marker所在層級(默認:12)

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

將Marker添加到地圖上

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

設置marker拖拽的監聽

BaiduMap.setOnMarkerDragListener(OnMarkerDragListener)

動畫效果的Marker

注:自v3.3.0版本起,SDK提供了給Marker增長動畫的能力

實例化ArrayList<BitmapDescriptor>,增長動畫相關的圖片資源

經過MarkerOptions的icons設置動畫的一組圖片資源,再經過period設置多少幀刷新一次圖片資源

幾何圖形覆蓋物

點(Dot): DotOptions

折線(Polyline):PolylineOptions

弧線(Arc):ArcOptions

圓(Circle):CircleOptions

多邊形(Polygon):PolygonOptions

文字覆蓋物:TextOptions

彈出窗覆蓋物:InfoWindow

地形圖圖層:GroundOverlay

搜索覆蓋物

顯示和管理多個Overlay的基類:OverlayManager

POI本地搜索覆蓋物:PoiOverlay

公交信息覆蓋物:BusLineOverlay

換乘線路覆蓋物:TransitRouteOverlay

駕車路線覆蓋物:DrivingRouteOverlay

步行路線覆蓋物:WalkingRouteOverlay

1.3 POI檢索---興趣點搜索

POI檢索

POI(Point ofInterest),中文能夠翻譯爲「興趣點」。在地理信息系統中,一個POI能夠是一棟房子、一個商鋪、一個郵筒、一個公交站等。

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

周邊檢索

區域檢索

城市內檢索

importcom.xys.utlis.PoiOverlay;

import java.util.List;

/**
* Created by xuyangsheng on 2015/4/3.
*/
public class PointSearchActivity extends Activity {

/*
* 實現興趣點檢索的功能
* 如:搜索上海內全部KFC
* 或者自身周邊10000米範圍內的KFC
* 而且將搜索結果顯示到MapView上
* */
private MapView mMapView;
private BaiduMap mBaiduMap;
private PoiSearch mPoiSearch;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各組件以前初始化context信息,傳入ApplicationContext
//注意該方法要再setContentView方法以前實現
SDKInitializer.
initialize
(getApplicationContext());
setContentView(R.layout.
activity_search
);

mMapView = (MapView)this.findViewById(R.id.
mapView
);
Log.
i
("===","=====onCreate mapView"+mMapView);
mBaiduMap = mMapView.getMap();

//第一步,建立POI檢索實例
mPoiSearch = PoiSearch.
newInstance
();
//第二步,設置POI檢索監聽者
mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener(){
/***
* 當調用searchInCity,searchNearby,seachInBound方法
* 獲得搜索結果以後調用的方法
* @param poiResult 參數表明搜索的結果
*/
@Override
public void onGetPoiResult(PoiResultpoiResult) {
//知足if條件時,表明地圖成功搜索出結果
if(poiResult.error ==SearchResult.ERRORNO.
NO_ERROR
){
//將搜索結果輸出
Log.
i
("===","======上海市共有的KFC的個數爲:"+poiResult.getTotalPoiNum());
List<PoiInfo>list = poiResult.getAllPoi();

for (PoiInfo pi : list) {
    Log.i("====", "===該poi點的地址信息爲:" + pi.address + " " + pi.name);
}
                    //將搜索結果顯示到地圖上
                    //清除地圖上顯示的內容
                    mBaiduMap.clear();
                    //建立PoiOverlay,即顯示搜索結果的圖層
                    /*
                    * 注:若是後期須要設置poi點的點擊事件,那麼就須要經過new
                    * 子類的方式獲取PoiOverlay對象
                    * 若是後期不須要設置poi點的點擊事件,那麼也能夠直接
                    * new PoiOverlay對象
                    * */
                    PoiOverlay overlay = new MyPointOverlay(mBaiduMap);
                    //設置overlay能夠處理標註點擊事件
                    mBaiduMap.setOnMarkerClickListener(overlay);
                    //設置PoiOverlay數據
                    overlay.setData(poiResult);
                    //添加PoiOverlay到地圖中
                    overlay.addToMap();
                    //讓地圖自動縮放,知足讓全部的結果點都顯示到屏幕上
                    overlay.zoomToSpan();
                }
            }

            //當經過searchPoiDetail方法查詢指定poi點的詳細信息,獲得結果後運行此方法
            @Override
            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
                Log.i("===","====== poi 的名稱和營業時間: "+poiDetailResult.getName()+" "+poiDetailResult.getShopHours());
            }
        });

        MapStatus.Builder mb = new MapStatus.Builder();
        mb.target(new LatLng(31.384289,121.497907));
        mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mb.build()));
    }

    /**
     * 處理按鈕點擊事件
     */
    public void click(View v){
        switch (v.getId()) {
            case R.id.button:

                //第三步,發起檢索請求
                mPoiSearch.searchInCity(new PoiCitySearchOption()
                        .city("上海")  //設置在哪一個城市範圍內進行搜索
                        .keyword("KFC")   //設置搜索關鍵字
                        .pageCapacity(8)    //設置每頁容量,默認爲每頁10條
                        .pageNum(10)   //分頁編號
                );
                break;
            case R.id.button2:
                mPoiSearch.searchNearby(new PoiNearbySearchOption()
                        .keyword("蘭州拉麪")  //搜索關鍵字
                        .location(new LatLng(31.384289,121.497907))   //設置搜索的中心點
                        .radius(10000)   //設置搜索半徑
                );

                break;
        }
    }

    /**
     * 建立一個用於顯示搜索結果的圖層的子類
     */
    private class MyPointOverlay extends PoiOverlay{
        public MyPointOverlay(BaiduMap baiduMap){
                super(baiduMap);
        }
        //當poi點被點擊時運行的方法
        @Override
        public boolean onPoiClick(int index) {
            super.onPoiClick(index);
            PoiInfo poiInfo = getPoiResult().getAllPoi().get(index);

            //能夠經過方法搜索指定poi點的詳細信息
            mPoiSearch.searchPoiDetail(new PoiDetailSearchOption().poiUid(poiInfo.uid));

            return true;
        }
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
        mMapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
        mMapView.onPause();
    }
}複製代碼
複製代碼

1.4 路徑規劃

/**
* Created by xuyangsheng on 2015/4/3.
* 用於實現地圖的路徑規劃功能
*/
public class RoutePlanActivity extends Activity {

private MapView mMapView;
BaiduMap mBaiduMap;

//用於進行路徑規劃的檢索類
private RoutePlanSearch mSearch;
private WalkingRouteResult walkingRouteResult;


@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各組件以前初始化context信息,傳入ApplicationContext
//注意該方法要再setContentView方法以前實現
SDKInitializer.
initialize
(getApplicationContext());
setContentView(R.layout.
activity_route
);

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

LatLng point = new LatLng(31.384289, 121.497907);
//構建Marker圖標
BitmapDescriptorbitmap = BitmapDescriptorFactory
.
fromResource
(R.mipmap.
icon_marka
);
//構建MarkerOption,用於在地圖上添加Marker
OverlayOptionsoption = new MarkerOptions()
.position(point)
.icon(bitmap)
.draggable(true);//設置手勢拖拽
//在地圖上添加Marker,並顯示,參數表明圖層對象
mBaiduMap.addOverlay(option);

//將地圖中心移動到寶山區
final MapStatus.Buildermb = new MapStatus.Builder();
mb.target(point);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.
newMapStatus
(mb.build()));

//1.建立公交線路規劃檢索實例
mSearch =RoutePlanSearch.
newInstance
();

//2.設置公交線路規劃檢索監聽者
mSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener(){
//當獲得步行路線時運行此方法
@Override
public void onGetWalkingRouteResult(WalkingRouteResultwalkingRouteResult) {
Log.
i
("===", "==== getwalking " +walkingRouteResult.error);
if (walkingRouteResult.error ==SearchResult.ERRORNO.
NO_ERROR
) {
Log.
i
("===", "===本次步行的總距離和預計總時長爲:"+walkingRouteResult.getRouteLines().get(0).getDistance()+ " " +walkingRouteResult.getRouteLines().get(0).getDuration());
RoutePlanActivity.this.walkingRouteResult= walkingRouteResult;
/*
* 獲取第一種步行路線
* */
WalkingRouteLineline = walkingRouteResult.getRouteLines().get(0);
//獲取該種步行方式的全部行進路段
List<WalkingRouteLine.WalkingStep>steps = line.getAllStep();
for (WalkingRouteLine.WalkingStepstep : steps) {
//獲取路段總體指示信息
Log.
i
("====", "===== " +step.getInstructions());
}
mBaiduMap.clear();
WalkingRouteOverlayoverlay = new MyWalking(mBaiduMap);
mBaiduMap.setOnMarkerClickListener(overlay);

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

}
}

//當得到公交路線時運行的方法
@Override
public void onGetTransitRouteResult(TransitRouteResulttransitRouteResult) {
if (transitRouteResult.error ==SearchResult.ERRORNO.
NO_ERROR
) {
Log.
i
("===", "===本次步行的總距離和預計總時長爲:"+transitRouteResult.getRouteLines().get(0).getDistance()+ " " +transitRouteResult.getRouteLines().get(0).getDuration());

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

List<TransitRouteLine.TransitStep>steps = line.getAllStep();
for (TransitRouteLine.TransitStepstep : steps) {
//獲取路段總體指示信息
Log.
i
("====", "===== " +step.getInstructions());
}
mBaiduMap.clear();
TransitRouteOverlayoverlay = new MyTransit(mBaiduMap);
mBaiduMap.setOnMarkerClickListener(overlay);

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

}
}

//當得到駕車路線時運行的方法
@Override
public void onGetDrivingRouteResult(DrivingRouteResultdrivingRouteResult) {
if (drivingRouteResult.error ==SearchResult.ERRORNO.
NO_ERROR
) {
Log.
i
("===", "===本次步行的總距離和預計總時長爲:"+drivingRouteResult.getRouteLines().get(0).getDistance()+ " " +drivingRouteResult.getRouteLines().get(0).getDuration());
/*
* 獲取第一種步行路線
* */
DrivingRouteLineline = drivingRouteResult.getRouteLines().get(0);
//獲取該種步行方式的全部行進路段
List<DrivingRouteLine.DrivingStep>steps = line.getAllStep();
for (DrivingRouteLine.DrivingStepstep : steps) {
//獲取路段總體指示信息
Log.
i
("====", "===== " +step.getInstructions());
}
mBaiduMap.clear();
DrivingRouteOverlayoverlay = new MyDriving(mBaiduMap);
mBaiduMap.setOnMarkerClickListener(overlay);

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

}
}

//當得到騎行路線時運行的方法
@Override
public void onGetBikingRouteResult(BikingRouteResultbikingRouteResult) {
if (bikingRouteResult.error ==SearchResult.ERRORNO.
NO_ERROR
) {
Log.
i
("===", "===本次步行的總距離和預計總時長爲:" + bikingRouteResult.getRouteLines().get(0).getDistance()+ " " +bikingRouteResult.getRouteLines().get(0).getDuration());
/*
* 獲取第一種步行路線
* */
BikingRouteLineline = bikingRouteResult.getRouteLines().get(0);
//獲取該種步行方式的全部行進路段
List<BikingRouteLine.BikingStep>steps = line.getAllStep();
for (BikingRouteLine.BikingStepstep : steps) {
//獲取路段總體指示信息
Log.
i
("====", "===== " +step.getInstructions());
}
mBaiduMap.clear();
BikingRouteOverlayoverlay = new MyBiking(mBaiduMap);
mBaiduMap.setOnMarkerClickListener(overlay);

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

}
}
});
}


public void click(View v) {
//經過經緯度獲取起點PlanNode對象
PlanNode start =PlanNode.
withLocation
(new LatLng(31.384289, 121.497907));
//經過城市名稱和地址名稱獲取PlanNode對象
PlanNode end =PlanNode.
withCityNameAndPlaceName
("上海", "虹口足球場地鐵站");

switch (v.getId()) {
case R.id.
button3
: //公交
mSearch.transitSearch(new TransitRoutePlanOption()
.city("上海") //設置城市信息
.from(start) //設置起點信息
.to(end) //設置終點信息
.policy(TransitRoutePlanOption.TransitPolicy.
EBUS_TIME_FIRST
) //設置換成策略,如時間最短,步行最少等
);

break;
case R.id.
button4
: //駕車
mSearch.drivingSearch(new DrivingRoutePlanOption()
.from(start)
.to(end)
.policy(DrivingRoutePlanOption.DrivingPolicy.
ECAR_AVOID_JAM
) //設置駕車策略,如時間最少,避免擁堵等
.trafficPolicy(DrivingRoutePlanOption.DrivingTrafficPolicy.
ROUTE_PATH_AND_TRAFFIC
)//設置是否支持路況數據
);
break;
case R.id.
button5
: //步行

mSearch.walkingSearch(new WalkingRoutePlanOption()
.from(start) //設置起點
.to(end)); //設置終點
break;
case R.id.
button6
: //騎行
mSearch.bikingSearch(new BikingRoutePlanOption()
.from(start)
.to(end)
);
break;


}
}


//自定義步行圖層的子類
class MyWalking extends WalkingRouteOverlay{

public MyWalking(BaiduMapbaiduMap) {
super(baiduMap);
}

//經過返回值控制起點圖標的顯示
@Override
public BitmapDescriptorgetStartMarker() {
return BitmapDescriptorFactory.
fromResource
(R.mipmap.
icon_st
);
}

//經過返回值控制終點圖標的顯示
@Override
public BitmapDescriptorgetTerminalMarker() {
return BitmapDescriptorFactory.
fromResource
(R.mipmap.
icon_en
);
}

// 當路徑中的節點被點擊時運行的方法
@Override
public boolean onRouteNodeClick(int i) {
WalkingRouteLine.WalkingStepselect = walkingRouteResult.getRouteLines().get(0).getAllStep().get(i);
Toast.
makeText
(RoutePlanActivity.this, "--" +select.getInstructions(),Toast.
LENGTH_SHORT
).show();
return true;
}
}


class MyTransit extends TransitRouteOverlay{

/**
* 構造函數
*
* @param baiduMap 該TransitRouteOverlay引用的 BaiduMap 對象
*/
public MyTransit(BaiduMapbaiduMap) {
super(baiduMap);
}
//經過返回值控制起點圖標的顯示
@Override
public BitmapDescriptorgetStartMarker() {
return BitmapDescriptorFactory.
fromResource
(R.mipmap.
icon_st
);
}

//經過返回值控制終點圖標的顯示
@Override
public BitmapDescriptorgetTerminalMarker() {
return BitmapDescriptorFactory.
fromResource
(R.mipmap.
icon_en
);
}
}

class MyDriving extends DrivingRouteOverlay{

/**
* 構造函數
*
* @param baiduMap 該TransitRouteOverlay引用的 BaiduMap 對象
*/
public MyDriving(BaiduMapbaiduMap) {
super(baiduMap);
}
//經過返回值控制起點圖標的顯示
@Override
public BitmapDescriptorgetStartMarker() {
return BitmapDescriptorFactory.
fromResource
(R.mipmap.
icon_st
);
}

//經過返回值控制終點圖標的顯示
@Override
public BitmapDescriptorgetTerminalMarker() {
return BitmapDescriptorFactory.
fromResource
(R.mipmap.
icon_en
);
}
}
class MyBiking extends BikingRouteOverlay{

/**
* 構造函數
*
* @param baiduMap 該TransitRouteOverlay引用的 BaiduMap 對象
*/
public MyBiking(BaiduMapbaiduMap) {
super(baiduMap);
}
//經過返回值控制起點圖標的顯示
@Override
public BitmapDescriptorgetStartMarker() {
return BitmapDescriptorFactory.
fromResource
(R.mipmap.
icon_st
);
}

//經過返回值控制終點圖標的顯示
@Override
public BitmapDescriptorgetTerminalMarker() {
return BitmapDescriptorFactory.
fromResource
(R.mipmap.
icon_en
);
}
}


@Override
protected void onDestroy() {
super.onDestroy();
//在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
mMapView.onDestroy();
}

@Override
protected void onResume() {
super.onResume();
//在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
mMapView.onResume();
}

@Override
protected void onPause() {
super.onPause();
//在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
mMapView.onPause();
}
}

1.5 百度地圖定位


/**
* Created by xuyangsheng on 2015/4/4.
* 實現地圖的定位功能
*/
public class LocationActivity extends Activity {

private MapView mMapView;
private BaiduMap mBaiduMap;
private boolean isFirstLoc=true;
private BitmapDescriptor mCurrentMarker;
private LocationClient mLocationClient;


@Override
protected void onCreate(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(new MyLocationConfiguration(
MyLocationConfiguration.LocationMode.
COMPASS
,true,mCurrentMarker
));

//一、初始化LocationClient類
mLocationClient = new LocationClient(getApplicationContext());//聲明LocationClient

//二、註冊定位的監聽事件
mLocationClient.registerLocationListener(new BDLocationListener(){
/**
*當獲取獲得定位結果時,就會運行此方法
* 參數表明當前定位到的位置信息
*/
@Override
public void onReceiveLocation(BDLocationbdLocation) {
Log.
i
("===","=====當前定位到的經緯度爲:"+bdLocation.getLongitude()+" "+bdLocation.getLatitude());
Log.
i
("===","=====當前位置的地址信息爲:"+bdLocation.getAddrStr()+" "+bdLocation.getAddress());

MyLocationData locData = new MyLocationData.Builder()
.accuracy(bdLocation.getRadius())
//此設置開發者獲取到的方向信息,順時針0-360
.direction(100).latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
if(isFirstLoc){
isFirstLoc = false;
LatLng ll = new LatLng(bdLocation.getLatitude(),
bdLocation.getLongitude());
MapStatus.Builderbuilder = new MapStatus.Builder();
builder.target(ll).zoom(18.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.
newMapStatus
(builder.build()));
}
}
});

//三、配置定位SDK參數
initLocation();

//開始定位
mLocationClient.start();
}

private void initLocation(){
LocationClientOption option = new LocationClientOption();
//可選,默認高精度,設置定位模式,高精度、低功耗、僅設備
option.setLocationMode(LocationClientOption.LocationMode.
Hight_Accuracy
);
option.setCoorType("bd0911"); //可選,默認gcj02,設置返回的定位結果座標系
int span = 1000;
option.setScanSpan(span); //可選,默認0,即僅定位一次,設置發起定位請求的間隔須要大於等於1000ms纔是有效的
option.setIsNeedAddress(true); //可選,設置是否須要地址信息,默認不須要
option.setOpenGps(true); //可選,默認false,設置是否使用gps
option.setLocationNotify(true);//可選,默認false,設置是否當gps有效時按照1S1次頻率輸出GPS結果
option.setIsNeedLocationDescribe(true);//可選,默認false,設置是否須要位置語義化結果,能夠在BDLocation.getLocationDescribe裏獲得,結果相似於「在北京天安門附近」
option.setIsNeedLocationPoiList(true);//可選,默認false,設置是否須要POI結果,能夠在BDLocation.getPoiList裏獲得
option.setIgnoreKillProcess(false);//可選,默認true,定位SDK內部是一個SERVICE,並放到了獨立進程,設置是否在stop的時候殺死這個進程,默認不殺死
option.SetIgnoreCacheException(false);//可選,默認false,設置是否收集CRASH信息,默認收集
option.setEnableSimulateGps(false);//可選,默認false,設置是否須要過濾gps仿真結果,默認須要
mLocationClient.setLocOption(option);
}

@Override
protected void onDestroy() {
mLocationClient.stop(); //中止定位
mBaiduMap.setMyLocationEnabled(false);//關閉定位圖層
mMapView.onDestroy();
super.onDestroy();
}
}

相關文章
相關標籤/搜索