Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4 : // This program and the accompanying materials are made available under the
5 : // terms of the Eclipse Public License 2.0 which is available at
6 : // https://www.eclipse.org/legal/epl-2.0/
7 : // This Source Code may also be made available under the following Secondary
8 : // Licenses when the conditions for such availability set forth in the Eclipse
9 : // Public License 2.0 are satisfied: GNU General Public License, version 2
10 : // or later which is available at
11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 : /****************************************************************************/
14 : /// @file NIImporter_SUMO.h
15 : /// @author Daniel Krajzewicz
16 : /// @author Jakob Erdmann
17 : /// @author Michael Behrisch
18 : /// @date Mon, 14.04.2008
19 : ///
20 : // Importer for networks stored in SUMO format
21 : /****************************************************************************/
22 : #pragma once
23 : #include <config.h>
24 :
25 : #include <string>
26 : #include <map>
27 : #include <utils/xml/SUMOSAXHandler.h>
28 : #include <utils/geom/GeoConvHelper.h>
29 : #include <utils/common/Parameterised.h>
30 : #include <netbuild/NBLoadedSUMOTLDef.h>
31 : #include "NIXMLTypesHandler.h"
32 :
33 :
34 : // ===========================================================================
35 : // class declarations
36 : // ===========================================================================
37 : class NBNetBuilder;
38 : class NBEdge;
39 : class OptionsCont;
40 :
41 :
42 : // ===========================================================================
43 : // class definitions
44 : // ===========================================================================
45 : /**
46 : * @class NIImporter_SUMO
47 : * @brief Importer for networks stored in SUMO format
48 : *
49 : */
50 : class NIImporter_SUMO : public SUMOSAXHandler {
51 : public:
52 : /** @brief Loads content of the optionally given SUMO file
53 : *
54 : * If the option "sumo-net-file" is set, the file stored therein is read and
55 : * the network definition stored therein is stored within the given network
56 : * builder.
57 : *
58 : * If the option "sumo-net-file" is not set, this method simply returns.
59 : *
60 : * The loading is done by parsing the network definition as an XML file
61 : * using the SAXinterface and handling the incoming data via this class'
62 : * methods.
63 : *
64 : * @param[in,out] oc The options to use (option no-internal-links may be modified)
65 : * @param[in] nb The network builder to fill
66 : */
67 : static void loadNetwork(OptionsCont& oc, NBNetBuilder& nb);
68 :
69 : /// begins the reading of a traffic lights logic
70 : static NBLoadedSUMOTLDef* initTrafficLightLogic(const SUMOSAXAttributes& attrs, NBLoadedSUMOTLDef* currentTL);
71 :
72 : /// adds a phase to the traffic lights logic currently build
73 : static void addPhase(const SUMOSAXAttributes& attrs, NBLoadedSUMOTLDef* currentTL);
74 :
75 : /// Parses network location description and registers it with GeoConveHelper::setLoaded
76 : static GeoConvHelper* loadLocation(const SUMOSAXAttributes& attrs, bool setLoaded = true);
77 :
78 : protected:
79 : /** @brief Constructor
80 : * @param[in] nc The network builder to fill
81 : */
82 : NIImporter_SUMO(NBNetBuilder& nb);
83 :
84 : /// @brief Destructor
85 : ~NIImporter_SUMO();
86 :
87 : /// @name inherited from GenericSAXHandler
88 : //@{
89 :
90 : /** @brief Called on the opening of a tag;
91 : *
92 : * In dependence to the obtained type, an appropriate parsing
93 : * method is called ("addEdge" if an edge encounters, f.e.).
94 : *
95 : * @param[in] element ID of the currently opened element
96 : * @param[in] attrs Attributes within the currently opened element
97 : * @exception ProcessError If something fails
98 : * @see GenericSAXHandler::myStartElement
99 : */
100 : void myStartElement(int element,
101 : const SUMOSAXAttributes& attrs);
102 :
103 :
104 : /** @brief Called when a closing tag occurs
105 : *
106 : * @param[in] element ID of the currently opened element
107 : * @exception ProcessError If something fails
108 : * @see GenericSAXHandler::myEndElement
109 : */
110 : void myEndElement(int element);
111 : //@}
112 :
113 :
114 : private:
115 : /// @brief load the network
116 : void _loadNetwork(OptionsCont& oc);
117 :
118 : /// @name Object instance parsing methods
119 : //@{
120 :
121 : /** @brief Parses an edge and stores the values in "myCurrentEdge"
122 : * @param[in] attrs The attributes to get the edge's values from
123 : */
124 : void addEdge(const SUMOSAXAttributes& attrs);
125 :
126 :
127 : /** @brief Parses a lane and stores the values in "myCurrentLane"
128 : * @param[in] attrs The attributes to get the lane's values from
129 : */
130 : void addLane(const SUMOSAXAttributes& attrs);
131 :
132 : /** @brief parses stop offsets for the current lane or edge
133 : * @param[in] attrs The attributes to get the stop offset specifics from
134 : */
135 : void addStopOffsets(const SUMOSAXAttributes& attrs, bool& ok);
136 :
137 : /** @brief Parses a junction and saves it in the node control
138 : * @param[in] attrs The attributes to get the junction's values from
139 : */
140 : void addJunction(const SUMOSAXAttributes& attrs);
141 :
142 :
143 : /** @brief Parses a request and saves selected attributes in myCurrentJunction
144 : * @param[in] attrs The attributes to get the junction's values from
145 : */
146 : void addRequest(const SUMOSAXAttributes& attrs);
147 :
148 :
149 : /** @brief Parses a connection and saves it
150 : * into the lane's definition stored in "myCurrentLane"
151 : * @param[in] attrs The attributes to get the connection from
152 : */
153 : void addConnection(const SUMOSAXAttributes& attrs);
154 :
155 : /** @brief Parses a prohibition and saves it
156 : * @param[in] attrs The attributes to get the connection from
157 : */
158 : void addProhibition(const SUMOSAXAttributes& attrs);
159 :
160 : /** @brief Parses a roundabout and stores it in myEdgeCont.
161 : * @param[in] attrs The attributes to get the roundabouts values from
162 : */
163 : void addRoundabout(const SUMOSAXAttributes& attrs);
164 :
165 : //@}
166 :
167 :
168 :
169 : private:
170 : /**
171 : * @struct Connection
172 : * @brief A connection description.
173 : */
174 : class Connection final : public Parameterised {
175 : public:
176 : /// @brief The id of the target edge
177 : std::string toEdgeID;
178 : /// @brief The index of the target lane
179 : int toLaneIdx;
180 : /// @brief The id of the traffic light that controls this connection
181 : std::string tlID;
182 : /// @brief The index of this connection within the controlling traffic light
183 : int tlLinkIndex;
184 : int tlLinkIndex2;
185 : /// @brief Information about being definitely free to drive (on-ramps)
186 : bool mayDefinitelyPass;
187 : /* @brief Whether the junction must be kept clear coming from this connection
188 : * @note: The enum NBEdge::KeepClear is not needed here because data
189 : * from a .net.xml is fully specified */
190 : bool keepClear;
191 : /// @brief custom position for internal junction on this connection
192 : double contPos;
193 : /// @brief custom foe visibility for connection
194 : double visibility;
195 : /// @brief custom permissions for connection
196 : SVCPermissions permissions;
197 : /// @brief custom lane changing permissions for connection
198 : SVCPermissions changeLeft;
199 : /// @brief custom lane changing permissions for connection
200 : SVCPermissions changeRight;
201 : /// @brief custom speed for connection
202 : double speed;
203 : /// @brief custom friction for connection
204 : double friction;
205 : /// @brief custom length for connection
206 : double customLength;
207 : /// @brief custom shape connection
208 : PositionVector customShape;
209 : /// @brief if set to true, This connection will not be TLS-controlled despite its node being controlled.
210 : bool uncontrolled;
211 : /// @brief Whether this connection is an indirect left turn
212 : bool indirectLeft;
213 : /// @brief optional edge type
214 : std::string edgeType;
215 : };
216 :
217 :
218 : /** @struct LaneAttrs
219 : * @brief Describes the values found in a lane's definition
220 : */
221 54660 : class LaneAttrs final : public Parameterised {
222 : public:
223 : /// @brief The maximum velocity allowed on this lane
224 : double maxSpeed;
225 : /// @brief The friction on this lane
226 : double friction;
227 : /// @brief This lane's shape (may be custom)
228 : PositionVector shape;
229 : /// @brief This lane's connections
230 : std::vector<Connection> connections;
231 : /// @brief This lane's allowed vehicle classes
232 : std::string allow;
233 : /// @brief This lane's disallowed vehicle classes
234 : std::string disallow;
235 : /// @brief This lane's vehicle classes allowed to change left
236 : std::string changeLeft;
237 : /// @brief This lane's vehicle classes allowed to change right
238 : std::string changeRight;
239 : /// @brief The width of this lane
240 : double width;
241 : /// @brief This lane's offset from the intersection
242 : double endOffset;
243 : /// @brief This lane's vehicle specific stop offsets
244 : StopOffset laneStopOffset;
245 : /// @brief Whether this lane is an acceleration lane
246 : bool accelRamp;
247 : /// @brief This lane's opposite lane
248 : std::string oppositeID;
249 : /// @brief Whether this lane has a custom shape
250 : bool customShape;
251 : /// @brief the type of this lane
252 : std::string type;
253 : };
254 :
255 :
256 : /** @struct EdgeAttrs
257 : * @brief Describes the values found in an edge's definition and this edge's lanes
258 : */
259 44431 : class EdgeAttrs final : public Parameterised {
260 : public:
261 : /// @brief This edge's id
262 : std::string id;
263 : /// @brief This edge's street name
264 : std::string streetName;
265 : /// @brief This edge's type
266 : std::string type;
267 : /// @brief This edge's function
268 : SumoXMLEdgeFunc func;
269 : /// @brief The node this edge starts at
270 : std::string fromNode;
271 : /// @brief The node this edge ends at
272 : std::string toNode;
273 : /// @brief This edges's shape
274 : PositionVector shape;
275 : /// @brief The length of the edge if set explicitly
276 : double length;
277 : /// @brief This edge's priority
278 : int priority;
279 : /// @brief The maximum velocity allowed on this edge (!!!)
280 : double maxSpeed;
281 : /// @brief The friction on this edge
282 : //double friction;
283 : /// @brief This edge's lanes
284 : std::vector<LaneAttrs*> lanes;
285 : /// @brief The built edge
286 : NBEdge* builtEdge;
287 : /// @brief The lane spread function
288 : LaneSpreadFunction lsf;
289 : /// @brief This edge's vehicle specific stop offsets (used for lanes, that do not have a specified stopOffset)
290 : StopOffset edgeStopOffset;
291 : /// @brief The position at the start of this edge (kilometrage/mileage)
292 : double distance;
293 : /// @brief the bidi edge
294 : std::string bidi;
295 : };
296 :
297 :
298 : /** @struct Prohibition
299 : * @brief Describes the values found in a prohibition
300 : */
301 : struct Prohibition {
302 : std::string prohibitorFrom;
303 : std::string prohibitorTo;
304 : std::string prohibitedFrom;
305 : std::string prohibitedTo;
306 : };
307 :
308 : /** @struct Crossing
309 : * @brief Describes a pedestrian crossing
310 : */
311 : struct Crossing : public Parameterised {
312 145 : Crossing(const std::string& _edgeID) :
313 290 : edgeID(_edgeID), customTLIndex(-1), customTLIndex2(-1) {}
314 :
315 : std::string edgeID;
316 : std::vector<std::string> crossingEdges;
317 : double width;
318 : bool priority;
319 : PositionVector customShape;
320 : int customTLIndex;
321 : int customTLIndex2;
322 : };
323 :
324 : /** @struct WalkingAreaParsedCustomShape
325 : * @brief Describes custom shape for a walking area during parsing
326 : */
327 6 : struct WalkingAreaParsedCustomShape {
328 : PositionVector shape;
329 : std::vector<std::string> fromEdges;
330 : std::vector<std::string> toEdges;
331 : std::vector<std::string> fromCrossed;
332 : std::vector<std::string> toCrossed;
333 : double width;
334 : };
335 :
336 : /** @struct JunctionAttrs
337 : * @brief Describes the values found in a junction
338 : */
339 1884 : struct JunctionAttrs {
340 : NBNode* node;
341 : // @the list of internal lanes corresponding to each link
342 : std::vector<std::string> intLanes;
343 : // @brief the complete response definition for all links
344 : std::vector<std::string> response;
345 : };
346 :
347 : /// @brief Loaded edge definitions
348 : std::map<std::string, EdgeAttrs*> myEdges;
349 :
350 : /// @brief Loaded prohibitions
351 : std::vector<Prohibition> myProhibitions;
352 :
353 : /// @brief The network builder to fill
354 : NBNetBuilder& myNetBuilder;
355 :
356 : /// @brief The node container to fill
357 : NBNodeCont& myNodeCont;
358 :
359 : /// @brief The node container to fill
360 : NBTrafficLightLogicCont& myTLLCont;
361 :
362 : /// @brief The handler for parsing edge types and restrictions
363 : NIXMLTypesHandler myTypesHandler;
364 :
365 : /// @brief The currently parsed edge's definition (to add loaded lanes to)
366 : EdgeAttrs* myCurrentEdge;
367 :
368 : /// @brief The currently parsed junction definition to help in reconstructing crossings
369 : JunctionAttrs myCurrentJunction;
370 :
371 : /// @brief The currently parsed lanes's definition (to add the shape to)
372 : LaneAttrs* myCurrentLane;
373 :
374 : /// @brief The currently parsed traffic light
375 : NBLoadedSUMOTLDef* myCurrentTL;
376 :
377 : /// @brief The coordinate transformation which was used to build the loaded network.
378 : GeoConvHelper* myLocation;
379 :
380 : /// @brief The pedestrian crossings found in the network
381 : std::map<std::string, std::vector<Crossing> > myPedestrianCrossings;
382 :
383 : /// @brief Map from walkingArea edge IDs to custom shapes
384 : std::map<std::string, WalkingAreaParsedCustomShape> myWACustomShapes;
385 :
386 : /// @brief element to receive parameters
387 : std::vector<Parameterised*> myLastParameterised;
388 :
389 : /// @brief the loaded network version
390 : MMVersion myNetworkVersion;
391 :
392 : /// @brief whether the loaded network contains internal lanes
393 : bool myHaveSeenInternalEdge;
394 :
395 : /// @brief whether the loaded network was built for lefthand traffic
396 : bool myAmLefthand;
397 :
398 : /// @brief whether the written network should have a different "handedness" (LHT/RHT) than the loaded network
399 : bool myChangeLefthand;
400 :
401 : /// @brief the level of corner detail in the loaded network
402 : int myCornerDetail;
403 :
404 : /// @brief the level of geometry detail for internal lanes in the loaded network
405 : int myLinkDetail;
406 :
407 : /// @brief whether all lanes of an edge should have the same stop line
408 : bool myRectLaneCut;
409 :
410 : /// @brief whether walkingareas must be built
411 : bool myWalkingAreas;
412 :
413 : /// @brief whether turning speed was limited in the network
414 : double myLimitTurnSpeed;
415 :
416 : /// @brief whether foe-relationships where checked at lane-level
417 : bool myCheckLaneFoesAll;
418 : bool myCheckLaneFoesRoundabout;
419 : /// @brief whether some right-of-way checks at traffic light junctions should be disabled
420 : bool myTlsIgnoreInternalJunctionJam;
421 : /// @brief default spreadType defined in the network
422 : std::string myDefaultSpreadType;
423 : /// @brief overlap option for loaded network
424 : bool myGeomAvoidOverlap;
425 : /// @brief higherSpeed option for loaded network
426 : bool myJunctionsHigherSpeed;
427 : /// @brief custom settings for internal junction computation
428 : double myInternalJunctionsVehicleWidth;
429 : /// @brief custom settings for junction shape computation
430 : bool myJunctionsMinimalShape;
431 : bool myJunctionsEndpointShape;
432 :
433 : /// @brief loaded roundabout edges
434 : std::vector<std::vector<std::string> > myRoundabouts;
435 :
436 : /// @brief list of node id with rail signals (no NBTrafficLightDefinition exists)
437 : std::set<std::string> myRailSignals;
438 :
439 : /// @brief list of parameter keys to discard
440 : std::set<std::string> myDiscardableParams;
441 :
442 : private:
443 :
444 : /// @brief read position from the given attributes, attribute errors to id
445 : static Position readPosition(const SUMOSAXAttributes& attrs, const std::string& id, bool& ok);
446 :
447 : /** @brief parses connection string of a prohibition (very old school)
448 : * @param[in] attr The connection attribute
449 : * @param[out] from ID of the source edge
450 : * @param[out] to ID of the destination edge
451 : * @param[out] ok Whether parsing completed successfully
452 : */
453 : void parseProhibitionConnection(const std::string& attr, std::string& from, std::string& to, bool& ok);
454 : };
|