1 package org.opentrafficsim.core.network.factory;
2
3 import java.awt.Color;
4 import java.rmi.RemoteException;
5
6 import javax.naming.NamingException;
7
8 import org.opentrafficsim.core.dsol.OTSAnimatorInterface;
9 import org.opentrafficsim.core.dsol.OTSDEVSSimulatorInterface;
10 import org.opentrafficsim.core.network.LateralDirectionality;
11 import org.opentrafficsim.core.network.LongitudinalDirectionality;
12 import org.opentrafficsim.core.network.NetworkException;
13 import org.opentrafficsim.core.network.animation.LaneAnimation;
14 import org.opentrafficsim.core.network.geotools.LinearGeometry;
15 import org.opentrafficsim.core.network.geotools.NodeGeotools;
16 import org.opentrafficsim.core.network.lane.CrossSectionLink;
17 import org.opentrafficsim.core.network.lane.Lane;
18 import org.opentrafficsim.core.network.lane.LaneType;
19 import org.opentrafficsim.core.unit.FrequencyUnit;
20 import org.opentrafficsim.core.unit.LengthUnit;
21 import org.opentrafficsim.core.value.vdouble.scalar.DoubleScalar;
22 import org.opentrafficsim.core.value.vdouble.scalar.DoubleScalar.Rel;
23
24 import com.vividsolutions.jts.geom.Coordinate;
25 import com.vividsolutions.jts.geom.GeometryFactory;
26 import com.vividsolutions.jts.geom.LineString;
27
28
29
30
31
32
33
34
35
36
37 public final class LaneFactory
38 {
39
40 private LaneFactory()
41 {
42
43 }
44
45
46
47
48
49
50
51
52
53 public static CrossSectionLink<?, ?> makeLink(final String name, final NodeGeotools.STR from,
54 final NodeGeotools.STR to, final Coordinate[] intermediateCoordinates)
55 {
56 int coordinateCount = 2 + (null == intermediateCoordinates ? 0 : intermediateCoordinates.length);
57 Coordinate[] coordinates = new Coordinate[coordinateCount];
58 coordinates[0] = new Coordinate(from.getPoint().x, from.getPoint().y, 0);
59 coordinates[coordinates.length - 1] = new Coordinate(to.getPoint().x, to.getPoint().y, 0);
60 if (null != intermediateCoordinates)
61 {
62 for (int i = 0; i < intermediateCoordinates.length; i++)
63 {
64 coordinates[i + 1] = new Coordinate(intermediateCoordinates[i]);
65 }
66 }
67 GeometryFactory factory = new GeometryFactory();
68 LineString lineString = factory.createLineString(coordinates);
69 @SuppressWarnings({"unchecked", "rawtypes"})
70 CrossSectionLink<?, ?> link =
71 new CrossSectionLink(name, from, to, new DoubleScalar.Rel<LengthUnit>(lineString.getLength(),
72 LengthUnit.METER));
73 try
74 {
75 new LinearGeometry(link, lineString, null);
76 }
77 catch (NetworkException exception)
78 {
79 throw new Error("Network exception in LinearGeometry");
80 }
81 return link;
82 }
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 private static Lane makeLane(final CrossSectionLink<?, ?> link, final LaneType<String> laneType,
100 final DoubleScalar.Rel<LengthUnit> latPosAtStart, Rel<LengthUnit> latPosAtEnd,
101 final DoubleScalar.Rel<LengthUnit> width, final OTSDEVSSimulatorInterface simulator)
102 throws RemoteException, NamingException, NetworkException
103 {
104 DoubleScalar.Abs<FrequencyUnit> f2000 = new DoubleScalar.Abs<FrequencyUnit>(2000.0, FrequencyUnit.PER_HOUR);
105 Lane result =
106 new Lane(link, latPosAtStart, latPosAtEnd, width, width, laneType, LongitudinalDirectionality.FORWARD,
107 f2000);
108 if (simulator instanceof OTSAnimatorInterface)
109 {
110 new LaneAnimation(result, simulator, Color.LIGHT_GRAY);
111 }
112 return result;
113 }
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128 public static Lane makeLane(final String name, final NodeGeotools.STR from, final NodeGeotools.STR to,
129 final Coordinate[] intermediateCoordinates, final LaneType<String> laneType,
130 final OTSDEVSSimulatorInterface simulator) throws RemoteException, NamingException, NetworkException
131 {
132 DoubleScalar.Rel<LengthUnit> width = new DoubleScalar.Rel<LengthUnit>(4.0, LengthUnit.METER);
133 final CrossSectionLink<?, ?> link = makeLink(name, from, to, intermediateCoordinates);
134 DoubleScalar.Rel<LengthUnit> latPos = new DoubleScalar.Rel<LengthUnit>(0.0, LengthUnit.METER);
135 return makeLane(link, laneType, latPos, latPos, width, simulator);
136 }
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156 public static Lane[] makeMultiLane(final String name, final NodeGeotools.STR from, final NodeGeotools.STR to,
157 final Coordinate[] intermediateCoordinates, final int laneCount, int laneOffsetAtStart,
158 int laneOffsetAtEnd, final LaneType<String> laneType, final OTSDEVSSimulatorInterface simulator)
159 throws RemoteException, NamingException, NetworkException
160 {
161 DoubleScalar.Rel<LengthUnit> width = new DoubleScalar.Rel<LengthUnit>(laneCount * 4.0, LengthUnit.METER);
162 final CrossSectionLink<?, ?> link = makeLink(name, from, to, intermediateCoordinates);
163 Lane[] result = new Lane[laneCount];
164 width = new DoubleScalar.Rel<LengthUnit>(4.0, LengthUnit.METER);
165 for (int laneIndex = 0; laneIndex < laneCount; laneIndex++)
166 {
167
168 DoubleScalar.Rel<LengthUnit> latPosAtStart =
169 new DoubleScalar.Rel<LengthUnit>((-0.5 - laneIndex - laneOffsetAtStart) * width.getSI(), LengthUnit.METER);
170 DoubleScalar.Rel<LengthUnit> latPosAtEnd =
171 new DoubleScalar.Rel<LengthUnit>((-0.5 - laneIndex - laneOffsetAtEnd) * width.getSI(), LengthUnit.METER);
172 result[laneIndex] = makeLane(link, laneType, latPosAtStart, latPosAtEnd, width, simulator);
173 }
174
175 for (int laneIndex = 1; laneIndex < laneCount; laneIndex++)
176 {
177 result[laneIndex - 1].addAccessibleAdjacentLane(result[laneIndex], LateralDirectionality.RIGHT);
178 result[laneIndex].addAccessibleAdjacentLane(result[laneIndex - 1], LateralDirectionality.LEFT);
179 }
180 return result;
181 }
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199 public static Lane[] makeMultiLane(final String name, final NodeGeotools.STR from, final NodeGeotools.STR to,
200 final Coordinate[] intermediateCoordinates, final int laneCount, final LaneType<String> laneType,
201 final OTSDEVSSimulatorInterface simulator) throws RemoteException, NamingException, NetworkException
202 {
203 return makeMultiLane(name, from, to, intermediateCoordinates, laneCount, 0, 0, laneType, simulator);
204 }
205
206 }