/*
* Copyright (C) 2016 Baidu, Inc. All Rights Reserved.
*/
package com.baidu.mapapi.overlayutil;
import java.util.ArrayList;
import java.util.List;
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.OverlayOptions;
import com.baidu.mapapi.map.Polyline;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.search.route.MassTransitRouteLine;
import android.graphics.Color;
import android.os.Bundle;
public class MassTransitRouteOverlay extends OverlayManager {
private MassTransitRouteLine mRouteLine;
private boolean isSameCity;
/**
* 构造函数
*
* @param baiduMap
* 该TransitRouteOverlay引用的 BaiduMap 对象
*/
public MassTransitRouteOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
/**
* 设置路线数据
*
* @param routeOverlay
* 路线数据
*/
public void setData(MassTransitRouteLine routeOverlay) {
this.mRouteLine = routeOverlay;
}
public void setSameCity( boolean sameCity ) {
isSameCity = sameCity;
}
/**
* 覆写此方法以改变默认起点图标
*
* @return 起点图标
*/
public BitmapDescriptor getStartMarker() {
return null;
}
/**
* 覆写此方法以改变默认终点图标
*
* @return 终点图标
*/
public BitmapDescriptor getTerminalMarker() {
return null;
}
public int getLineColor() {
return 0;
}
@Override
public List<OverlayOptions> getOverlayOptions() {
if (mRouteLine == null) {
return null;
}
List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>();
List<List<MassTransitRouteLine.TransitStep>> steps = mRouteLine.getNewSteps();
if (isSameCity ) {
// 同城 (同城时,每个steps的get(i)对应的List是一条step的不同方案,此处都选第一条进行绘制,即get(0))
// step node
for ( int i = 0; i < steps.size(); i++ ) {
MassTransitRouteLine.TransitStep step = steps.get(i).get(0);
Bundle b = new Bundle();
b.putInt("index", i + 1);
if (step.getStartLocation() != null) {
overlayOptionses.add((new MarkerOptions()).position(step.getStartLocation())
.anchor(0.5f, 0.5f).zIndex(10).extraInfo(b).icon(getIconForStep(step)));
}
// 最后一个终点
if ( (i == steps.size() - 1) && (step.getEndLocation() != null)) {
overlayOptionses.add((new MarkerOptions()).position(step.getEndLocation())
.anchor(0.5f, 0.5f).zIndex(10)
.icon(getIconForStep(step))
);
}
}
// polyline
for ( int i = 0; i < steps.size(); i++ ) {
MassTransitRouteLine.TransitStep step = steps.get(i).get(0);
int color = 0;
if (step.getVehileType() != MassTransitRouteLine.TransitStep
.StepVehicleInfoType.ESTEP_WALK) {
// color = Color.argb(178, 0, 78, 255);
color = getLineColor() != 0 ? getLineColor() : Color.argb(178, 0, 78, 255);
} else {
// color = Color.argb(178, 88, 208, 0);
color = getLineColor() != 0 ? getLineColor() : Color.argb(178, 88, 208, 0);
}
overlayOptionses.add(new PolylineOptions()
.points(step.getWayPoints()).width(10).color(color)
.zIndex(0));
}
} else {
// 跨城 (跨城时,每个steps的get(i)对应的List是一条step的子路线sub_step,需要将它们全部拼接才是一条完整路线)
int stepSum = 0;
for (int i = 0; i < steps.size(); i++ ) {
stepSum += steps.get(i).size();
}
// step node
int k = 1;
for ( int i = 0; i < steps.size(); i++ ) {
for (int j = 0; j < steps.get(i).size(); j++ ) {
MassTransitRouteLine.TransitStep step = steps.get(i).get(j);
Bundle b = new Bundle();
b.putInt("index", k);
if (step.getStartLocation() != null) {
overlayOptionses.add((new MarkerOptions()).position(step.getStartLocation())
.anchor(0.5f, 0.5f).zIndex(10).extraInfo(b).icon(getIconForStep(step)));
}
// 最后一个终点
if ( (k == stepSum ) && (step.getEndLocation() != null)) {
overlayOptionses.add((new MarkerOptions()).position(step.getEndLocation())
.anchor(0.5f, 0.5f).zIndex(10).icon(getIconForStep(step)));
}
k++;
}
}
// polyline
for ( int i = 0; i < steps.size(); i++ ) {
for (int j = 0; j < steps.get(i).size(); j++ ) {
MassTransitRouteLine.TransitStep step = steps.get(i).get(j);
int color = 0;
if (step.getVehileType() != MassTransitRouteLine.TransitStep
.StepVehicleInfoType.ESTEP_WALK) {
// color = Color.argb(178, 0, 78, 255);
color = getLineColor() != 0 ? getLineColor() : Color.argb(178, 0, 78, 255);
} else {
// color = Color.argb(178, 88, 208, 0);
color = getLineColor() != 0 ? getLineColor() : Color.argb(178, 88, 208, 0);
}
if (step.getWayPoints() != null ) {
overlayOptionses.add(new PolylineOptions()
.points(step.getWayPoints()).width(10).color(color)
.zIndex(0));
}
}
}
}
// 起点
if (mRouteLine.getStarting() != null && mRouteLine.getStarting().getLocation() != null) {
overlayOptionses.add((new MarkerOptions()).position(mRouteLine.getStarting().getLocation())
.icon(getStartMarker() != null
? getStartMarker() : BitmapDescriptorFactory.fromAssetWithDpi("Icon_start.png"))
.zIndex(10));
}
// 终点
if (mRouteLine.getTerminal() != null && mRouteLine.getTerminal().getLocation() != null) {
overlayOptionses
.add((new MarkerOptions())
.position(mRouteLine.getTerminal().getLocation())
.icon(getTerminalMarker() != null ? getTerminalMarker() :
BitmapDescriptorFactory
.fromAssetWithDpi("Icon_end.png"))
.zIndex(10));
}
return overlayOptionses;
}
private BitmapDescriptor getIconForStep(MassTransitRouteLine.TransitStep step) {
switch (step.getVehileType()) {
case ESTEP_WALK:
return BitmapDescriptorFactory.fromAssetWithDpi("Icon_walk_route.png");
case ESTEP_TRAIN:
return BitmapDescriptorFactory.fromAssetWithDpi("Icon_subway_station.png");
case ESTEP_DRIVING:
case ESTEP_COACH:
case ESTEP_PLANE:
case ESTEP_BUS:
return BitmapDescriptorFactory.fromAssetWithDpi("Icon_bus_station.png");
default:
return null;
}
}
@Override
public boolean onMarkerClick(Marker marker) {
return false;
}
@Override
public boolean onPolylineClick(Polyline polyline) {
return false;
}
}