百度地图实例开发

来源:互联网 发布:国资委党员网络培训 编辑:程序博客网 时间:2024/06/06 05:50

申请密钥AndroidSDK:应用程序包名+数字签名

As查看数字签名:cmd-----cd .android---------keytool -list -v-keystore debug.keystore------密钥口令是android

其中keytool为jdk自带工具;keystorefile为Android 签名证书文件

 Eclipse查看数字签名:windows -> preferance ->android -> build

 

配置环境及发布

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

<?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 classMainActivity extendsActivity {

   
/*
    *
显示基础地图,并提供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 = newIntentFilter();
       
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);

        //4
、定义Maker坐标点,LatLng经纬度封装类
       
/**
         *
构造方法参数
        
* 1、纬度
        
* 2、经度
        
*/
       
LatLng point = newLatLng(31.384289,121.497907);
       
//构建Marker图标
       
BitmapDescriptorbitmap = BitmapDescriptorFactory
                .fromResource(R.mipmap.
icon_marka);
       
//构建MarkerOption,用于在地图上添加Marker
       
OverlayOptionsoption = newMarkerOptions()
                .position(point)
                .icon(bitmap)
                .draggable(
true);//设置手势拖拽
       
//在地图上添加Marker,并显示,参数代表图层对象
       
mBaiduMap.addOverlay(option);

       
//设置让地图的中心点移动到某位置
       
MapStatus.Buildermb = newMapStatus.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 SDKReceiverextends 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    基础地图

1、地图图层

         什么是地图图层?

                   地图可以包含一个或多个图层,每个图层在每个级别都是由若干个图块组成的,它们覆盖了地图的整个表面。

                   例如您所看到包括街道、兴趣点、学校、公园等内容的地图展现就是一个图层。

                   目前百度地图SDK所提供的地图等级为3-19级,所包含的信息有建筑物、道路、河流、学校、公园等内容。

         地图覆盖物

                   所有叠加或覆盖到地图的内容,我们统称为地图覆盖物

                   如标注、矢量图形元素(包括:折线、多边形和圆等)、定位图标等。

                   覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。

         覆盖物按从下到上层次覆盖关系

                   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);)

 

2、地图类型

         普通矢量地图

                   mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);

         卫星地图

                   mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);

         实时交通图

                   当前,全国范围内已支持多个城市实时路况查询,且会陆续开通其他城市。

                   开启交通图:mBaiduMap.setTrafficEnabled(true);

 

3、覆盖物

         开发者可根据自己实际的业务需求,利用标注覆盖物,在地图指定的位置上添加标注信息。

         本地覆盖物

                   本地覆盖物的抽象基类: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 PointSearchActivityextends Activity {

   
/*
  *
实现兴趣点检索的功能
  *
如:搜索上海内所有KFC
  *
或者自身周边10000米范围内的KFC
  *
并且将搜索结果显示到MapView
  * */
   
private MapViewmMapView;
    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(newOnGetPoiSearchResultListener(){
           
/***
             *
当调用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 RoutePlanActivityextends Activity {

   
private MapViewmMapView;
   
BaiduMap mBaiduMap;

   
//用于进行路径规划的检索类
   
private RoutePlanSearchmSearch;
   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 = newLatLng(31.384289,121.497907);
       
//构建Marker图标
       
BitmapDescriptorbitmap = BitmapDescriptorFactory
                .fromResource(R.mipmap.
icon_marka);
       
//构建MarkerOption,用于在地图上添加Marker
       
OverlayOptionsoption = newMarkerOptions()
                .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(newOnGetRoutePlanResultListener(){
           
//当得到步行路线时运行此方法
           
@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(newLatLng(31.384289,121.497907));
       
//通过城市名称和地址名称获取PlanNode对象
       
PlanNode end =PlanNode.withCityNameAndPlaceName("上海","虹口足球场地铁站");

        switch
(v.getId()) {
           
case R.id.button3//公交
               
mSearch.transitSearch(newTransitRoutePlanOption()
                        .city(
"上海")  //设置城市信息
                       
.from(start)     //设置起点信息
                       
.to(end)       //设置终点信息
                        
.policy(TransitRoutePlanOption.TransitPolicy.EBUS_TIME_FIRST//设置换成策略,如时间最短,步行最少等
               
);

                break;
            case
R.id.button4:     //驾车
               
mSearch.drivingSearch(newDrivingRoutePlanOption()
                        .from(start)
                        .to(end)
                       .policy(DrivingRoutePlanOption.DrivingPolicy.
ECAR_AVOID_JAM)  //设置驾车策略,如时间最少,避免拥堵等
                       
.trafficPolicy(DrivingRoutePlanOption.DrivingTrafficPolicy.ROUTE_PATH_AND_TRAFFIC)//设置是否支持路况数据
               
);
                break;
            case
R.id.button5:     //步行

               
mSearch.walkingSearch(newWalkingRoutePlanOption()
                        .from(start) 
//设置起点
                       
.to(end))//设置终点
               
break;
            case
R.id.button6:     //骑行
               
mSearch.bikingSearch(newBikingRoutePlanOption()
                        .from(start)
                        .to(end)
                )
;
                break;


        
}
    }


   
//自定义步行图层的子类
   
class MyWalkingextends 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(inti) {
            WalkingRouteLine.WalkingStepselect =
walkingRouteResult.getRouteLines().get(0).getAllStep().get(i);
           
Toast.makeText(RoutePlanActivity.this,"--" +select.getInstructions(),Toast.LENGTH_SHORT).show();
            return true;
       
}
    }


   
class MyTransitextends 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 MyDrivingextends 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 MyBikingextends 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 LocationActivityextends Activity {

   
private MapViewmMapView;
    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(newMyLocationConfiguration(
               MyLocationConfiguration.LocationMode.
COMPASS,true,mCurrentMarker
       
));

       
//1、初始化LocationClient
       
mLocationClient =new LocationClient(getApplicationContext());//声明LocationClient

        //2
、注册定位的监听事件
       
mLocationClient.registerLocationListener(newBDLocationListener(){
           
/**
             *
当获取得到定位结果时,就会运行此方法
            
* 参数代表当前定位到的位置信息
            
*/
           
@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 = newLatLng(bdLocation.getLatitude(),
                           
bdLocation.getLongitude());
                   
MapStatus.Builderbuilder =new MapStatus.Builder();
                   
builder.target(ll).zoom(18.0f);
                   
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
               
}
            }
        })
;

       
//3、配置定位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();
   
}
}

 

5 0