Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
NIImporter_OpenStreetMap.h
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2026 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/****************************************************************************/
22// Importer for networks stored in OpenStreetMap format
23/****************************************************************************/
24#pragma once
25#include <config.h>
26
27#include <string>
28#include <map>
33
34
35// ===========================================================================
36// class declarations
37// ===========================================================================
38class NBEdge;
39class NBEdgeCont;
40class NBNetBuilder;
41class NBNode;
42class NBNodeCont;
44class NBTypeCont;
45class OptionsCont;
46
47
48// ===========================================================================
49// class definitions
50// ===========================================================================
57public:
69 static void loadNetwork(const OptionsCont& oc, NBNetBuilder& nb);
70
71protected:
72
76 enum WayType {
78 // technically possible
83 // recommended for routing
86 };
87
88
94
97 struct NIOSMNode : public Parameterised {
98 NIOSMNode(long long int _id, double _lon, double _lat)
99 :
100 id(_id), lon(_lon), lat(_lat), ele(0.),
101 tlsControlled(false),
102 pedestrianCrossing(false),
103 railwayCrossing(false),
105 railwayBufferStop(false),
106 ptStopPosition(false), ptStopLength(0), name(""),
108 positionMeters(std::numeric_limits<double>::max()),
110 node(nullptr) { }
111
113 const long long int id;
115 const double lon;
117 const double lat;
119 double ele;
135 std::string name;
139 std::string position;
146
147 private:
149 NIOSMNode& operator=(const NIOSMNode& s) = delete;
150
151
152 };
153
154public:
156 static SUMOVehicleClass interpretTransportType(const std::string& type, NIOSMNode* toSet = nullptr);
157
158protected:
159
160
171
178
179 enum class PlacementType {
180 NONE = 0,
181 LEFT_OF = 1,
182 RIGHT_OF = 2,
183 MIDDLE_OF = 3
184 };
185
188 class Edge : public Parameterised {
189 public:
190 explicit Edge(long long int _id) :
191 id(_id), myNoLanes(-1), myNoLanesForward(0),
196 myCyclewayType(WAY_UNKNOWN), // building of extra lane depends on bikelaneWidth of loaded typemap
197 myBuswayType(WAY_NONE), // buslanes are always built when declared
198 mySidewalkType(WAY_UNKNOWN), // building of extra lanes depends on sidewalkWidth of loaded typemap
199 myRailDirection(WAY_UNKNOWN), // store direction(s) of railway usage
200 myParkingType(PARKING_NONE), // parking areas exported optionally
203 myLayer(0), // layer is non-zero only in conflict areas
204 myCurrentIsRoad(false),
205 myAmInRoundabout(false),
207 myPlacementLane(-1),
208 myWidth(-1)
209 { }
210
211 virtual ~Edge() {}
212
214 const long long int id;
216 std::string streetName;
218 std::string ref;
232 std::string myHighWayType;
234 std::string myIsOneWay;
250 std::vector<bool> myDesignatedLaneForward;
252 std::vector<bool> myDesignatedLaneBackward;
254 std::vector<SVCPermissions> myAllowedLaneForward;
256 std::vector<SVCPermissions> myAllowedLaneBackward;
258 std::vector<SVCPermissions> myDisallowedLaneForward;
260 std::vector<SVCPermissions> myDisallowedLaneBackward;
264 std::vector<long long int> myCurrentNodes;
270 std::map<std::string, std::string> myExtraTags;
272 std::vector<int> myTurnSignsForward;
273 std::vector<int> myTurnSignsBackward;
279 std::vector<double> myWidthLanesForward;
280 std::vector<double> myWidthLanesBackward;
281 double myWidth;
282
283 private:
285 Edge& operator=(const Edge& s) = delete;
286 };
287
288
290
292
293 void load(const OptionsCont& oc, NBNetBuilder& nb);
294
295private:
300 public:
301 bool operator()(const NIOSMNode* n1, const NIOSMNode* n2) const {
302 return (n1->lat > n2->lat) || (n1->lat == n2->lat && n1->lon > n2->lon);
303 }
304 };
305
306
308 static const std::string compoundTypeSeparator;
309
310 class CompareEdges;
311
315 std::map<long long int, NIOSMNode*> myOSMNodes;
316
318 std::set<NIOSMNode*, CompareNodes> myUniqueNodes;
319
320
322 std::map<long long int, Edge*> myEdges;
323
325 std::map<long long int, Edge*> myPlatformShapes;
326
328 std::set<std::string> myUnusableTypes;
329
331 std::map<std::string, std::string> myKnownCompoundTypes;
332
335
338
341
344
347
350
353
356
359
362
364 static bool myAllAttributes;
365
367 static std::set<std::string> myExtraAttributes;
368
383 NBNode* insertNodeChecking(long long int id, NBNodeCont& nc, NBTrafficLightLogicCont& tlsc);
384
385
400 int insertEdge(Edge* e, int index, NBNode* from, NBNode* to,
401 const std::vector<long long int>& passed, NBNetBuilder& nb,
402 const NBNode* first, const NBNode* last);
403
405 void reconstructLayerElevation(double layerElevation, NBNetBuilder& nb);
406
408 std::map<NBNode*, std::pair<double, double> >
409 getNeighboringNodes(NBNode* node, double maxDist, const std::set<NBNode*>& knownElevation);
410
412 std::string usableType(const std::string& type, const std::string& id, NBTypeCont& tc);
413
416
418 static double interpretDistance(NIOSMNode* node);
419
420protected:
421 static const double MAXSPEED_UNGIVEN;
422 static const long long int INVALID_ID;
423
424 static void applyChangeProhibition(NBEdge* e, int changeProhibition);
436
437 static void mergeTurnSigns(std::vector<int>& signs, std::vector<int> signs2);
438 void applyTurnSigns(NBEdge* e, const std::vector<int>& turnSigns);
439
445 public:
451 NodesHandler(std::map<long long int, NIOSMNode*>& toFill, std::set<NIOSMNode*,
452 CompareNodes>& uniqueNodes,
453 const OptionsCont& cont);
454
455
457 ~NodesHandler() override;
458
459 int getDuplicateNodes() const {
460 return myDuplicateNodes;
461 }
462
465 }
466
467 protected:
469
470
478 void myStartElement(int element, const SUMOSAXAttributes& attrs) override;
479
480
487 void myEndElement(int element) override;
489
490
491 private:
493 std::map<long long int, NIOSMNode*>& myToFill;
494
496 std::string myLastNodeID;
497
500
502 std::string myRailwayRef;
503
506
508 std::set<NIOSMNode*, CompareNodes>& myUniqueNodes;
509
512
515
518
521
522 private:
525
528
529 };
530
531
537 public:
543 EdgesHandler(const std::map<long long int, NIOSMNode*>& osmNodes,
544 std::map<long long int, Edge*>& toFill, std::map<long long int, Edge*>& platformShapes,
545 const NBTypeCont& tc);
546
547
549 ~EdgesHandler() override;
550
551
552 protected:
554
555
563 void myStartElement(int element, const SUMOSAXAttributes& attrs) override;
564
565
572 void myEndElement(int element) override;
574
575 double interpretSpeed(const std::string& key, std::string value);
576
577 int interpretChangeType(const std::string& value) const;
578
579 void interpretLaneUse(const std::string& value, SUMOVehicleClass svc, const bool forward) const;
580
581 bool interpretPlacement(const std::string& value, NIImporter_OpenStreetMap::PlacementType& placement, int& laneIndex) const;
582
583 void addType(const std::string& singleTypeID);
584
585
586 private:
588 const std::map<long long int, NIOSMNode*>& myOSMNodes;
589
591 std::map<long long int, Edge*>& myEdgeMap;
592
594 std::map<long long int, Edge*>& myPlatformShapesMap;
595
597 Edge* myCurrentEdge = nullptr;
598
600 std::map<std::string, double> mySpeedMap;
601
603
604 private:
607
610
611 };
612
619 public:
625 RelationHandler(const std::map<long long int, NIOSMNode*>& osmNodes,
626 const std::map<long long int, Edge*>& osmEdges, NBPTStopCont* nbptStopCont,
627 const std::map<long long int, Edge*>& platfromShapes, NBPTLineCont* nbptLineCont,
628 const OptionsCont& oc);
629
630
633
634 protected:
636
637
645 void myStartElement(int element, const SUMOSAXAttributes& attrs) override;
646
647
654 void myEndElement(int element) override;
656
657
658 private:
660 const std::map<long long int, NIOSMNode*>& myOSMNodes;
661
663 const std::map<long long int, Edge*>& myOSMEdges;
664
666 const std::map<long long int, Edge*>& myPlatformShapes;
667
670
673
675 long long int myCurrentRelation;
676
679
682
684 long long int myFromWay;
685
687 long long int myToWay;
688
690 long long int myViaNode;
691 long long int myViaWay;
692
694 long long int myStation;
695
698
702 enum class RestrictionType {
704 ONLY,
706 NO,
708 UNKNOWN
709 };
711
713 void resetValues();
714
716 bool checkEdgeRef(long long int ref) const;
717
719 bool applyRestriction() const;
720
722 NBEdge* findEdgeRef(long long int wayRef, const std::vector<NBEdge*>& candidates) const;
723
724 private:
727
730
732 std::vector<long long int> myStops;
733
735 std::set<long long int> myPlatformStops;
736
737
739 long long int ref;
740 bool isWay;
741 };
742
744 std::vector<NIIPTPlatform> myPlatforms;
745
747 std::vector<long long int> myWays;
748
751
754
756 std::string myPTRouteType;
757
760
762 std::string myName;
763
765 std::string myRef;
766
769
771 std::string myNightService;
772
774 std::map<long long int, long long int > myStopAreas;
775
776 };
777
778};
std::vector< std::string > StringVector
Definition of a vector of strings.
Definition Option.h:42
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_IGNORING
vehicles ignoring classes
Storage for edges, including some functionality operating on multiple edges.
Definition NBEdgeCont.h:59
The representation of a single edge during network building.
Definition NBEdge.h:92
Instance responsible for building networks.
Container for nodes during the netbuilding process.
Definition NBNodeCont.h:57
Represents a single node (junction) during network building.
Definition NBNode.h:66
Container for public transport stops during the net building process.
A container for traffic light definitions and built programs.
A storage for available edgeTypes of edges.
Definition NBTypeCont.h:52
Functor which compares two NIOSMNodes according to their coordinates.
bool operator()(const NIOSMNode *n1, const NIOSMNode *n2) const
An internal definition of a loaded edge.
int myPlacementLane
1-based lane index for placement specification
std::vector< SVCPermissions > myDisallowedLaneBackward
(optional) information about additional disallowed SVCs on backward lane(s)
std::map< std::string, std::string > myExtraTags
Additionally tagged information.
std::vector< double > myWidthLanesForward
Information on lane width.
WayType mySidewalkType
Information about the kind of sidwalk along this road.
Edge & operator=(const Edge &s)=delete
invalidated assignment operator
std::vector< SVCPermissions > myDisallowedLaneForward
(optional) information about additional disallowed SVCs on forward lane(s)
bool myCurrentIsRoad
Information whether this is a road.
WayType myCyclewayType
Information about the kind of cycleway along this road.
int myNoLanesForward
number of lanes in forward direction or 0 if unknown, negative if backwards lanes are meant
double myMaxSpeed
maximum speed in km/h, or MAXSPEED_UNGIVEN
std::string ref
The edge's track name.
std::vector< SVCPermissions > myAllowedLaneForward
(optional) information about additional allowed SVCs on forward lane(s)
std::string myHighWayType
The type, stored in "highway" key.
const long long int id
The edge's id.
bool myAmInRoundabout
Information whether this road is part of a roundabout.
int myLayer
Information about the relative z-ordering of ways.
int myRailDirection
Information about the direction(s) of railway usage.
std::vector< bool > myDesignatedLaneBackward
(optional) information about whether the backward lanes are designated to some SVCs
SVCPermissions myExtraDisallowed
Extra permissions prohibited from tags instead of highway type.
std::vector< SVCPermissions > myAllowedLaneBackward
(optional) information about additional allowed SVCs on backward lane(s)
int myNoLanes
number of lanes, or -1 if unknown
std::vector< int > myTurnSignsForward
turning direction (arrows printed on the road)
std::vector< long long int > myCurrentNodes
The list of nodes this edge is made of.
int myParkingType
Information about road-side parking.
double myMaxSpeedBackward
maximum speed in km/h, or MAXSPEED_UNGIVEN
WayType myBuswayType
Information about the kind of busway along this road.
int myChangeForward
Information about change prohibitions (forward direction.
SVCPermissions myExtraAllowed
Extra permissions added from tags instead of highway type.
int myChangeBackward
Information about change prohibitions (backward direction.
std::string streetName
The edge's street name.
PlacementType myPlacement
placement of the OSM way geometry relative to lanes
std::vector< bool > myDesignatedLaneForward
(optional) information about whether the forward lanes are designated to some SVCs
std::string myIsOneWay
Information whether this is an one-way road.
A class which extracts OSM-edges from a parsed OSM-file.
void addType(const std::string &singleTypeID)
Edge * myCurrentEdge
The currently built edge.
const std::map< long long int, NIOSMNode * > & myOSMNodes
The previously parsed nodes.
void interpretLaneUse(const std::string &value, SUMOVehicleClass svc, const bool forward) const
int interpretChangeType(const std::string &value) const
void myEndElement(int element) override
Called when a closing tag occurs.
bool interpretPlacement(const std::string &value, NIImporter_OpenStreetMap::PlacementType &placement, int &laneIndex) const
double interpretSpeed(const std::string &key, std::string value)
EdgesHandler(const EdgesHandler &s)
invalidated copy constructor
std::map< long long int, Edge * > & myEdgeMap
A map of built edges.
std::map< long long int, Edge * > & myPlatformShapesMap
A map of built edges.
std::map< std::string, double > mySpeedMap
A map of non-numeric speed descriptions to their numeric values.
void myStartElement(int element, const SUMOSAXAttributes &attrs) override
Called on the opening of a tag;.
EdgesHandler & operator=(const EdgesHandler &s)
invalidated assignment operator
A class which extracts OSM-nodes from a parsed OSM-file.
int myHierarchyLevel
The current hierarchy level.
const bool myImportElevation
whether elevation data should be imported
std::string myLastNodeID
id of the currently parsed node
NodesHandler(const NodesHandler &s)
invalidated copy constructor
std::set< NIOSMNode *, CompareNodes > & myUniqueNodes
the set of unique nodes (used for duplicate detection/substitution)
void myStartElement(int element, const SUMOSAXAttributes &attrs) override
Called on the opening of a tag;.
std::map< long long int, NIOSMNode * > & myToFill
The nodes container to fill.
NodesHandler & operator=(const NodesHandler &s)
invalidated assignment operator
void myEndElement(int element) override
Called when a closing tag occurs.
NIOSMNode * myCurrentNode
the currently parsed node
StringVector myRailSignalRules
custom requirements for rail signal tagging
A class which extracts relevant relation information from a parsed OSM-file.
void myEndElement(int element) override
Called when a closing tag occurs.
const std::map< long long int, Edge * > & myPlatformShapes
The previously parsed platform shapes.
long long int myViaNode
the via node/way for the current restriction
bool myIsRestriction
whether the currently parsed relation is a restriction
std::vector< long long int > myWays
ways in pt line references
SVCPermissions myRestrictionException
exceptions to the restriction currenlty being parsed
long long int myCurrentRelation
The currently parsed relation.
std::set< long long int > myPlatformStops
myStops which are actually platforms (in case there is no stop_position)
void resetValues()
reset members to their defaults for parsing a new relation
void myStartElement(int element, const SUMOSAXAttributes &attrs) override
Called on the opening of a tag;.
const std::map< long long int, NIOSMNode * > & myOSMNodes
The previously parsed nodes.
const OptionsCont & myOptionsCont
the options cont
RestrictionType
whether the only allowed or the only forbidden connection is defined
@ ONLY
The only valid connection is declared.
@ NO
The only invalid connection is declared.
std::string myNightService
night service information of the pt line
std::string myPTRouteType
indicates whether current relation is a pt route
std::vector< long long int > myStops
bus stop references
NBPTLineCont * myNBPTLineCont
PT Line container to be filled.
std::vector< NIIPTPlatform > myPlatforms
bus stop platforms
bool myIsStopArea
indicates whether current relation is a pt stop area
bool myIsRoute
indicates whether current relation is a route
RelationHandler & operator=(const RelationHandler &s)
invalidated assignment operator
long long int myStation
the station node for the current stop_area
int myInterval
service interval of the pt line in minutes
RelationHandler(const RelationHandler &s)
invalidated copy constructor
std::map< long long int, long long int > myStopAreas
the map from stop area member to stop_area id
NBPTStopCont * myNBPTStopCont
The previously filled pt stop container.
bool checkEdgeRef(long long int ref) const
check whether a referenced way has a corresponding edge
long long int myFromWay
the origination way for the current restriction
long long int myToWay
the destination way for the current restriction
bool applyRestriction() const
try to apply the parsed restriction and return whether successful
NBEdge * findEdgeRef(long long int wayRef, const std::vector< NBEdge * > &candidates) const
try to find the way segment among candidates
const std::map< long long int, Edge * > & myOSMEdges
The previously parsed edges.
Importer for networks stored in OpenStreetMap format.
int insertEdge(Edge *e, int index, NBNode *from, NBNode *to, const std::vector< long long int > &passed, NBNetBuilder &nb, const NBNode *first, const NBNode *last)
Builds an NBEdge.
std::map< long long int, Edge * > myEdges
the map from OSM way ids to edge objects
bool myImportCrossings
import crossings
std::map< long long int, NIOSMNode * > myOSMNodes
the map from OSM node ids to actual nodes
static void loadNetwork(const OptionsCont &oc, NBNetBuilder &nb)
Loads content of the optionally given OSM file.
static const long long int INVALID_ID
WayType
details on the kind of sidewalk, cycleway, busway along this road
void applyLaneUse(NBEdge *e, NIImporter_OpenStreetMap::Edge *nie, const bool forward)
Applies lane use information from nie to e.
bool myOnewayDualSidewalk
import sidewalks
std::map< long long int, Edge * > myPlatformShapes
the map from OSM way ids to platform shapes
void load(const OptionsCont &oc, NBNetBuilder &nb)
void applyTurnSigns(NBEdge *e, const std::vector< int > &turnSigns)
bool myImportSidewalks
import sidewalks
std::set< NIOSMNode *, CompareNodes > myUniqueNodes
the set of unique nodes used in NodesHandler, used when freeing memory
static bool myAllAttributes
whether additional way and node attributes shall be imported
void reconstructLayerElevation(double layerElevation, NBNetBuilder &nb)
reconstruct elevation from layer info
static SUMOVehicleClass interpretTransportType(const std::string &type, NIOSMNode *toSet=nullptr)
translate osm transport designations into sumo vehicle class
int myPlacementSkippedNonExplicitOneWay
number of placement skips due to non-explicit oneway
bool myImportLaneAccess
import lane specific access restrictions
bool myImportTurnSigns
import turning signals (turn:lanes) to guide connection building
std::map< std::string, std::string > myKnownCompoundTypes
The compound types that have already been mapped to other known types.
static const std::string compoundTypeSeparator
The separator within newly created compound type names.
std::set< std::string > myUnusableTypes
The compounds types that do not contain known types.
bool myETCS_movingBlock
whether ETCS signals default to moving block
std::map< NBNode *, std::pair< double, double > > getNeighboringNodes(NBNode *node, double maxDist, const std::set< NBNode * > &knownElevation)
collect neighboring nodes with their road distance and maximum between-speed. Search does not continu...
static std::set< std::string > myExtraAttributes
extra attributes to import
bool myImportBikeAccess
import bike path specific permissions and directions
bool myAnnotateDefaults
whether edges should carry information on the use of typemap defaults
static double interpretDistance(NIOSMNode *node)
read distance value from node and return value in m
NBNode * insertNodeChecking(long long int id, NBNodeCont &nc, NBTrafficLightLogicCont &tlsc)
Builds an NBNode.
static void mergeTurnSigns(std::vector< int > &signs, std::vector< int > signs2)
void extendRailwayDistances(Edge *e, NBTypeCont &tc)
extend kilometrage data for all nodes along railway
int myPlacementSkippedAuxOppositeDirection
number of placement skips due to generated opposite-direction auxiliary edges
std::string usableType(const std::string &type, const std::string &id, NBTypeCont &tc)
check whether the type is known or consists of known type compounds. return empty string otherwise
static void applyChangeProhibition(NBEdge *e, int changeProhibition)
A storage for options typed value containers)
Definition OptionsCont.h:89
An upper class for objects with additional parameters.
Encapsulated SAX-Attributes.
SAX-handler base for SUMO-files.
unsigned node
Definition json.hpp:5639
An internal representation of an OSM-node.
SVCPermissions permissions
type of pt stop
NIOSMNode & operator=(const NIOSMNode &s)=delete
invalidated assignment operator
int railwaySignal
Whether this is a railway (main) signal.
NBNode * node
the NBNode that was instantiated
double positionMeters
position converted to m (using highest precision available)
std::string position
kilometrage/mileage
const long long int id
The node's id.
bool pedestrianCrossing
Whether this is a pedestrian crossing.
bool tlsControlled
Whether this is a tls controlled junction.
double ptStopLength
The length of the pt stop.
NIOSMNode(long long int _id, double _lon, double _lat)
bool ptStopPosition
Whether this is a public transport stop position.
std::string name
The name of the node.
bool railwayCrossing
Whether this is a railway crossing.
double ele
The elevation of this node.
bool railwayBufferStop
Whether this is a railway buffer stop.
const double lon
The longitude the node is located at.
const double lat
The latitude the node is located at.
WayType myRailDirection
Information about the direction(s) of railway usage.