今天我将给大家分享路径规划接口的使用。
首先,我们要构建一个最基本的地图应用,具体介绍请参考:百度地图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/