深入学习百度地图Android SDK v4.0.0【第三关】路线规划

在第二关我们说了如何查询公交路线图,但前提你得知道公交是几路公交!而一般人知道某个地点,就想去,而不是通过几路公交来查询!所以这关我们来说说如果查询两个地点之间的路线规划【1.骑行路线2.驾车路线3.公交路线4.步行路线】

第一步【路线搜索类和监听】RoutePlanSearch|OnGetRoutePlanResultListener

和公交线路查询一样,直接用newInstance()得到对象
//路径规划搜索接口
routePlanSearch = RoutePlanSearch.newInstance();
routePlanSearch.setOnGetRoutePlanResultListener(this);

第二步【通过调用不同的方法进行查询】

  /**
     * 2.各种路线规划的查询
     */
case R.id.btn_search_biking:
    //骑行路线
    routePlanSearch.bikingSearch(new BikingRoutePlanOption().from(fromPlanNode).to(toPlanNode));
    layoutBusSearch.setVisibility(View.GONE);
    break;
case R.id.btn_search_car:
    //驾车路线
    routePlanSearch.drivingSearch(new DrivingRoutePlanOption().from(fromPlanNode).to(toPlanNode));
    layoutBusSearch.setVisibility(View.GONE);
    break;
case R.id.btn_search_bus:
    //换乘公共交通工具的路线
    routePlanSearch.transitSearch(new TransitRoutePlanOption().city(etCity.getText().toString()).from(fromPlanNode).to(toPlanNode));
    layoutBusSearch.setVisibility(View.GONE);
    break;
case R.id.btn_search_walk:
    //步行路线
    routePlanSearch.walkingSearch(new WalkingRoutePlanOption().from(fromPlanNode).to(toPlanNode));
    layoutBusSearch.setVisibility(View.GONE);
    break;

第三部【得到不同的回到结果,并添加覆盖物到地图上】

a.首先初始化各种覆盖物
//公交路线覆盖物,并设置路线的点击事件
overlay = new BusLineOverlay(mBaiduMap);
//骑行覆盖物添加并监听
bikingOverlay = new BikingRouteOverlay(mBaiduMap);
//驾车覆盖物添加并监听
 drivingOverlay= new DrivingRouteOverlay(mBaiduMap);
//换乘覆盖物添加并监听
transOverlay = new TransitRouteOverlay(mBaiduMap);
//步行覆盖物添加并监听
walkingOverlay = new WalkingRouteOverlay(mBaiduMap);
//TODO: 添加各种路线覆盖物的点击事件
mBaiduMap.setOnMarkerClickListener(overlay);
mBaiduMap.setOnMarkerClickListener(bikingOverlay);
mBaiduMap.setOnMarkerClickListener(drivingOverlay);
mBaiduMap.setOnMarkerClickListener(transOverlay);
mBaiduMap.setOnMarkerClickListener(walkingOverlay);
b.然后根据不同的回调,把覆盖物添加到地图上面
/**
 * 以下四个方法是路线规划搜索监听后的回调
 * a.步行回调
 * @param walkingRouteResult
 */

@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
    if (walkingRouteResult == null || walkingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
        T.showLong(this, "抱歉,未找到结果");
        return;
    }
    L.i("线路条数:" + walkingRouteResult.getRouteLines().size());
    List<WalkingRouteLine> routeLines = walkingRouteResult.getRouteLines();
    mBaiduMap.clear();
    walkingOverlay.removeFromMap();
    walkingOverlay.setData(routeLines.get(0));
    walkingOverlay.addToMap();
    walkingOverlay.zoomToSpan();
}

/**
 * b.换乘路线结果回调
 * @param transitRouteResult
 */

@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
    if (transitRouteResult == null || transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
        T.showLong(this, "抱歉,未找到结果");
        return;
    }
    L.i("线路条数:" + transitRouteResult.getRouteLines().size());
    List<TransitRouteLine> routeLines = transitRouteResult.getRouteLines();
    mBaiduMap.clear();
    transOverlay.removeFromMap();
    transOverlay.setData(routeLines.get(0));
    transOverlay.addToMap();
    transOverlay.zoomToSpan();
}

/**
 * c.驾车路线结果回调
 *
 * @param drivingRouteResult
 */

@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
    if (drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
        T.showLong(this, "抱歉,未找到结果");
        return;
    }
    L.i("线路条数:" + drivingRouteResult.getRouteLines().size());
    List<DrivingRouteLine> routeLines = drivingRouteResult.getRouteLines();
    mBaiduMap.clear();
    drivingOverlay.removeFromMap();
    drivingOverlay.setData(routeLines.get(0));
    drivingOverlay.addToMap();
    drivingOverlay.zoomToSpan();
}

