1 package org.opentrafficsim.road.network.factory.vissim;
2
3 import java.io.Serializable;
4 import java.util.LinkedHashMap;
5 import java.util.List;
6 import java.util.Map;
7
8 import org.djunits.value.vdouble.scalar.Length;
9 import org.djunits.value.vdouble.scalar.Speed;
10 import org.opentrafficsim.core.gtu.GTUType;
11 import org.opentrafficsim.core.network.NetworkException;
12 import org.opentrafficsim.core.network.factory.xml.units.LengthUnits;
13 import org.opentrafficsim.core.network.factory.xml.units.SpeedUnits;
14 import org.opentrafficsim.road.network.lane.changing.LaneKeepingPolicy;
15 import org.w3c.dom.NamedNodeMap;
16 import org.w3c.dom.Node;
17 import org.w3c.dom.NodeList;
18 import org.xml.sax.SAXException;
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 class LaneTypeTag implements Serializable
52 {
53
54 private static final long serialVersionUID = 20150723L;
55
56
57 @SuppressWarnings("checkstyle:visibilitymodifier")
58 String name = null;
59
60
61 @SuppressWarnings("checkstyle:visibilitymodifier")
62 Map<GTUType, Speed> legalSpeedLimits = new LinkedHashMap<>();
63
64
65 @SuppressWarnings("checkstyle:visibilitymodifier")
66 Length defaultLaneWidth = null;
67
68
69 @SuppressWarnings("checkstyle:visibilitymodifier")
70 LaneKeepingPolicy defaultLaneKeepingPolicy = null;
71
72
73
74
75
76
77
78
79 @SuppressWarnings("checkstyle:needbraces")
80 static void parseLaneTypes(final NodeList nodeList, final VissimNetworkLaneParser parser)
81 throws SAXException, NetworkException
82 {
83 for (Node node : XMLParser.getNodes(nodeList, "LANETYPE"))
84 {
85 NamedNodeMap attributes = node.getAttributes();
86 LaneTypeTag laneTypeTag = new LaneTypeTag();
87
88 Node name = attributes.getNamedItem("NAME");
89 if (name == null)
90 {
91 throw new SAXException("LANETYPE: missing attribute NAME");
92 }
93 laneTypeTag.name = name.getNodeValue().trim();
94 if (parser.getLaneTypeTags().keySet().contains(laneTypeTag.name))
95 {
96 throw new SAXException("LANETYPE: NAME " + laneTypeTag.name + " defined twice");
97 }
98
99 Node width = attributes.getNamedItem("DEFAULTLANEWIDTH");
100 if (width != null)
101 {
102 laneTypeTag.defaultLaneWidth = LengthUnits.parseLength(width.getNodeValue());
103 }
104
105 Node lkp = attributes.getNamedItem("DEFAULTLANEKEEPING");
106 if (lkp != null)
107 {
108 laneTypeTag.defaultLaneKeepingPolicy = org.opentrafficsim.road.network.factory.vissim.units.LaneAttributes
109 .parseLaneKeepingPolicy(lkp.getNodeValue().trim());
110 }
111
112 List<Node> speedLimitList = XMLParser.getNodes(node.getChildNodes(), "SPEEDLIMIT");
113 if (speedLimitList.size() == 0)
114 {
115 throw new SAXException("LANETYPE: missing tag SPEEDLIMIT");
116 }
117 for (Node speedLimitNode : speedLimitList)
118 {
119 NamedNodeMap speedLimitAttributes = speedLimitNode.getAttributes();
120
121 Node gtuTypeName = speedLimitAttributes.getNamedItem("GTUTYPE");
122 if (gtuTypeName == null)
123 {
124 throw new NetworkException("LANETYPE: No GTUTYPE defined");
125 }
126 if (!parser.getGtuTypes().containsKey(gtuTypeName.getNodeValue().trim()))
127 {
128 throw new NetworkException(
129 "LANETYPE: " + laneTypeTag.name + " GTUTYPE " + gtuTypeName.getNodeValue().trim() + " not defined");
130 }
131 GTUType gtuType = parser.getGtuTypes().get(gtuTypeName.getNodeValue().trim());
132
133 Node speedNode = speedLimitAttributes.getNamedItem("LEGALSPEEDLIMIT");
134 if (speedNode == null)
135 {
136 throw new NetworkException(
137 "LANETYPE: " + laneTypeTag.name + " GTUTYPE " + gtuType.getId() + ": LEGALSPEEDLIMIT not defined");
138 }
139 Speed speed = SpeedUnits.parseSpeed(speedNode.getNodeValue().trim());
140
141 laneTypeTag.legalSpeedLimits.put(gtuType, speed);
142 }
143 parser.getLaneTypeTags().put(laneTypeTag.name, laneTypeTag);
144 }
145 }
146
147 }