【“零起点”--百度地图手机SDK】如何查询从西单到王府井的公交导航?
摘要:公交导航,即在市内坐公交,从哪儿去哪儿,比如从王府井到西单。有多种公交策略可以选择,比如少步行,不坐地铁等。
———————————————————————-
系列阅读:
1、【百度地图-安卓SDK】从头开始写android程序
http://www.cnblogs.com/milkmap/archive/2011/11/25/2263475.html
2、【“零起点”–百度地图手机SDK】如何创建一张地图
http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.html
3、【“零起点”–百度地图手机SDK】如何使用离线地图?
http://www.cnblogs.com/milkmap/archive/2012/05/21/2511928.html
4、【“零起点”–百度地图手机SDK】如何添加地图图层+按钮事件+水平垂直布局?
http://www.cnblogs.com/milkmap/archive/2012/05/25/2518454.html
5、【“零起点”–百度地图手机SDK】如何进行三种POI搜索?
http://www.cnblogs.com/milkmap/archive/2012/06/05/2536764.html
6、【“零起点”–百度地图手机SDK】如何查询公交线路?如北京的104路
http://www.cnblogs.com/milkmap/archive/2012/06/27/2554843.html
———————————————————————–
先按照第6章的内容,搭好环境与代码框架。接下来,只需要修改少量代码,即可实现公交导航功能。
一、公交导航接口transitSearch
由于公交导航只支持市内公交,所以,设置城市是必须的。
目前还不支持跨城公交,将来会考虑增加火车信息。
另外,驾车导航,支持跨城驾车。
myMKSearch.transitSearch("北京", start, end); // 必须设置城市名。
该接口支持检索起点和终点为关键字,或者坐标。但请注意,都必须使用到MKPlanNode接口。
MKPlanNode start = new MKPlanNode(); start.name = "王府井";//关键字方式 //start.pt = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));//经纬度方式
接下来设置公交策略。有如下几种策略:
EBUS_TIME_FIRST:时间优先;
EBUS_TRANSFER_FIRST:少换乘;
EBUS_WALK_FIRST:少步行;
EBUS_NO_SUBWAY: 不乘坐地铁。
myMKSearch.setTransitPolicy(MKSearch.EBUS_NO_SUBWAY); //不乘坐地铁
二、设置回调函数
回调函数onGetTransitRouteResult里,需要设置如下内容:
TransitOverlay transitOverlay = new TransitOverlay(YingTransitActivity.this, mMapView);//创建公交覆盖物对象 transitOverlay.setData(res.getPlan(0));// 此处仅展示一个方案作为示例 mMapView.getOverlays().add(transitOverlay);//添加覆盖物到地图上 mMapView.invalidate(); //刷新地图
三、运行结果
四、全部源代码
package com.baidu.yingTransit; import android.app.Activity; import android.os.Bundle; /** 引入import **/ import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.drawable.Drawable; import android.location.Location; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Toast; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.GeoPoint; import com.baidu.mapapi.ItemizedOverlay; import com.baidu.mapapi.LocationListener; import com.baidu.mapapi.MKAddrInfo; import com.baidu.mapapi.MKBusLineResult; import com.baidu.mapapi.MKDrivingRouteResult; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.MKLocationManager; import com.baidu.mapapi.MKPlanNode; import com.baidu.mapapi.MKPoiInfo; import com.baidu.mapapi.MKPoiResult; import com.baidu.mapapi.MKSearch; import com.baidu.mapapi.MKSearchListener; import com.baidu.mapapi.MKSuggestionResult; import com.baidu.mapapi.MKTransitRouteResult; import com.baidu.mapapi.MKWalkingRouteResult; import com.baidu.mapapi.MapActivity; import com.baidu.mapapi.MapController; import com.baidu.mapapi.MapView; import com.baidu.mapapi.MyLocationOverlay; import com.baidu.mapapi.Overlay; import com.baidu.mapapi.OverlayItem; import com.baidu.mapapi.PoiOverlay; import com.baidu.mapapi.RouteOverlay; import com.baidu.mapapi.TransitOverlay; public class YingTransitActivity extends MapActivity { /** 申明变量 **/ BMapManager mBMapMan = null; MapView mMapView = null; MKSearch myMKSearch = null; //POI搜索变量申明 /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /** 创建地图 **/ mBMapMan = new BMapManager(getApplication()); mBMapMan.init("1713A92A7A0C854D1B8717670EF8B6CA75696567", null); super.initMapActivity(mBMapMan); mMapView = (MapView) findViewById(R.id.bmapsView);//地图控件,不添加的话,就不用写。 mMapView.setBuiltInZoomControls(true); //设置启用内置的缩放控件 MapController mMapController = mMapView.getController(); // 得到mMapView的控制权,可以用它控制和驱动平移和缩放 GeoPoint point = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)); //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6) mMapController.setCenter(point); //设置地图中心点 mMapController.setZoom(14); //设置地图zoom级别 myMKSearch = new MKSearch(); //初始化 myMKSearch.init(mBMapMan, new MKSearchListener(){ @Override public void onGetPoiResult(MKPoiResult result, int type, int error) { } public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { } public void onGetTransitRouteResult(MKTransitRouteResult res, int error) { if (res == null) {return;} TransitOverlay transitOverlay = new TransitOverlay(YingTransitActivity.this, mMapView); // 此处仅展示一个方案作为示例 transitOverlay.setData(res.getPlan(0)); mMapView.getOverlays().add(transitOverlay); mMapView.invalidate(); //刷新地图 } public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { } public void onGetAddrResult(MKAddrInfo res, int error) { } public void onGetBusDetailResult(MKBusLineResult result, int error) { } @Override public void onGetSuggestionResult(MKSuggestionResult result, int error) { } }); /** 公交导航查询 **/ MKPlanNode start = new MKPlanNode(); start.name = "王府井";//关键字方式 //start.pt = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));//经纬度方式 MKPlanNode end = new MKPlanNode(); end.name = "西单"; //关键词方式 //end.pt = new GeoPoint(40057031, 116307852);//经纬度方式 myMKSearch.setTransitPolicy(MKSearch.EBUS_NO_SUBWAY); //公交策略:EBUS_TIME_FIRST:时间优先;EBUS_TRANSFER_FIRST:少换乘;EBUS_WALK_FIRST:少步行;EBUS_NO_SUBWAY: 非地铁 myMKSearch.transitSearch("北京", start, end); // 必须设置城市名。start和end可通过关键字,坐标两种方式指定,但必须使用MKPlanNode接口。 } protected boolean isRouteDisplayed() { return false; } /** 引入方法管理API **/ @Override protected void onDestroy() { if (mBMapMan != null) { mBMapMan.destroy(); mBMapMan = null; } super.onDestroy(); } @Override protected void onPause() { if (mBMapMan != null) { mBMapMan.stop(); } super.onPause(); } @Override protected void onResume() { if (mBMapMan != null) { mBMapMan.start(); } super.onResume(); } }