/**
 * d.骑行路线结果回调
 *
 * @param bikingRouteResult
 */

@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
    if (bikingRouteResult == null || bikingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
        T.showLong(this, "抱歉,未找到结果");
        return;
    }
    L.i("线路条数:" + bikingRouteResult.getRouteLines().size());
    List<BikingRouteLine> routeLines = bikingRouteResult.getRouteLines();
    mBaiduMap.clear();
    bikingOverlay.removeFromMap();
    bikingOverlay.setData(routeLines.get(0));
    bikingOverlay.addToMap();
    bikingOverlay.zoomToSpan();
}
总体代码BusLineMapActivity
package cq.cake.chwl.ui;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;

import com.baidu.mapapi.overlayutil.BikingRouteOverlay;
import com.baidu.mapapi.overlayutil.BusLineOverlay;
import com.baidu.mapapi.overlayutil.DrivingRouteOverlay;
import com.baidu.mapapi.overlayutil.TransitRouteOverlay;
import com.baidu.mapapi.overlayutil.WalkingRouteOverlay;
import com.baidu.mapapi.search.busline.BusLineResult;
import com.baidu.mapapi.search.busline.BusLineSearch;
import com.baidu.mapapi.search.busline.BusLineSearchOption;
import com.baidu.mapapi.search.busline.OnGetBusLineSearchResultListener;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.baidu.mapapi.search.route.BikingRouteLine;
import com.baidu.mapapi.search.route.BikingRoutePlanOption;
import com.baidu.mapapi.search.route.BikingRouteResult;
import com.baidu.mapapi.search.route.DrivingRouteLine;
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.TransitRouteLine;
import com.baidu.mapapi.search.route.TransitRoutePlanOption;
import com.baidu.mapapi.search.route.TransitRouteResult;
import com.baidu.mapapi.search.route.WalkingRouteLine;
import com.baidu.mapapi.search.route.WalkingRoutePlanOption;
import com.baidu.mapapi.search.route.WalkingRouteResult;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cq.cake.base.BaseToolbarMapActivity;
import cq.cake.chwl.R;
import cq.cake.util.L;
import cq.cake.util.T;

/**
 * 公交路线地图
 * 1.首先从城市检索中查询出公交路线类型的PoiInfo
 * 2.更具PoiInfo的类型筛选出是公交路线的检索,并添加到集合中
 * 3.用BusLineSearch分别查询,集合中数据
 */
public class BusLineMapActivity extends BaseToolbarMapActivity implements OnGetBusLineSearchResultListener, OnGetPoiSearchResultListener, OnGetRoutePlanResultListener {
    @BindView(R.id.et_start_bus_station)
    EditText etStartBusStation;
    @BindView(R.id.et_end_bus_station)
    EditText etEndBusStation;
    @BindView(R.id.btn_search_car)
    Button btnSearchCar;
    @BindView(R.id.btn_search_bus)
    Button btnSearchBus;
    @BindView(R.id.btn_search_walk)
    Button btnSearchWalk;
    @BindView(R.id.layout_bus_search)
    LinearLayout layoutBusSearch;
    @BindView(R.id.et_station_city)
    EditText etStationCity;
    @BindView(R.id.et_bus_num)
    EditText etBusNum;
    @BindView(R.id.layout_bus_station)
    LinearLayout layoutBusStation;
    @BindView(R.id.et_city)
    EditText etCity;
    @BindView(R.id.btn_search_biking)
    Button btnSearchBiking;
    @BindView(R.id.btn_station_search)
    Button btnStationSearch;
    @BindView(R.id.btn_station_pre)
    Button btnStationPre;
    @BindView(R.id.btn_station_next)
    Button btnStationNext;
    @BindView(R.id.layout_station_pre_next)
    LinearLayout layoutStationPreNext;


    private PoiSearch poiSearch;//检索接口
    private BusLineSearch busLineSearch;//公交线路查询接口
    private RoutePlanSearch routePlanSearch;//路径规划搜索接口
    private List<String> busLines = new ArrayList<>();
    private int uidPostion = 0;//当前选中第几条路线

