2016年09月23日 14:49:02 百度地图的路线规划还是比较容易的,需要注意的就是实现OnGetRoutePlanResultListener接口。
会重写四个方法
<span style="font-family:SimSun;"> void onGetWalkingRouteResult(WalkingRouteResult var1);
void onGetTransitRouteResult(TransitRouteResult var1);
void onGetDrivingRouteResult(DrivingRouteResult var1);
void onGetBikingRouteResult(BikingRouteResult var1);</span>
没看懂没关系,下边我会一一解说
1.
<span style="font-family:SimSun;">void onGetWalkingRouteResult(WalkingRouteResult var1);</span> 这个方法是用来写不行路线规划的,var1则是百度返回的路线数据了
2.
<span style="font-family:SimSun;">void onGetTransitRouteResult(TransitRouteResult var1);</span> 这个则是乘车路线,包含公交,地铁,不行,以及以后的飞机,火车等,想想,我的哥,好厉害呦
3.
<span style="font-family:SimSun;">void onGetDrivingRouteResult(DrivingRouteResult var1);</span> 这个是自驾路线
4.
<span style="font-family:SimSun;">void onGetBikingRouteResult(BikingRouteResult var1);</span>
这个方法就是咱们经常说的绿色环保无污染的交通工具自行车了
当然还有需要注意的就是MyTransitRouteOverlay和MyWalkingRouteOverlay这两个类,这分别是自定义的,运用的是自己的起点和终点的图片,当然,如果你想用系统的,我也拦不住你,对不撒
<span style="font-family:SimSun;"> private class MyWalkingRouteOverlay extends WalkingRouteOverlay {
public MyWalkingRouteOverlay(BaiduMap baiduMap) {
public BitmapDescriptor getStartMarker() { return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
public BitmapDescriptor getTerminalMarker() { return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
<span style="font-family:SimSun;"> private class MyTransitRouteOverlay extends TransitRouteOverlay {
public MyTransitRouteOverlay(BaiduMap baiduMap) {
public BitmapDescriptor getStartMarker() { return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
public BitmapDescriptor getTerminalMarker() { return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
恩就是这么简单,其他的已经没有什么了,好了,废话不多说了,直接上代码,注释已经写的差不多了
activity类
<span style="font-family:SimSun;">import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.view.View; import android.view.Window; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast;
import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapPoi; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.search.core.RouteLine; import com.baidu.mapapi.search.core.SearchResult; import com.baidu.mapapi.search.route.BikingRouteResult; import com.baidu.mapapi.search.route.DrivingRoutePlanOption; import com.baidu.mapapi.search.route.DrivingRouteResult; import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener; import com.baidu.mapapi.search.route.PlanNode; import com.baidu.mapapi.search.route.RoutePlanSearch; import com.baidu.mapapi.search.route.TransitRoutePlanOption; import com.baidu.mapapi.search.route.TransitRouteResult; import com.baidu.mapapi.search.route.WalkingRoutePlanOption; import com.baidu.mapapi.search.route.WalkingRouteResult; import com.demo.demo_location.mapapi.overlayutil.DrivingRouteOverlay; import com.demo.demo_location.mapapi.overlayutil.TransitRouteOverlay; import com.demo.demo_location.mapapi.overlayutil.WalkingRouteOverlay;
* Created by 李博 on 2016/9/22. public class RouteLineActivity extends Activity implements View.OnClickListener, BaiduMap.OnMapClickListener, OnGetRoutePlanResultListener{
private MapView mMapView; private EditText et_start; private BaiduMap mBaiduMap; private RoutePlanSearch mSearch;
private boolean useDefaultIcon = false;
private TransitRouteResult nowResult = null;
private DrivingRouteResult nowResultd = null;
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.soso_layout); btn_walk = (Button) findViewById(R.id.btn_walk); btn_car = (Button) findViewById(R.id.btn_car); btn_bus = (Button) findViewById(R.id.btn_bus); et_end = (EditText) findViewById(R.id.et_end); et_start = (EditText) findViewById(R.id.et_start); mMapView = (MapView) findViewById(R.id.mapView); mBaiduMap = mMapView.getMap(); btn_bus.setOnClickListener(this); btn_car.setOnClickListener(this); btn_walk.setOnClickListener(this);
mBaiduMap.setOnMapClickListener(this); mSearch = RoutePlanSearch.newInstance(); mSearch.setOnGetRoutePlanResultListener(this);
public void onClick(View v) {
private void setBtn_walk(){ //设置起点 start = PlanNode.withCityNameAndPlaceName("北京", et_start.getText().toString()); end = PlanNode.withCityNameAndPlaceName("北京", et_end.getText().toString());
if(et_end.getText().toString().isEmpty() && et_start.getText().toString().isEmpty()){ Toast.makeText(getApplicationContext(), "起点和终点不能为空", Toast.LENGTH_SHORT).show(); mSearch.walkingSearch(new WalkingRoutePlanOption()
private void setBtn_car(){ start = PlanNode.withCityNameAndPlaceName("北京", et_start.getText().toString()); end = PlanNode.withCityNameAndPlaceName("北京", et_end.getText().toString()); if(et_end.getText().toString().isEmpty() && et_start.getText().toString().isEmpty()){ Toast.makeText(getApplicationContext(), "起点和终点不能为空", Toast.LENGTH_SHORT).show(); mSearch.drivingSearch((new DrivingRoutePlanOption()).from(start).to(end)); private void setBtn_bus(){ start = PlanNode.withCityNameAndPlaceName("北京", et_start.getText().toString()); end = PlanNode.withCityNameAndPlaceName("北京", et_end.getText().toString()); if(et_end.getText().toString().isEmpty() && et_start.getText().toString().isEmpty()){ Toast.makeText(getApplicationContext(), "起点和终点不能为空", Toast.LENGTH_SHORT).show(); mSearch.transitSearch((new TransitRoutePlanOption()) .from(start).city("北京").to(end));
public void onGetWalkingRouteResult(WalkingRouteResult result) { if(result == null || result.error != SearchResult.ERRORNO.NO_ERROR){ Toast.makeText(getApplicationContext(), "未找到结果", Toast.LENGTH_SHORT).show(); if(result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR){ // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息 // result.getSuggestAddrInfo()
if(result.error == SearchResult.ERRORNO.NO_ERROR){
route = result.getRouteLines().get(0); // TransitOverlay是baidu map api提供的用于在地图上显示公交换乘路线的Overlay WalkingRouteOverlay option = new MyWalkingRouteOverlay(mBaiduMap); mBaiduMap.setOnMarkerClickListener(option);
option.setData(result.getRouteLines().get(0));
public void onGetTransitRouteResult(final TransitRouteResult result) {
if(result == null || result.error != SearchResult.ERRORNO.NO_ERROR){ Toast.makeText(getApplicationContext(), "未找到结果", Toast.LENGTH_SHORT).show(); if(result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR){ // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息 // result.getSuggestAddrInfo()
if(result.error == SearchResult.ERRORNO.NO_ERROR){ if(result.getRouteLines().size() > 1){
MyTransitDlg myTransitDlg = new MyTransitDlg(RouteLineActivity.this, result.getRouteLines(), RouteLineAdapter.Type.TRANSIT_ROUTE); myTransitDlg.setOnItemInDlgClickLinster(new OnItemInDlgClickListener() { public void onItemClick(int position) { TransitRouteOverlay overlay = new MyTransitRouteOverlay(mBaiduMap); mBaiduMap.setOnMarkerClickListener(overlay); overlay.setData(result.getRouteLines().get(position)); } else if(result.getRouteLines().size() == 1){
route = result.getRouteLines().get(0); TransitRouteOverlay overlay = new TransitRouteOverlay(mBaiduMap); mBaiduMap.setOnMarkerClickListener(overlay); overlay.setData(result.getRouteLines().get(0));
public void onGetDrivingRouteResult(final DrivingRouteResult result) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(getApplicationContext(), "抱歉,未找到结果", Toast.LENGTH_SHORT).show(); if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) { // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息 // result.getSuggestAddrInfo() if (result.error == SearchResult.ERRORNO.NO_ERROR) {
if(result.getRouteLines().size() >1){
MyTransitDlg myTransitDlg = new MyTransitDlg(RouteLineActivity.this, result.getRouteLines(), RouteLineAdapter.Type.DRIVING_ROUTE); myTransitDlg.setOnItemInDlgClickLinster(new OnItemInDlgClickListener() { public void onItemClick(int position) {
route = nowResultd.getRouteLines().get(position); DrivingRouteOverlay overlay = new DrivingRouteOverlay(mBaiduMap); mBaiduMap.setOnMarkerClickListener(overlay); overlay.setData(nowResultd.getRouteLines().get(position));
} else if(result.getRouteLines().size() == 1){ route = result.getRouteLines().get(0); DrivingRouteOverlay overlay = new DrivingRouteOverlay(mBaiduMap);
mBaiduMap.setOnMarkerClickListener(overlay); overlay.setData(result.getRouteLines().get(0));
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
public void onMapClick(LatLng latLng) {
public boolean onMapPoiClick(MapPoi mapPoi) {
private class MyTransitRouteOverlay extends TransitRouteOverlay {
public MyTransitRouteOverlay(BaiduMap baiduMap) {
public BitmapDescriptor getStartMarker() { return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
public BitmapDescriptor getTerminalMarker() { return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
private class MyWalkingRouteOverlay extends WalkingRouteOverlay {
public MyWalkingRouteOverlay(BaiduMap baiduMap) {
public BitmapDescriptor getStartMarker() { return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
public BitmapDescriptor getTerminalMarker() { return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
protected void onPause() {
protected void onResume() {
protected void onDestroy() {
interface OnItemInDlgClickListener { public void onItemClick( int position);
class MyTransitDlg extends Dialog {
private List<? extends RouteLine> mtransitRouteLines; private ListView transitRouteList; private RouteLineAdapter mTransitAdapter;
OnItemInDlgClickListener onItemInDlgClickListener;
public MyTransitDlg(Context context, int theme) {
public MyTransitDlg(Context context, List< ? extends RouteLine> transitRouteLines, RouteLineAdapter.Type mtransitRouteLines = transitRouteLines; mTransitAdapter = new RouteLineAdapter( context, mtransitRouteLines , type); requestWindowFeature(Window.FEATURE_NO_TITLE);
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_transit_dialog);
transitRouteList = (ListView) findViewById(R.id.transitList); transitRouteList.setAdapter(mTransitAdapter);
transitRouteList.setOnItemClickListener( new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { onItemInDlgClickListener.onItemClick( position);
public void setOnItemInDlgClickLinster( OnItemInDlgClickListener itemListener) { onItemInDlgClickListener = itemListener;
因为乘车路线如果是多条的话是一个listview,所以,适配器在所难免了
adapter类
<span style="font-family:SimSun;">import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView;
import com.baidu.mapapi.search.core.RouteLine; import com.baidu.mapapi.search.route.DrivingRouteLine;
public class RouteLineAdapter extends BaseAdapter {
private List<? extends RouteLine> routeLines; private LayoutInflater layoutInflater;
public RouteLineAdapter(Context context, List<?extends RouteLine> routeLines, Type type) { this.routeLines = routeLines; layoutInflater = LayoutInflater.from( context);
return routeLines.size();
public Object getItem(int position) {
public long getItemId(int position) {
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = layoutInflater.inflate(R.layout.activity_transit_item, null); holder = new NodeViewHolder(); holder.name = (TextView) convertView.findViewById(R.id.transitName); holder.lightNum = (TextView) convertView.findViewById(R.id.lightNum); holder.dis = (TextView) convertView.findViewById(R.id.dis); convertView.setTag(holder); holder = (NodeViewHolder) convertView.getTag();
holder.name.setText("路线" + (position + 1)); int time = routeLines.get(position).getDuration(); if ( time / 3600 == 0 ) { holder.lightNum.setText( "大约需要:" + time / 60 + "分钟" ); holder.lightNum.setText( "大约需要:" + time / 3600 + "小时" + (time % 3600) / 60 + "分钟" ); holder.dis.setText("距离大约是:" + routeLines.get(position).getDistance());
DrivingRouteLine drivingRouteLine = (DrivingRouteLine) routeLines.get(position); holder.name.setText( "线路" + (position + 1)); holder.lightNum.setText( "红绿灯数:" + drivingRouteLine.getLightNum()); holder.dis.setText("拥堵距离为:" + drivingRouteLine.getCongestionDistance() + "米");
private class NodeViewHolder {
private TextView lightNum;
主布局<span style="font-family:SimSun;"><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas./apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/et_start"/>
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/et_end"/> android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"
android:id="@+id/btn_walk" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" />
android:id="@+id/btn_bus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" />
android:id="@+id/btn_car" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" />
<com.baidu.mapapi.map.MapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1"></com.baidu.mapapi.map.MapView>
listview的item布局
<span style="font-family:SimSun;"><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas./apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
android:id="@+id/transitName" android:layout_width="match_parent" android:layout_height="match_parent" />
android:id="@+id/lightNum" android:layout_width="match_parent" android:layout_height="match_parent" />
android:layout_width="match_parent" android:layout_height="match_parent" />
如果在出错的话,那就是图片了,自己百度找两张就可以了
但是问题来了,本菜在百度上找了半天,也没有找到公交路线详情,没办法,只能去百度地图API找了,结果百度给我的是
什么鬼,根本就没有公交详情乘车路线啊,是我没找到还是他们就没写出来,如果我没找到,那我继续找,如果是因为没有写出来,来来来,开发百度地图的那个,你过来,我保证不打死你,给你留半口气,好了,玩笑话,别当真
恩,百度地图路线规划就介绍到这里了,下篇准备写,百度地图的搜索地址。
百度地图给的需要写城市和地址两个,我要的是输入一个地址就可以定位的啊,反正我还没找到呢,有建议的,请保留,不服,你顺着点线爬过来打我啊。
以后更新路线规划并显示出详细的路线规划信息!!
|