private void addRailwayMarkers(RouteRailwayItem railway) {
    LatLng Departureposition = AMapUtil.convertToLatLng(railway.getDeparturestop().getLocation());
    String Departuretitle = railway.getDeparturestop().getName() + "上车";
    String Departuresnippet = railway.getName();

    addStationMarker(
        new MarkerOptions()
            .position(Departureposition)
            .title(Departuretitle)
            .snippet(Departuresnippet)
            .anchor(0.5f, 0.5f)
            .visible(nodeIconVisible)
            .icon(getBusBitmapDescriptor()));

    LatLng Arrivalposition = AMapUtil.convertToLatLng(railway.getArrivalstop().getLocation());
    String Arrivaltitle = railway.getArrivalstop().getName() + "下车";
    String Arrivalsnippet = railway.getName();

    addStationMarker(
        new MarkerOptions()
            .position(Arrivalposition)
            .title(Arrivaltitle)
            .snippet(Arrivalsnippet)
            .anchor(0.5f, 0.5f)
            .visible(nodeIconVisible)
            .icon(getBusBitmapDescriptor()));
  }
  /** @param busStep */
  private void addWalkSteps(BusStep busStep) {
    RouteBusWalkItem routeBusWalkItem = busStep.getWalk();
    List<WalkStep> walkSteps = routeBusWalkItem.getSteps();
    for (int j = 0; j < walkSteps.size(); j++) {
      WalkStep walkStep = walkSteps.get(j);
      if (j == 0) {
        LatLng latLng = AMapUtil.convertToLatLng(walkStep.getPolyline().get(0));
        String road = walkStep.getRoad(); // 道路名字
        String instruction = getWalkSnippet(walkSteps); // 步行导航信息
        addWalkStationMarkers(latLng, road, instruction);
      }

      List<LatLng> listWalkPolyline = AMapUtil.convertArrList(walkStep.getPolyline());
      this.latLng = listWalkPolyline.get(listWalkPolyline.size() - 1);

      addWalkPolyline(listWalkPolyline);

      // 假如步行前一段的终点和下的起点有断开,断画直线连接起来,避免断线问题
      if (j < walkSteps.size() - 1) {
        LatLng lastLatLng = listWalkPolyline.get(listWalkPolyline.size() - 1);
        LatLng firstlatLatLng = AMapUtil.convertToLatLng(walkSteps.get(j + 1).getPolyline().get(0));
        if (!(lastLatLng.equals(firstlatLatLng))) {
          addWalkPolyline(lastLatLng, firstlatLatLng);
        }
      }
    }
  }
 /**
  * 通过此构造函数创建公交路线图层。
  *
  * @param context 当前activity。
  * @param amap 地图对象。
  * @param path 公交路径规划的一个路段。详见搜索服务模块的路径查询包(com.amap.api.services.route)中的类<strong> <a
  *     href="../../../../../../Search/com/amap/api/services/route/BusPath.html"
  *     title="com.amap.api.services.route中的类">BusPath</a></strong>。
  * @param start 起点坐标。详见搜索服务模块的核心基础包(com.amap.api.services.core)中的类 <strong><a
  *     href="../../../../../../Search/com/amap/api/services/core/LatLonPoint.html"
  *     title="com.amap.api.services.core中的类">LatLonPoint</a></strong>。
  * @param end 终点坐标。详见搜索服务模块的核心基础包(com.amap.api.services.core)中的类 <strong><a
  *     href="../../../../../../Search/com/amap/api/services/core/LatLonPoint.html"
  *     title="com.amap.api.services.core中的类">LatLonPoint</a></strong>。
  * @since V2.1.0
  */
 public BusRouteOverlay(
     Context context, AMap amap, BusPath path, LatLonPoint start, LatLonPoint end) {
   super(context);
   this.busPath = path;
   startPoint = AMapUtil.convertToLatLng(start);
   endPoint = AMapUtil.convertToLatLng(end);
   mAMap = amap;
 }
 /**
  * 如果换乘没有步行 检查bus最后一点和下一个step的bus起点是否一致
  *
  * @param busStep
  * @param busStep1
  */
 private void checkBusToNextBusNoWalk(BusStep busStep, BusStep busStep1) {
   LatLng endbusLatLng = AMapUtil.convertToLatLng(getLastBuslinePoint(busStep));
   LatLng startbusLatLng = AMapUtil.convertToLatLng(getFirstBuslinePoint(busStep1));
   if (startbusLatLng.latitude - endbusLatLng.latitude > 0.0001
       || startbusLatLng.longitude - endbusLatLng.longitude > 0.0001) {
     drawLineArrow(endbusLatLng, startbusLatLng); // 断线用带箭头的直线连?
   }
 }
 private void addTaxiStep(TaxiItem taxi) {
   addPolyLine(
       new PolylineOptions()
           .width(getRouteWidth())
           .color(getBusColor())
           .add(AMapUtil.convertToLatLng(taxi.getOrigin()))
           .add(AMapUtil.convertToLatLng(taxi.getDestination())));
 }
 /**
  * checkBusToNextBusNoWalk 和这个类似
  *
  * @param busStep
  * @param busStep1
  */
 private void checkBusEndToNextBusStart(BusStep busStep, BusStep busStep1) {
   LatLonPoint busLastPoint = getLastBuslinePoint(busStep);
   LatLng endbusLatLng = AMapUtil.convertToLatLng(busLastPoint);
   LatLonPoint busFirstPoint = getFirstBuslinePoint(busStep1);
   LatLng startbusLatLng = AMapUtil.convertToLatLng(busFirstPoint);
   if (!endbusLatLng.equals(startbusLatLng)) {
     drawLineArrow(endbusLatLng, startbusLatLng); //
   }
 }
 /**
  * 根据给定的参数,构造一个导航路线图层类对象。
  *
  * @param amap 地图对象。
  * @param path 导航路线规划方案。
  * @param start 起点
  * @param end 终点
  * @param throughPointList 途径点
  */
 public DriveRouteColorfulOverLay(
     AMap amap,
     DrivePath path,
     LatLonPoint start,
     LatLonPoint end,
     List<LatLonPoint> throughPointList) {
   mAMap = amap;
   drivePath = path;
   startPoint = AMapUtil.convertToLatLng(start);
   endPoint = AMapUtil.convertToLatLng(end);
   this.throughPointList = throughPointList;
 }
 private void addRailwayStep(RouteRailwayItem railway) {
   List<LatLng> railwaylistpoint = new ArrayList<LatLng>();
   List<RailwayStationItem> railwayStationItems = new ArrayList<RailwayStationItem>();
   railwayStationItems.add(railway.getDeparturestop());
   railwayStationItems.addAll(railway.getViastops());
   railwayStationItems.add(railway.getArrivalstop());
   for (int i = 0; i < railwayStationItems.size(); i++) {
     railwaylistpoint.add(AMapUtil.convertToLatLng(railwayStationItems.get(i).getLocation()));
   }
   addRailwayPolyline(railwaylistpoint);
 }
  private void addTaxiMarkers(TaxiItem taxiItem) {

    LatLng position = AMapUtil.convertToLatLng(taxiItem.getOrigin());
    String title = taxiItem.getmSname() + "打车";
    String snippet = "到终点";

    addStationMarker(
        new MarkerOptions()
            .position(position)
            .title(title)
            .snippet(snippet)
            .anchor(0.5f, 0.5f)
            .visible(nodeIconVisible)
            .icon(getDriveBitmapDescriptor()));
  }
  /** @param routeBusLineItem */
  private void addBusStationMarkers(RouteBusLineItem routeBusLineItem) {
    BusStationItem startBusStation = routeBusLineItem.getDepartureBusStation();
    LatLng position = AMapUtil.convertToLatLng(startBusStation.getLatLonPoint());
    String title = routeBusLineItem.getBusLineName();
    String snippet = getBusSnippet(routeBusLineItem);

    addStationMarker(
        new MarkerOptions()
            .position(position)
            .title(title)
            .snippet(snippet)
            .anchor(0.5f, 0.5f)
            .visible(nodeIconVisible)
            .icon(getBusBitmapDescriptor()));
  }
  /**
   * 添加公交路线到地图上。
   *
   * @since V2.1.0
   */
  public void addToMap() {
    /**
     * 绘制节点和线<br>
     * 细节情况较多<br>
     * 两个step之间,用step和step1区分<br>
     * 1.一个step内可能有步行和公交,然后有可能他们之间连接有断开<br>
     * 2.step的公交和step1的步行,有可能连接有断开<br>
     * 3.step和step1之间是公交换乘,且没有步行,需要把step的终点和step1的起点连起来<br>
     * 4.公交最后一站和终点间有步行,加入步行线路,还会有一些步行marker<br>
     * 5.公交最后一站和终点间无步行,之间连起来<br>
     */
    try {
      List<BusStep> busSteps = busPath.getSteps();
      for (int i = 0; i < busSteps.size(); i++) {
        BusStep busStep = busSteps.get(i);
        if (i < busSteps.size() - 1) {
          BusStep busStep1 = busSteps.get(i + 1); // 取得当前下一个BusStep对象
          // 假如步行和公交之间连接有断开,就把步行最后一个经纬度点和公交第一个经纬度点连接起来,避免断线问题
          if (busStep.getWalk() != null && busStep.getBusLine() != null) {
            checkWalkToBusline(busStep);
          }

          // 假如公交和步行之间连接有断开,就把上一公交经纬度点和下一步行第一个经纬度点连接起来,避免断线问题
          if (busStep.getBusLine() != null
              && busStep1.getWalk() != null
              && busStep1.getWalk().getSteps().size() > 0) {
            checkBusLineToNextWalk(busStep, busStep1);
          }
          // 假如两个公交换乘中间没有步行,就把上一公交经纬度点和下一步公交第一个经纬度点连接起来,避免断线问题
          if (busStep.getBusLine() != null
              && busStep1.getWalk() == null
              && busStep1.getBusLine() != null) {
            checkBusEndToNextBusStart(busStep, busStep1);
          }
          // 和上面的很类似
          if (busStep.getBusLine() != null
              && busStep1.getWalk() == null
              && busStep1.getBusLine() != null) {
            checkBusToNextBusNoWalk(busStep, busStep1);
          }
          if (busStep.getBusLine() != null && busStep1.getRailway() != null) {
            checkBusLineToNextRailway(busStep, busStep1);
          }
          if (busStep1.getWalk() != null
              && busStep1.getWalk().getSteps().size() > 0
              && busStep.getRailway() != null) {
            checkRailwayToNextWalk(busStep, busStep1);
          }

          if (busStep1.getRailway() != null && busStep.getRailway() != null) {
            checkRailwayToNextRailway(busStep, busStep1);
          }

          if (busStep.getRailway() != null && busStep1.getTaxi() != null) {
            checkRailwayToNextTaxi(busStep, busStep1);
          }
        }

        if (busStep.getWalk() != null && busStep.getWalk().getSteps().size() > 0) {
          addWalkSteps(busStep);
        } else {
          if (busStep.getBusLine() == null
              && busStep.getRailway() == null
              && busStep.getTaxi() == null) {
            addWalkPolyline(latLng, endPoint);
          }
        }
        if (busStep.getBusLine() != null) {
          RouteBusLineItem routeBusLineItem = busStep.getBusLine();
          addBusLineSteps(routeBusLineItem);
          addBusStationMarkers(routeBusLineItem);
          if (i == busSteps.size() - 1) {
            addWalkPolyline(AMapUtil.convertToLatLng(getLastBuslinePoint(busStep)), endPoint);
          }
        }
        if (busStep.getRailway() != null) {
          addRailwayStep(busStep.getRailway());
          addRailwayMarkers(busStep.getRailway());
          if (i == busSteps.size() - 1) {
            addWalkPolyline(
                AMapUtil.convertToLatLng(busStep.getRailway().getArrivalstop().getLocation()),
                endPoint);
          }
        }
        if (busStep.getTaxi() != null) {
          addTaxiStep(busStep.getTaxi());
          addTaxiMarkers(busStep.getTaxi());
        }
      }
      addStartAndEndMarker();

    } catch (Throwable e) {
      e.printStackTrace();
    }
  }
  private void addWalkPolyLineByLatLonPoints(LatLonPoint pointFrom, LatLonPoint pointTo) {
    LatLng latLngFrom = AMapUtil.convertToLatLng(pointFrom);
    LatLng latLngTo = AMapUtil.convertToLatLng(pointTo);

    addWalkPolyline(latLngFrom, latLngTo);
  }