Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netbuild/NBNetBuilder.h
169666 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 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 NBNetBuilder.h
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Sascha Krieg
18
/// @author Michael Behrisch
19
/// @author Gregor Laemmel
20
/// @date Fri, 29.04.2005
21
///
22
// Instance responsible for building networks
23
/****************************************************************************/
24
#pragma once
25
#include <config.h>
26
27
#include <string>
28
#include <iostream>
29
#include <vector>
30
#include <set>
31
#include <utils/shapes/ShapeContainer.h>
32
#include "NBEdgeCont.h"
33
#include "NBTypeCont.h"
34
#include "NBNodeCont.h"
35
#include "NBNode.h"
36
#include "NBParking.h"
37
#include "NBTrafficLightLogicCont.h"
38
#include "NBDistrictCont.h"
39
#include "NBPTStopCont.h"
40
#include "NBPTLineCont.h"
41
#include <utils/common/UtilExceptions.h>
42
43
44
// ===========================================================================
45
// class declarations
46
// ===========================================================================
47
class OptionsCont;
48
class OutputDevice;
49
class GeoConvHelper;
50
51
52
// ===========================================================================
53
// class definitions
54
// ===========================================================================
55
/**
56
* @class NBNetBuilder
57
* @brief Instance responsible for building networks
58
*
59
* The class' - and the netbuild module's - functionality is embedded within the
60
* compute() method.
61
*
62
* @addtogroup netbuild
63
* @{
64
*
65
* -# Removing self loops
66
* \n Removes edges which end at the node they start at using NBNodeCont::removeSelfLoops().
67
* -# Joining double connections
68
* \n Joins edges between same nodes using NBNodeCont::recheckEdges().
69
* -# Finding isolated roads (optional)
70
* -# Removing empty nodes and geometry nodes (optional)
71
* \n Removed nodes with no incoming/outgoing edges and nodes which can be transformed into
72
* geometry point using NBNodeCont::removeUnwishedNodes().
73
* -# Removing unwished edges (optional)
74
* \n If "keep-edges.postload" and "keep-edges.explicit" are set, the edges not within "keep-edges.explicit" are
75
* removed from the network using NBEdgeCont::removeUnwishedEdges().
76
* -# Rechecking nodes after edge removal (optional)
77
* \n If any of the edge removing options was set ("keep-edges.explicit", "remove-edges.explicit", "keep-edges.postload",
78
* "keep-edges.by-vclass", "keep-edges.input-file"), the now orphaned nodes are removed using
79
* NBNodeCont::removeUnwishedNodes().
80
* -# Splitting geometry edges (optional)
81
* \n If "geometry.split" is set, edge geometries are converted to nodes using
82
* NBEdgeCont::splitGeometry().
83
* -# Normalising/transposing node positions
84
* \n If "offset.disable-normalization", "offset.x", and "offset.y" are not
85
* set, the road graph's instances are moved to the origin.
86
* -# Guessing and setting on-/off-ramps
87
* -# Guessing and setting TLs
88
* -# Computing turning directions
89
* -# Sorting nodes' edges
90
* -# Guessing and setting roundabouts
91
* -# Computing Approached Edges
92
* -# Computing Approaching Lanes
93
* -# Dividing of Lanes on Approached Lanes
94
* -# Appending Turnarounds (optional)
95
* -# Rechecking of lane endings
96
* -# Computing node shapes
97
* -# Computing edge shapes
98
* -# Computing tls logics
99
* -# Computing node logics
100
* -# Computing traffic light logics
101
*
102
* @todo Removing unwished edges: Recheck whether this can be done during loading - whether this option/step is really needed.
103
* @todo Finding isolated roads: Describe
104
* @bug Removing empty nodes and geometry nodes: Ok, empty nodes should be removed, uh? But this is only done if "geometry.remove" is set.
105
* @}
106
*/
107
class NBNetBuilder {
108
friend class GNENet; // for triggering intermediate build steps
109
110
public:
111
/// @brief Constructor
112
NBNetBuilder();
113
114
/// @brief Destructor
115
~NBNetBuilder();
116
117
/** @brief Initialises the storage by applying given options
118
*
119
* Options, mainly steering the acceptance of edges, are parsed
120
* and the according internal variables are set.
121
*
122
* @param[in] oc The options container to read options from
123
* @exception ProcessError If something fails (message is included)
124
*/
125
void applyOptions(OptionsCont& oc);
126
127
/** @brief Performs the network building steps
128
*
129
* @param[in] oc Container that contains options for building
130
* @param[in] explicitTurnarounds List of edge ids for which turn-arounds should be added (used by netedit)
131
* @param[in] mayAddOrRemove whether processing steps which cause nodes and edges to be added or removed shall be triggered (used by netedit)
132
* @exception ProcessError (recheck)
133
*/
134
void compute(OptionsCont& oc, const std::set<std::string>& explicitTurnarounds = std::set<std::string>(), bool mayAddOrRemove = true);
135
136
/// @name Retrieval of subcontainers
137
/// @{
138
/// @brief Returns a reference to edge container
139
inline NBEdgeCont& getEdgeCont() {
140
return myEdgeCont;
141
}
142
143
/// @brief Returns a reference to the node container
144
inline NBNodeCont& getNodeCont() {
145
return myNodeCont;
146
}
147
148
/// @brief Returns a reference to the type container
149
inline NBTypeCont& getTypeCont() {
150
return myTypeCont;
151
}
152
153
/// @brief Returns a reference to the traffic light logics container
154
inline NBTrafficLightLogicCont& getTLLogicCont() {
155
return myTLLCont;
156
}
157
158
/// @brief Returns a reference the districts container
159
inline NBDistrictCont& getDistrictCont() {
160
return myDistrictCont;
161
}
162
163
/// @brief Returns a reference to the pt stop container
164
inline NBPTStopCont& getPTStopCont() {
165
return myPTStopCont;
166
}
167
168
/// @brief Returns a reference to the pt line container
169
inline NBPTLineCont& getPTLineCont() {
170
return myPTLineCont;
171
}
172
173
inline NBParkingCont& getParkingCont() {
174
return myParkingCont;
175
}
176
177
inline ShapeContainer& getShapeCont() {
178
return myShapeCont;
179
}
180
/// @}
181
182
/// @brief notify about style of loaded network (Without Crossings)
183
inline bool haveNetworkCrossings() {
184
return myNetworkHaveCrossings;
185
}
186
187
/// @brief enable crossing in networks
188
inline void setHaveNetworkCrossings(bool value) {
189
myNetworkHaveCrossings = value;
190
}
191
192
/**
193
* @brief transforms loaded coordinates
194
* handles projections, offsets (using GeoConvHelper) and import of height data (using NBHeightMapper)
195
* @param[in,out] from The coordinate to be transformed
196
* @param[in] includeInBoundary Whether to patch the convex boundary of the GeoConvHelper default instance
197
* @param[in] from_srs The spatial reference system of the input coordinate
198
* @note These methods are located outside of GeoConvHelper to avoid linker-dependencies on GDAL for libgeom
199
*/
200
static bool transformCoordinate(Position& from, bool includeInBoundary = true, GeoConvHelper* from_srs = nullptr);
201
static bool transformCoordinates(PositionVector& from, bool includeInBoundary = true, GeoConvHelper* from_srs = nullptr);
202
203
/// @brief insertion geometry points to ensure maximum segment length between points
204
static int addGeometrySegments(PositionVector& from, const PositionVector& cartesian, const double maxLength);
205
206
/// @brief whether netbuilding takes place in the context of netedit
207
static bool runningNetedit();
208
209
210
protected:
211
/**
212
* @class by_id_sorter
213
* @brief Sorts nodes by their ids
214
*/
215
class by_id_sorter {
216
public:
217
/// @brief constructor
218
explicit by_id_sorter() {}
219
220
/// @brief selection operator
221
int operator()(const NBNode* n1, const NBNode* n2) const {
222
return n1->getID() < n2->getID();
223
}
224
};
225
226
protected:
227
/// @brief The used container for nodes
228
NBNodeCont myNodeCont;
229
230
/// @brief The used container for street types
231
NBTypeCont myTypeCont;
232
233
/// @brief The used container for edges
234
NBEdgeCont myEdgeCont;
235
236
/// @brief The used container for traffic light logics
237
NBTrafficLightLogicCont myTLLCont;
238
239
/// @brief The used container for districts
240
NBDistrictCont myDistrictCont;
241
242
/// @brief The used container for pt stops
243
NBPTStopCont myPTStopCont;
244
245
/// @brief The used container for pt stops
246
NBPTLineCont myPTLineCont;
247
248
NBParkingCont myParkingCont;
249
250
/// @brief container for loaded polygon data
251
ShapeContainer myShapeCont;
252
253
/// @brief flag to indicate that network has crossings
254
bool myNetworkHaveCrossings;
255
256
private:
257
/// @brief shift network so its lower left corner is at 0,0
258
void moveToOrigin(GeoConvHelper& geoConvHelper, bool lefthand);
259
260
/// @brief ensure consistency between input and output geometries and speeds
261
void roundInputs();
262
263
/// @brief mirror the network along the X-axis
264
void mirrorX();
265
266
private:
267
/// @brief invalidated copy constructor
268
NBNetBuilder(const NBNetBuilder& s);
269
270
/// @brief invalidated assignment operator
271
NBNetBuilder& operator=(const NBNetBuilder& s);
272
};
273
274