今天我将给大家分享路径规划接口的使用。
首先,我们要构建一个最基本的地图应用,具体介绍请参考:百度地图SDK for Android【Demo地图展示】
自此基础之上,我们对工程做一定的修改,即可实现一个最基本的路径规划应用。
第一步,修改布局文件,添加用于输入起点、终点的输入框已经执行路径规划操作的按钮。代码如下所示:
<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" >
<!-- 放入百度地图的mapview -->
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapsView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/button1">
<!-- 起点输入框 -->
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="50"
android:layout_weight="1"
android:hint="请输入起点">
</EditText>
<!-- 终点输入框 -->
<EditText
android:id="@+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="50"
android:layout_weight="1"
android:hint="请输入终点">
</EditText>
</LinearLayout>
<!-- 搜索执行按钮 -->
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="《搜索》" />
</RelativeLayout>
第二步,在主程序中定义并初始化以上控件(地图控件、输入框控件和按钮控件)。代码如下:
// 初始化mapview对象,并且设置显示缩放控件
mapView = (MapView) findViewById(R.id.bmapsView);
mapView.setBuiltInZoomControls(true);
// 初始化起点、终点输入框及搜索按钮
startEditText = (EditText) findViewById(R.id.editText1);
endEditText = (EditText) findViewById(R.id.editText2);
button = (Button) findViewById(R.id.button1);
第三步,定义检索所需的对象和用于监听检索结果的对象,并实现监听方法。代码如下:
注意:路径规划实际上也是一种特殊的空间检索,因此监听对象和Poi检索的是一样的,有兴趣的读者还可参看上一篇关于Poi检索的博客。
// 定义路径搜索对象
MKSearch mkSearch = null;
// 结果监听对象
MKSearchListener mkSearchListener = new MKSearchListener() {
@Override
public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {
// TODO Auto-generated method stub
if (arg1 != 0 || arg0 == null) {
Toast.makeText(MainActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
return;
}
RouteOverlay routeOverlay = new RouteOverlay(MainActivity.this, mapView);
// 此处仅展示一个方案作为示例
routeOverlay.setData(arg0.getPlan(0).getRoute(0));
mapView.getOverlays().clear();
mapView.getOverlays().add(routeOverlay);
mapView.refresh();
mapView.getController().animateTo(arg0.getStart().pt);
}
@Override
public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onGetPoiDetailSearchResult(int arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onGetAddrResult(MKAddrInfo arg0, int arg1) {
// TODO Auto-generated method stub
}
};
以上代码主要实现了对步行路径规划的事件监听,本示例也是针对步行检索所展开的,开发者可根据自身的实际需求实现各方法的具体操作。
第四步,初始化检索对象(与Poi检索的方法相同)。代码如下:
// 初始化检索对象
mkSearch = new MKSearch();
mkSearch.init(bMapManager, mkSearchListener);
第五步,实现button的点击实现,即首先判断用户输入的关键字是否为空,不为空才开始执行检索。代码如下:
// 设置button的点击事件,先判断起点终点是否为空,不为空就开始执行步行检索
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String start = startEditText.getText().toString();
String end = endEditText.getText().toString();
if(start.equals("") || end.equals(""))
{
Toast.makeText(MainActivity.this, "起点或终点不可为空!", Toast.LENGTH_SHORT).show();
}
else
{
MKPlanNode startNode = new MKPlanNode();
startNode.name = start;
MKPlanNode endNode = new MKPlanNode();
endNode.name = end;
// 这里仅以步行搜索为例,开发者可根据自己的实际需求自定选择route类型
mkSearch.walkingSearch("北京", startNode, "北京", endNode);
}
}
});
第六步,完成并测试结果。效果图如下所示:
注意:以上代码只是核心代码,且只针对步行检索做了示例。百度地图SDK为开发者提供了驾车线路检索、步行线路检索和公交线路检索,开发者可根据实际问题自行选择。(点击下载本示例的原工程文件)
更多详细信息请登录百度地图API官方网站:http://developer.baidu.com/map/
百度地图API论坛:http://bbs.lbsyun.baidu.com/