View Javadoc
1   package org.opentrafficsim.road.network;
2   
3   import java.util.HashMap;
4   import java.util.Map;
5   
6   import org.djutils.immutablecollections.Immutable;
7   import org.djutils.immutablecollections.ImmutableHashMap;
8   import org.djutils.immutablecollections.ImmutableMap;
9   import org.opentrafficsim.core.compatibility.GTUCompatibility;
10  import org.opentrafficsim.core.gtu.GTUType;
11  import org.opentrafficsim.core.network.LongitudinalDirectionality;
12  import org.opentrafficsim.core.network.OTSNetwork;
13  import org.opentrafficsim.road.network.lane.LaneType;
14  
15  /**
16   * OTSRoadNetwork adds a number of methods to the Network class that are specific for roads, such as the LaneTypes. <br>
17   * <br>
18   * Copyright (c) 2003-2018 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
19   * for project information <a href="https://www.simulation.tudelft.nl/" target="_blank">www.simulation.tudelft.nl</a>. The
20   * source code and binary code of this software is proprietary information of Delft University of Technology.
21   * @author <a href="https://www.tudelft.nl/averbraeck" target="_blank">Alexander Verbraeck</a>
22   */
23  public class OTSRoadNetwork extends OTSNetwork implements RoadNetwork
24  {
25      /** */
26      private static final long serialVersionUID = 1L;
27  
28      /** LaneTypes registered for this network. */
29      private Map<String, LaneType> laneTypeMap = new HashMap<>();
30  
31      /**
32       * Construction of an empty network.
33       * @param id String; the network id.
34       * @param addDefaultTypes add the default GTUTypes, LinkTypesand LaneTypes, or not
35       */
36      public OTSRoadNetwork(final String id, final boolean addDefaultTypes)
37      {
38          super(id, addDefaultTypes);
39          if (addDefaultTypes)
40          {
41              addDefaultLaneTypes();
42          }
43      }
44  
45      /** {@inheritDoc} */
46      @Override
47      public void addDefaultLaneTypes()
48      {
49          GTUCompatibility<LaneType> noTrafficCompatibility = new GTUCompatibility<>((LaneType) null);
50          new LaneType("NONE", noTrafficCompatibility, this);
51          GTUCompatibility<LaneType> roadCompatibility = new GTUCompatibility<>((LaneType) null);
52          roadCompatibility.addAllowedGTUType(getGtuType(GTUType.DEFAULTS.ROAD_USER), LongitudinalDirectionality.DIR_BOTH);
53          LaneType twoWayLane = new LaneType("TWO_WAY_LANE", roadCompatibility, this);
54          new LaneType("RURAL_ROAD", twoWayLane, new GTUCompatibility<>(roadCompatibility), this);
55          new LaneType("URBAN_ROAD", twoWayLane, new GTUCompatibility<>(roadCompatibility), this);
56          new LaneType("RESIDENTIAL_ROAD", twoWayLane, new GTUCompatibility<>(roadCompatibility), this);
57          GTUCompatibility<LaneType> oneWayLaneCompatibility = new GTUCompatibility<>(roadCompatibility);
58          oneWayLaneCompatibility.addAllowedGTUType(getGtuType(GTUType.DEFAULTS.ROAD_USER), LongitudinalDirectionality.DIR_PLUS);
59          oneWayLaneCompatibility.addAllowedGTUType(getGtuType(GTUType.DEFAULTS.PEDESTRIAN), LongitudinalDirectionality.DIR_BOTH);
60          new LaneType("ONE_WAY_LANE", oneWayLaneCompatibility, this);
61          GTUCompatibility<LaneType> highwayLaneCompatibility = new GTUCompatibility<>(oneWayLaneCompatibility)
62                  .addAllowedGTUType(getGtuType(GTUType.DEFAULTS.PEDESTRIAN), LongitudinalDirectionality.DIR_NONE);
63          new LaneType("FREEWAY", highwayLaneCompatibility, this);
64          new LaneType("HIGHWAY", highwayLaneCompatibility, this);
65          GTUCompatibility<LaneType> busLaneCompatibility = new GTUCompatibility<>(roadCompatibility);
66          busLaneCompatibility.addAllowedGTUType(getGtuType(GTUType.DEFAULTS.BUS), LongitudinalDirectionality.DIR_BOTH);
67          busLaneCompatibility.addAllowedGTUType(getGtuType(GTUType.DEFAULTS.ROAD_USER), LongitudinalDirectionality.DIR_NONE);
68          new LaneType("BUS_LANE", busLaneCompatibility, this);
69          GTUCompatibility<LaneType> mopedAndBicycleLaneCompatibility = new GTUCompatibility<>(roadCompatibility);
70          mopedAndBicycleLaneCompatibility.addAllowedGTUType(getGtuType(GTUType.DEFAULTS.BICYCLE),
71                  LongitudinalDirectionality.DIR_BOTH);
72          mopedAndBicycleLaneCompatibility.addAllowedGTUType(getGtuType(GTUType.DEFAULTS.ROAD_USER),
73                  LongitudinalDirectionality.DIR_NONE);
74          new LaneType("MOPED_PATH", mopedAndBicycleLaneCompatibility, this);
75          GTUCompatibility<LaneType> bicycleOnlyCompatibility = new GTUCompatibility<>(mopedAndBicycleLaneCompatibility);
76          bicycleOnlyCompatibility.addAllowedGTUType(getGtuType(GTUType.DEFAULTS.MOPED), LongitudinalDirectionality.DIR_NONE);
77          new LaneType("BICYCLE_PATH", bicycleOnlyCompatibility, this);
78          GTUCompatibility<LaneType> pedestriansOnly = new GTUCompatibility<>(roadCompatibility);
79          pedestriansOnly.addAllowedGTUType(getGtuType(GTUType.DEFAULTS.ROAD_USER), LongitudinalDirectionality.DIR_NONE);
80          new LaneType("FOOTPATH", pedestriansOnly, this);
81      }
82  
83      /** {@inheritDoc} */
84      @Override
85      public void addLaneType(final LaneType laneType)
86      {
87          this.laneTypeMap.put(laneType.getId(), laneType);
88      }
89  
90      /** {@inheritDoc} */
91      @Override
92      public LaneType getLaneType(final String laneTypeId)
93      {
94          return this.laneTypeMap.get(laneTypeId);
95      }
96  
97      /** {@inheritDoc} */
98      @Override
99      public LaneType getLaneType(final LaneType.DEFAULTS laneTypeEnum)
100     {
101         return this.laneTypeMap.get(laneTypeEnum.getId());
102     }
103 
104     /** {@inheritDoc} */
105     @Override
106     public ImmutableMap<String, LaneType> getLaneTypes()
107     {
108         return new ImmutableHashMap<>(this.laneTypeMap, Immutable.WRAP);
109     }
110 
111 }