/* * 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.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; } @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()) .title(step.getInstructions()) .anchor(0.5f, 0.5f).zIndex(20).extraInfo(b).icon(getIconForStep(step))); } // 最后一个终点 if ((i == steps.size() - 1) && (step.getEndLocation() != null)) { overlayOptionses.add((new MarkerOptions()).position(step.getEndLocation()) .title(step.getInstructions()) .anchor(0.5f, 0.5f).zIndex(20) .icon(getIconForStep(step)) ); } } // polyline for (int i = 0; i < steps.size(); i++) { MassTransitRouteLine.TransitStep step = steps.get(i).get(0); if (step.getWayPoints() != null && step.getWayPoints().size() > 1) { int color = getBusColor(); boolean dotted = false; if (step.getVehileType() == MassTransitRouteLine.TransitStep.StepVehicleInfoType.ESTEP_WALK) { color = getWalkColor(); dotted = true; } overlayOptionses.add(new PolylineOptions().points(step.getWayPoints()).dottedLine(dotted).width(getRouteWidth()).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()) .title(step.getInstructions()) .anchor(0.5f, 0.5f).zIndex(20).extraInfo(b).icon(getIconForStep(step))); } // 最后一个终点 if ((k == stepSum) && (step.getEndLocation() != null)) { overlayOptionses.add((new MarkerOptions()).position(step.getEndLocation()) .title(step.getInstructions()) .anchor(0.5f, 0.5f).zIndex(20).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); if (step.getWayPoints() != null && step.getWayPoints().size() > 1) { int color = getBusColor(); boolean dotted = false; if (step.getVehileType() == MassTransitRouteLine.TransitStep.StepVehicleInfoType.ESTEP_WALK) { color = getWalkColor(); dotted = true; } overlayOptionses.add(new PolylineOptions().points(step.getWayPoints()).dottedLine(dotted).width(getRouteWidth()).color(color).zIndex(0)); } } } } // 起点 if (mRouteLine.getStarting() != null && mRouteLine.getStarting().getLocation() != null) { overlayOptionses.add((new MarkerOptions()).title(mRouteLine.getStarting().getTitle()).position(mRouteLine.getStarting().getLocation()).icon(getStartMarker()).zIndex(20)); } // 终点 if (mRouteLine.getTerminal() != null && mRouteLine.getTerminal().getLocation() != null) { overlayOptionses.add((new MarkerOptions()).title(mRouteLine.getTerminal().getTitle()).position(mRouteLine.getTerminal().getLocation()).icon(getTerminalMarker()).zIndex(20)); } 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; } }