路线的检索:
三种方式:驾车、公交、步行
结合覆盖物展示搜索:驾车路线覆盖物:RouteOverlay
***使用百度地图必须进行的准备工作:
1、初始化:
1)、到百度的服务器端检验KEY
创建initManager()方法进行检验的操作:
①、创建百度地图的管理器对象:
②、对管理器对象进行初始化,调用init方法
init(String strKey, MKGeneralListener listener)
参数:
strKey:申请的授权验证码
listener:注册回调事件——需要在监听中校验key(300)和网络状态(2)
关于状态码信息我们可以在MKEvent查询
创建监听,实现其中的方法:
@onGetNetworkState:网络的判断——判断iError是否为2,是则无网络(此处可以提示用户)
@onGetPermissionState:授权验证的状态——判断iError是否为300,是则验证失败(此处可以提示用户)
2)加载布局文件:用于显示地图【mapView】
【调用父类的onCreate方法,进行初始化】
创建布局,调用setContentView方法进行解析加载:
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
android:id="@+id/mapview"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
3)初始化控件
①、初始化地图控件mapView:
mapView = (MapView) findViewById(R.id.mapview);
②、添加缩放按钮:
mapView.setBuiltInZoomControls(true);// 显示放大和缩小的控件
③、注册监听:
mapView.regMapViewListener(manager, new MKMapViewListener()
在onClickMapPoi(MapPoi poi)方法中可以设置点击某个兴趣点时显示的名称
4)实现生命周期的方法:
实现Activity中的onResume()、onPause()、onDestroy()三个方法,并在其中调用
@Override
protected void onResume() {
mapView.onResume();
super.onResume();
}
@Override
protected void onPause() {
mapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mapView.destroy();
super.onDestroy();
}
一、路线的检索实现:
驾车路线的检索:DrivingSearchDemo
步行路线的检索:WalkSearchDemo
公交路线的检索:TransitOverlayDemo
1、初始化
①、初始化的一些方法在BaseActivity中
初始化的相关内容都在上面完成了
②、创建各种路线检索的初始化方法:
driving();walking();transit():
listener = new MyListener();
search.init(manager, listener);
调用相应的检索方法:
驾车路线检索调用drivingSearch方法:drivingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end)
步行路线检索调用walkingSearch方法:walkingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end)
公交路线检索调用transitSearch方法:transitSearch(String city, MKPlanNode start, MKPlanNode end)
参数:
startCity:起始城市
start:起始点位
endCity:终止城市
end:终止点位
city:指定的城市
String startCity = "北京";
MKPlanNode start = new MKPlanNode();
startNaN = hmPos;
String endCity = "北京";
MKPlanNode end = new MKPlanNode();
end.name = "金燕龙办公楼";
//驾车路线检索:
search.drivingSearch(startCity, start, endCity, end);
//步行路线检索:
search.walkingSearch(startCity, start, endCity, end);
//公交路线检索:
search.transitSearch("北京", start, end);
Tips:
对于驾车路线检索:
还可以进行“搜索策略”:如距离最短,最省钱,换乘最少等等,还可以进行指定途经指定位置等搜索策略
如:
①、距离最短的搜索策略:
需要在调用搜索方法之前设置:search.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);//距离最短
②、途经指定位置:如天安门
需要设置城市和名称,并将item加入到MKWpNode集合中:
ArrayList
MKWpNode item=new MKWpNode();
item.city="北京";
item.name="天安门";
wpNodes.add(item);
//调用重构方法
search.drivingSearch(startCity, start, endCity, end, wpNodes);
2、创建自定义监听器
驾车路线需要实现onGetDrivingRouteResult(MKTransitRouteResult result, int iError)方法
步行路线需要实现onGetWalkingRouteResult(MKTransitRouteResult result, int iError)方法
公交路线需要实现onGetTransitRouteResult(MKTransitRouteResult result, int iError)方法
①、驾车和步行路线检索实现的方法:
显示位置展示在地图上:
创建RouteOverkay对象:RouteOverlay overlay = new RouteOverlay(DrivingSearchDemo.this, mapView);
设置数据:
*获取路线方案的数目:result.getNumPlan()
*当获得到数目(大于0,有数据)后,进行后续操作
获得策略:result.getPlan(),返回MKRoutePlan
获得驾车的策略:plan.getRoute(0)
*设置数据,将策略设置到数据中:overlay.setData(mkRoute);
将覆盖物RouteOverkay加入到mapView中
刷新显示
if (result.getNumPlan() > 0) {
MKRoutePlan plan = result.getPlan(0);
MKRoute mkRoute = plan.getRoute(0);
overlay.setData(mkRoute);
mapView.getOverlays().add(overlay);
mapView.refresh();
}
②、公交路线检索实现的方法:
@创建TransitOverlay:TransitOverlay overlay = new TransitOverlay(TransitOverlayDemo.this, mapView);
@获取方案的数目:result.getNumPlan()
如果有多个方案,可以进行遍历,将每个方案都设置到覆盖物的数据中
注意:每次需要创建一个公交覆盖物,即每种方案对应一个公交覆盖物
@获取搜索方案:result.getPlan(index)
@果有数据:
*设置方案:
*设置数据:overlay.setData(plan)
*将覆盖物加入到mapView中:mapView.getOverlays().add(overlay);
*刷新地图,进行显示:mapView.refresh();[刷新一次即可]
四、我的位置信息:MyLocationOverlay
定位的jar包:locSDK_3.1.jar
MyLocationOverlay:一个负责显示用户当前位置的Overlay
& MyLocationOverlay:只负责显示我的位置
& LocationData:存放获取的位置数据,并设置MyLocationOverlay的数据源
需要用到两个核心类:
LocationClient:网络查询
LocationListener:处理查询的结果
实现流程:
1、定义变量,创建对象:
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
2、初始化,设置监听的参数信息
在onCreate方法中【创建location方法】进行初始化
①、创建网络查询的对象:LocationClient
mLocationClient=new LocationClient(getApplicationContext());
②、进行参数的配置:定义参数,并进行设置:
设置定位参数(LocationClientOption):定位模式(单次定位,定时定位),返回坐标类型,是否打开GPS等等
//参数配置
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
option.setAddrType("all");//返回的定位结果包含地址信息
option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
option.disableCache(true);//禁止启用缓存定位
option.setPoiNumber(5);//最多返回POI个数
option.setPoiDistance(1000); //poi查询距离
option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息
③、将设置好的参数对象设置到LocationClient之中
④、注册监听:
mLocationClient.registerLocationListener(myListener);
3、控制定位信息获取:
通过复写Activity生命周期的方法,并在其中调用LocationClient的start和stop方法
@Override
protected void onResume() {
mLocationClient.start();
super.onResume();
}
@Override
protected void onPause() {
mLocationClient.stop();
super.onPause();
}
3、创建自定义的监听器:
实现DBLocationListener的监听接口
实现相关方法onReceiveLocation:
需要先进行判断位置对象是否为空,不为空在进行如下操作:
①、创建“我的位置信息”对象和位置数据对象
②、设置数据:指定经纬度信息:latitude和longitude;并将数据设置到覆盖物中
③、将overlay加入到mapView中
④、刷新进行显示
测试:
可以将给定的位置点以动画形式移动至地图中心,通过控制器MapController的animateTo(GeoPoint point)方法实现
对以给定的点GeoPoint,开始动画显示地图
准备工作:
public class BaseActivity extends Activity {
protected MapView mapView;
protected BMapManager manager;
protected MapController controller;
protected int latitude = (int) (40.051 * 1E6);// 纬度
protected int longitude = (int) (116.303 * 1E6);// 经度
protected GeoPoint hmPos=new GeoPoint(latitude, longitude);//黑马坐标
protected MKSearch search;
protected MKSearchListener listener;
protected void onCreate(android.os.Bundle savedInstanceState) {
// 到百度的服务器端检验KEY
initManager();
super.onCreate(savedInstanceState);
setContentView(R.layout.common);
init();
initController();// 管理地图
search();
}
private void search() {
search=new MKSearch();
}
private void initController() {
controller = mapView.getController();
controller.setZoom(12);// 3-19
controller.enableClick(true);// 控制poi是否可以被点击
controller.setCenter(hmPos);//设置地图的中心
}
private void initManager() {
manager = new BMapManager(getApplicationContext());
manager.init(ConstantValue.KEY, new MKGeneralListener() {
@Override
public void onGetPermissionState(int iError) {
// TODO 授权验证的状态
if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
Toast.makeText(getApplicationContext(), "验证失败", 1).show();
}
}
@Override
public void onGetNetworkState(int iError) {
// TODO 网络判断
if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
Toast.makeText(getApplicationContext(), "无网络", 1).show();
}
}
});
}
private void init() {
mapView = (MapView) findViewById(R.id.mapview);
// 添加放大和缩小的按钮
mapView.setBuiltInZoomControls(true);// 显示放大和缩小的控件
// 注册监听
mapView.regMapViewListener(manager, new MKMapViewListener() {
@Override
public void onMapMoveFinish() {}
@Override
public void onMapAnimationFinish() {}
@Override
public void onGetCurrentMap(Bitmap arg0) {}
@Override
public void onClickMapPoi(MapPoi poi) {
if (poi != null) {
Toast.makeText(getApplicationContext(), poi.strText, 0).show();
}
}
});
}
@Override
protected void onResume() {
mapView.onResume();
super.onResume();
}
@Override
protected void onPause() {
mapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mapView.destroy();
super.onDestroy();
}
//设置适配器
protected abstract class BaseSearchListener implements MKSearchListener{
@Override
public void onGetAddrResult(MKAddrInfo arg0, int arg1) {}
@Override
public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {}
@Override
public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {}
@Override
public void onGetPoiDetailSearchResult(int arg0, int arg1) {}
@Override
public void onGetPoiResult(MKPoiResult result, int type, int iError) {}
@Override
public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {}
@Override
public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {}
@Override
public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {}
}
}
/**
* 路线检索——驾车路线
* @author Administrator
*/
public class DrivingSearchDemo extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
driving();
}
private void driving() {
listener = new MyListener();
search.init(manager, listener);
String startCity = "北京";
MKPlanNode start = new MKPlanNode();
startNaN = hmPos;
String endCity = "北京";
MKPlanNode end = new MKPlanNode();
end.name = "金燕龙办公楼";
//搜索策略
//search.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST);//距离最短
//search.drivingSearch(startCity, start, endCity, end);
ArrayList
MKWpNode item=new MKWpNode();
item.city="北京";
item.name="天安门";
wpNodes.add(item);
search.drivingSearch(startCity, start, endCity, end, wpNodes);
}
private class MyListener extends BaseSearchListener {
@Override
public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {
if (result != null && iError == 0) {
RouteOverlay overlay = new RouteOverlay(DrivingSearchDemo.this, mapView);
// int getNumPlan()
// 获取方案数目
Toast.makeText(getApplicationContext(), "查询结果:"+result.getNumPlan()+"条方案", 0).show();
if (result.getNumPlan() > 0) {
MKRoutePlan plan = result.getPlan(0);
MKRoute mkRoute = plan.getRoute(0);
overlay.setData(mkRoute);
mapView.getOverlays().add(overlay);
mapView.refresh();
}
}
}
}
}
/**
* 公交换乘查询
*
* @author Administrator
*
*/
public class TransitOverlayDemo extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
transit();
}
private void transit() {
listener = new MyListener();
search.init(manager, listener);
MKPlanNode start = new MKPlanNode();
startNaN = hmPos;
MKPlanNode end = new MKPlanNode();
end.name = "金燕龙办公楼";
search.transitSearch("北京", start, end);
}
private class MyListener extends BaseSearchListener {
@Override
public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
if (result != null && iError == 0) {
// int getNumPlan()
// 获取方案数目
Toast.makeText(getApplicationContext(), "查询结果:" + result.getNumPlan() + "条方案", 0).show();
if (result.getNumPlan() > 0) {
for (int index = 0; index < result.getNumPlan(); index++) {
TransitOverlay overlay = new TransitOverlay(TransitOverlayDemo.this, mapView);
MKTransitRoutePlan plan = result.getPlan(index);
overlay.setData(plan);
mapView.getOverlays().add(overlay);
}
mapView.refresh();
}
}
}
}
}
/**
* 定位
* @author Administrator
*
*/
public class MyLocationOverlayDemo extends BaseActivity {
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
location();
}
private void location() {
mLocationClient=new LocationClient(getApplicationContext());
//参数配置
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
option.setAddrType("all");//返回的定位结果包含地址信息
option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);//设置发起定位请求的间隔时间为5000ms
option.disableCache(true);//禁止启用缓存定位
option.setPoiNumber(5);//最多返回POI个数
option.setPoiDistance(1000); //poi查询距离
option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息
mLocationClient.setLocOption(option);
mLocationClient.registerLocationListener(myListener);
}
@Override
protected void onResume() {
mLocationClient.start();
super.onResume();
}
@Override
protected void onPause() {
mLocationClient.stop();
super.onPause();
}
private class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation location) {
if(location==null)
return;
MyLocationOverlay overlay=new MyLocationOverlay(mapView);
LocationData data=new LocationData();
data.latitude=location.getLatitude();
data.longitude=location.getLongitude();
overlay.setData(data);
mapView.getOverlays().add(overlay);
mapView.refresh();
int latitude=(int) (data.latitude*1E6);
controller.animateTo(new GeoPoint(latitude, (int)(data.longitude*1E6)));
}
@Override
public void onReceivePoi(BDLocation arg0) {
// TODO Auto-generated method stub
}
}
}