百度地图实例开发

申请密钥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 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);

//4、定义Maker坐标点,LatLng经纬度封装类
/**
* 构造方法参数
* 1、纬度
* 2、经度
*/
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 基础地图

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

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

//2、注册定位的监听事件
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()));
}
}
});

//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();
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值