    private BusLineOverlay overlay; // 公交路线绘制对象
    private BikingRouteOverlay bikingOverlay;
    private DrivingRouteOverlay drivingOverlay;
    private TransitRouteOverlay transOverlay;
    private WalkingRouteOverlay walkingOverlay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bus_line_map);
        ButterKnife.bind(this);
        init();
        onEvent();
    }

    private void onEvent() {

    }

    public void init() {
        toolbar.setLogo(R.mipmap.bus_128);
        //检索查询初始化并监听
        poiSearch = PoiSearch.newInstance();
        poiSearch.setOnGetPoiSearchResultListener(this);
        //路线查询初始化并监听
        busLineSearch = BusLineSearch.newInstance();
        busLineSearch.setOnGetBusLineSearchResultListener(this);
        //路径规划搜索接口
        routePlanSearch = RoutePlanSearch.newInstance();
        routePlanSearch.setOnGetRoutePlanResultListener(this);


        //公交路线覆盖物,并设置路线的点击事件
        overlay = new BusLineOverlay(mBaiduMap);
        //骑行覆盖物添加并监听
        bikingOverlay = new BikingRouteOverlay(mBaiduMap);
        //驾车覆盖物添加并监听
         drivingOverlay= new DrivingRouteOverlay(mBaiduMap);
        //换乘覆盖物添加并监听
        transOverlay = new TransitRouteOverlay(mBaiduMap);
        //步行覆盖物添加并监听
        walkingOverlay = new WalkingRouteOverlay(mBaiduMap);
        //TODO: 添加各种路线覆盖物的点击事件
        mBaiduMap.setOnMarkerClickListener(overlay);
        mBaiduMap.setOnMarkerClickListener(bikingOverlay);
        mBaiduMap.setOnMarkerClickListener(drivingOverlay);
        mBaiduMap.setOnMarkerClickListener(transOverlay);
        mBaiduMap.setOnMarkerClickListener(walkingOverlay);
    }


    /**
     * 【1】首先检索查询
     *
     * @param poiResult
     */
    @Override
    public void onGetPoiResult(PoiResult poiResult) {
        if (poiResult == null || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
            T.showShort(this, "抱歉,未找到结果");
            return;
        }
        if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {

            busLines.clear();
            List<PoiInfo> allPoi = poiResult.getAllPoi();
            if (allPoi == null || allPoi.size() == 0) return;
            for (int i = 0; i < allPoi.size(); i++) {
                PoiInfo poiInfo = allPoi.get(i);
                L.i("类型:" + poiInfo.type);
                //如果是公交类型的路线,就把它的UID添加到集合中
                if (poiInfo.type == PoiInfo.POITYPE.BUS_LINE) {
                    busLines.add(poiInfo.uid);
                }
            }
            if (busLines.size() == 0) return;
            uidPostion = 0;
            T.showLong(this, "发现" + busLines.size() + "条线路!");
            busLineSearch.searchBusLine(new BusLineSearchOption().city(etStationCity.getText().toString()).uid(busLines.get(uidPostion)));
        }
    }

    /**
     * 【2】从检索的结果中筛选出公交路线
     * 并将其添加到地图上
     * @param busLineResult
     */
    @Override
    public void onGetBusLineResult(BusLineResult busLineResult) {
        if (busLineResult == null || busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {
            T.showLong(this, "抱歉,未找到结果");
            return;
        }
        mBaiduMap.clear();
        overlay.removeFromMap();
        overlay.setData(busLineResult);
        overlay.addToMap();
        overlay.zoomToSpan();
        layoutStationPreNext.setVisibility(View.VISIBLE);
    }

    @Override
    public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
    }

    @Override
    public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_bus_map, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu1:
                layoutBusSearch.setVisibility(layoutBusSearch.isShown() ? View.GONE : View.VISIBLE);
                break;
            case R.id.menu2:
                layoutBusStation.setVisibility(layoutBusStation.isShown() ? View.GONE : View.VISIBLE);
                break;
        }
        return true;
    }

    @OnClick({R.id.btn_station_search,R.id.btn_station_pre,R.id.btn_station_next,R.id.btn_search_biking, R.id.btn_search_car, R.id.btn_search_bus, R.id.btn_search_walk})
    public void doClicks(View view) {
        //路径规划中的出行节点信息,出行节点包括:起点,终点,途经点
        PlanNode fromPlanNode = PlanNode.withCityNameAndPlaceName(etCity.getText().toString(), etStartBusStation.getText().toString());
        PlanNode toPlanNode = PlanNode.withCityNameAndPlaceName(etCity.getText().toString(), etEndBusStation.getText().toString());
        switch (view.getId()) {
            /**
             * 1.公交线路相关的查询
             */
            case R.id.btn_station_search:
                poiSearch.searchInCity(new PoiCitySearchOption().city(etStationCity.getText().toString()).keyword(etBusNum.getText().toString()));
                break;
            case R.id.btn_station_pre:
                if (uidPostion > 0) {
                    uidPostion--;
                    searchBusLine();
                }
                layoutBusStation.setVisibility(View.GONE);
                break;
            case R.id.btn_station_next:
                if (uidPostion < (busLines.size() - 1)) {
                    uidPostion++;
                    searchBusLine();
                }
                layoutBusStation.setVisibility(View.GONE);
                break;
                /**
                 * 2.各种路线规划的查询
                 */
            case R.id.btn_search_biking:
                //骑行路线
                routePlanSearch.bikingSearch(new BikingRoutePlanOption().from(fromPlanNode).to(toPlanNode));
                layoutBusSearch.setVisibility(View.GONE);
                break;
            case R.id.btn_search_car:
                //驾车路线
                routePlanSearch.drivingSearch(new DrivingRoutePlanOption().from(fromPlanNode).to(toPlanNode));
                layoutBusSearch.setVisibility(View.GONE);
                break;
            case R.id.btn_search_bus:
                //换乘公共交通工具的路线
                routePlanSearch.transitSearch(new TransitRoutePlanOption().city(etCity.getText().toString()).from(fromPlanNode).to(toPlanNode));
                layoutBusSearch.setVisibility(View.GONE);
                break;
            case R.id.btn_search_walk:
                //步行路线
                routePlanSearch.walkingSearch(new WalkingRoutePlanOption().from(fromPlanNode).to(toPlanNode));
                layoutBusSearch.setVisibility(View.GONE);
                break;

        }
    }

    private void searchBusLine() {
        L.i("当前查询的路线==" + uidPostion);
        busLineSearch.searchBusLine(new BusLineSearchOption().city(etStationCity.getText().toString()).uid(busLines.get(uidPostion)));

    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        poiSearch.destroy();
        busLineSearch.destroy();
    }

    /**
     * 以下四个方法是路线规划搜索监听后的回调
     * a.步行回调
     * @param walkingRouteResult
     */

    @Override
    public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
        if (walkingRouteResult == null || walkingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
            T.showLong(this, "抱歉,未找到结果");
            return;
        }
        L.i("线路条数:" + walkingRouteResult.getRouteLines().size());
        List<WalkingRouteLine> routeLines = walkingRouteResult.getRouteLines();
        mBaiduMap.clear();
        walkingOverlay.removeFromMap();
        walkingOverlay.setData(routeLines.get(0));
        walkingOverlay.addToMap();
        walkingOverlay.zoomToSpan();
    }

    /**
     * b.换乘路线结果回调
     * @param transitRouteResult
     */

    @Override
    public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
        if (transitRouteResult == null || transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
            T.showLong(this, "抱歉,未找到结果");
            return;
        }
        L.i("线路条数:" + transitRouteResult.getRouteLines().size());
        List<TransitRouteLine> routeLines = transitRouteResult.getRouteLines();
        mBaiduMap.clear();
        transOverlay.removeFromMap();
        transOverlay.setData(routeLines.get(0));
        transOverlay.addToMap();
        transOverlay.zoomToSpan();
    }

    /**
     * c.驾车路线结果回调
     *
     * @param drivingRouteResult
     */

    @Override
    public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
        if (drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
            T.showLong(this, "抱歉,未找到结果");
            return;
        }
        L.i("线路条数:" + drivingRouteResult.getRouteLines().size());
        List<DrivingRouteLine> routeLines = drivingRouteResult.getRouteLines();
        mBaiduMap.clear();
        drivingOverlay.removeFromMap();
        drivingOverlay.setData(routeLines.get(0));
        drivingOverlay.addToMap();
        drivingOverlay.zoomToSpan();
    }

    /**
     * d.骑行路线结果回调
     *
     * @param bikingRouteResult
     */

    @Override
    public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
        if (bikingRouteResult == null || bikingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
            T.showLong(this, "抱歉,未找到结果");
            return;
        }
        L.i("线路条数:" + bikingRouteResult.getRouteLines().size());
        List<BikingRouteLine> routeLines = bikingRouteResult.getRouteLines();
        mBaiduMap.clear();
        bikingOverlay.removeFromMap();
        bikingOverlay.setData(routeLines.get(0));
        bikingOverlay.addToMap();
        bikingOverlay.zoomToSpan();
    }


}

最后的效果图片:(1.骑行路线2.开车路线3.公交路线4.步行路线)





  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值