百度地图路线检索

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百度地图路线检索相关的知识,希望对你有一定的参考价值。

路线的检索:

三种方式:驾车、公交、步行

结合覆盖物展示搜索:驾车路线覆盖物:RouteOverlay

***使用百度地图必须进行的准备工作:

1、初始化:

1)、到百度的服务器端检验KEY

创建initManager()方法进行检验的操作:

①、创建百度地图的管理器对象:

②、对管理器对象进行初始化,调用init方法

init(String strKey, MKGeneralListener listener)

参数:

strKey:申请的授权验证码

listener:注册回调事件——需要在监听中校验key300)和网络状态(2

关于状态码信息我们可以在MKEvent查询

创建监听,实现其中的方法:

@onGetNetworkState:网络的判断——判断iError是否为2,是则无网络(此处可以提示用户)

@onGetPermissionState:授权验证的状态——判断iError是否为300,是则验证失败(此处可以提示用户)

2)加载布局文件:用于显示地图【mapView

【调用父类的onCreate方法,进行初始化】

创建布局,调用setContentView方法进行解析加载:

<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=".MainActivity" >

 

    <com.baidu.mapapi.map.MapView

        android:id="@+id/mapview"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        />

</RelativeLayout>

 

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> wpNodes=new ArrayList<MKWpNode>();

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

}

 

②、公交路线检索实现的方法:

@创建TransitOverlayTransitOverlay 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生命周期的方法,并在其中调用LocationClientstartstop方法

@Override

protected void onResume() {

mLocationClient.start();

super.onResume();

}


@Override

protected void onPause() {

mLocationClient.stop();

super.onPause();

}


 

3、创建自定义的监听器:

实现DBLocationListener的监听接口

实现相关方法onReceiveLocation

需要先进行判断位置对象是否为空,不为空在进行如下操作:

①、创建“我的位置信息”对象和位置数据对象

②、设置数据:指定经纬度信息:latitudelongitude;并将数据设置到覆盖物中

③、将overlay加入到mapView

④、刷新进行显示

 

测试:

可以将给定的位置点以动画形式移动至地图中心,通过控制器MapControlleranimateTo(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> wpNodes=new ArrayList<MKWpNode>();

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


}


}

}


本文出自 “苗振忠” 博客,请务必保留此出处http://miaozhenzhong.blog.51cto.com/11277456/1847077

以上是关于百度地图路线检索的主要内容,如果未能解决你的问题,请参考以下文章

百度地图开发之公交信息检索 + 路线规划

基于百度地图sdk的地图app开发——路线规划

在地图API中如何用经纬度来制定路线?

基于百度地图sdk的地图app开发——路线规划

基于百度地图sdk的地图app开发——poi检索

百度地图开发之poi检索,线路规划