RoutePlanSearch mRoutePlanSearch.bikingSearch((new BikingRoutePlanOption())
.from(stNode)
.to(enNode)
// ridingType 0 普通骑行,1 电动车骑行
// 默认普通骑行
.ridingType(1));
mRoutePlanSearch = RoutePlanSearch.newInstance();
mRoutePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
Log.d("onGetWalkingRouteResult", "onGetWalkingRouteResult");
}
@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
Log.d("onGetTransitRouteResult", "onGetTransitRouteResult");
}
@Override
public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {
Log.d("onGetMassTransitRoute", "onGetMassTransitRouteResult");
}
@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
Log.d("onGetDrivingRouteResult", "onGetDrivingRouteResult");
}
@Override
public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {
Log.d("onGetIndoorRouteResult", "onGetIndoorRouteResult");
}
@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
if (bikingRouteResult == null || bikingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(context, "路线规划失败", Toast.LENGTH_SHORT).show();
}
if (bikingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
//起终点或途经点地址有岐义,通过以下接口获取建议查询信息
//result.getSuggestAddrInfo()
Toast.makeText(context, "路线规划失败", Toast.LENGTH_SHORT).show();
return;
}
if (bikingRouteResult.error == SearchResult.ERRORNO.ST_EN_TOO_NEAR) {
Toast.makeText(context, "距离太近,无需规划骑行路线", Toast.LENGTH_SHORT).show();
return;
}
//创建BikingRouteOverlay实例
mBikingRouteOverlay = new BikingRouteOverlay(mBaiduMap);
if (bikingRouteResult.getRouteLines() != null && bikingRouteResult.getRouteLines().size() > 0) {
//获取路径规划数据,(以返回的第一条路线为例)
BikingRouteLine mBikingRouteLine = bikingRouteResult.getRouteLines().get(0);
displayDistanceAndDuration(mBikingRouteLine);
//为BikingRouteOverlay实例设置数据
mBikingRouteOverlay.setData(mBikingRouteLine);
//在地图上绘制BikingRouteOverlay
mBikingRouteOverlay.addToMap();
}
}
});
bikingSearch获取骑行规划的路线,并通过setOnGetRoutePlanResultListener进行监听绘制路线,通过mBikingRouteOverlay.addToMap();绘制到地图上。
通过点击addToMap()(ctrl+鼠标点击)
源码:
/**
* 添加骑行路线到地图中。
*/
public void addToMap() {
initPolylineOptions();
try {
List<RideStep> ridePaths = ridePath.getSteps();
for (int i = 0; i < ridePaths.size(); i++) {
RideStep rideStep = ridePaths.get(i);
LatLng latLng = AMapUtil.convertToLatLng(rideStep
.getPolyline().get(0));
addRideStationMarkers(rideStep, latLng);
addRidePolyLines(rideStep);
}
addStartAndEndMarker();
showPolyline();
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 初始化线段属性
*/
private void initPolylineOptions() {
if(walkStationDescriptor == null) {
walkStationDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.amap_ride);
}
mPolylineOptions = null;
mPolylineOptions = new PolylineOptions();
// mPolylineOptions.color(getDriveColor()).width(getRouteWidth());
// mPolylineOptions.color(getWalkColor()).width(getRouteWidth());
mPolylineOptions
.color(getDriveColor())
.setCustomTexture(BitmapDescriptorFactory.fromResource(R.drawable.map_alr))
.width(getRouteWidth());
}
可以看到mPolylineOptions.color、setCustomTexture和width来控制路线的颜色、形状和宽度
最终解决方式为重写BikingRouteOverlay,具体代码如下:
/*
* Copyright (C) 2016 Baidu, Inc. All Rights Reserved.
*/
package com.chinatower.fghd.customer.home;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Polyline;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.route.BikingRouteLine;
import java.util.ArrayList;
import java.util.List;
/**
* 用于显示骑行路线的Overlay
*/
public class BikingRouteOverlay extends OverlayManager {
private BikingRouteLine mRouteLine = null;
public BikingRouteOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
/**
* 设置路线数据。
*
* @param line 路线数据
*/
public void setData(BikingRouteLine line) {
mRouteLine = line;
}
@Override
public final List<OverlayOptions> getOverlayOptions() {
if (mRouteLine == null) {
return null;
}
List<OverlayOptions> overlayList = new ArrayList<OverlayOptions>();
if (mRouteLine.getStarting() != null) {
overlayList.add((new MarkerOptions())
.position(mRouteLine.getStarting().getLocation())
.icon(getStartMarker() != null ? getStartMarker() :
BitmapDescriptorFactory
.fromAssetWithDpi("Icon_start.png")).zIndex(0).yOffset(-50));
}
// terminal
if (mRouteLine.getTerminal() != null) {
overlayList
.add((new MarkerOptions())
.position(mRouteLine.getTerminal().getLocation())
.icon(getTerminalMarker() != null ? getTerminalMarker() :
BitmapDescriptorFactory
.fromAssetWithDpi("Icon_end.png"))
.zIndex(0).yOffset(-50));
}
// poly line list
if (mRouteLine.getAllStep() != null
&& mRouteLine.getAllStep().size() > 0) {
LatLng lastStepLastPoint = null;
for (BikingRouteLine.BikingStep step : mRouteLine.getAllStep()) {
List<LatLng> watPoints = step.getWayPoints();
if (watPoints != null) {
List<LatLng> points = new ArrayList<LatLng>();
if (lastStepLastPoint != null) {
points.add(lastStepLastPoint);
}
points.addAll(watPoints);
**//关键代码**
overlayList.add(new PolylineOptions().points(points).width(12)
.color(getLineColor() != 0 ? getLineColor() : Color.argb(100, 50, 69, 90)).zIndex(0));
lastStepLastPoint = watPoints.get(watPoints.size() - 1);
}
}
}
return overlayList;
}
/**
* 覆写此方法以改变默认起点图标
*
* @return 起点图标
*/
public BitmapDescriptor getStartMarker() {
return null;
}
public int getLineColor() {
return 0;
}
/**
* 覆写此方法以改变默认终点图标
*
* @return 终点图标
*/
public BitmapDescriptor getTerminalMarker() {
return null;
}
/**
* 处理点击事件
*
* @param i 被点击的step在
* {
@link BikingRouteLine#getAllStep()}
* 中的索引
* @return 是否处理了该点击事件
*/
public boolean onRouteNodeClick(int i) {
if (mRouteLine.getAllStep() != null
&& mRouteLine.getAllStep().get(i) != null) {
Log.i("baidumapsdk", "BikingRouteOverlay onRouteNodeClick");
}
return false;
}
@Override
public final boolean onMarkerClick(Marker marker) {
for (Overlay mMarker : mOverlayList) {
if (mMarker instanceof Marker && mMarker.equals(marker)) {
if (marker.getExtraInfo() != null) {
onRouteNodeClick(marker.getExtraInfo().getInt("index"));
}
}
}
return true;
}
@Override
public boolean onPolylineClick(Polyline polyline) {
// TODO Auto-generated method stub
return false;
}
}