SUMO - Simulation of Urban MObility
NIFrame.cpp
Go to the documentation of this file.
1 /****************************************************************************/
10 // Sets and checks options for netimport
11 /****************************************************************************/
12 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
13 // Copyright (C) 2001-2017 DLR (http://www.dlr.de/) and contributors
14 /****************************************************************************/
15 //
16 // This file is part of SUMO.
17 // SUMO is free software: you can redistribute it and/or modify
18 // it under the terms of the GNU General Public License as published by
19 // the Free Software Foundation, either version 3 of the License, or
20 // (at your option) any later version.
21 //
22 /****************************************************************************/
23 
24 
25 // ===========================================================================
26 // included modules
27 // ===========================================================================
28 #ifdef _MSC_VER
29 #include <windows_config.h>
30 #else
31 #include <config.h>
32 #endif
33 
34 #include <string>
35 #include <iostream>
36 #include <fstream>
37 #include <utils/options/Option.h>
41 #include <utils/common/ToString.h>
45 #include <netbuild/NBNetBuilder.h>
46 #include <netwrite/NWFrame.h>
48 #include "NIImporter_DlrNavteq.h"
49 #include "NIFrame.h"
50 
51 
52 // ===========================================================================
53 // method definitions
54 // ===========================================================================
55 void
58  // register input formats
59  oc.doRegister("sumo-net-file", 's', new Option_FileName());
60  oc.addSynonyme("sumo-net-file", "sumo-net", true);
61  oc.addDescription("sumo-net-file", "Input", "Read SUMO-net from FILE");
62  oc.addXMLDefault("sumo-net-file", "net");
63 
64  oc.doRegister("node-files", 'n', new Option_FileName());
65  oc.addSynonyme("node-files", "xml-node-files", true);
66  oc.addSynonyme("node-files", "xml-nodes", true);
67  oc.addSynonyme("node-files", "nodes");
68  oc.addDescription("node-files", "Input", "Read XML-node defs from FILE");
69 
70  oc.doRegister("edge-files", 'e', new Option_FileName());
71  oc.addSynonyme("edge-files", "xml-edge-files", true);
72  oc.addSynonyme("edge-files", "xml-edges", true);
73  oc.addSynonyme("edge-files", "edges");
74  oc.addDescription("edge-files", "Input", "Read XML-edge defs from FILE");
75 
76  oc.doRegister("connection-files", 'x', new Option_FileName());
77  oc.addSynonyme("connection-files", "xml-connection-files", true);
78  oc.addSynonyme("connection-files", "xml-connections", true);
79  oc.addSynonyme("connection-files", "connections");
80  oc.addDescription("connection-files", "Input", "Read XML-connection defs from FILE");
81 
82  oc.doRegister("tllogic-files", 'i', new Option_FileName());
83  oc.addDescription("tllogic-files", "Input", "Read XML-traffic light defs from FILE");
84 
85  oc.doRegister("type-files", 't', new Option_FileName());
86  oc.addSynonyme("type-files", "xml-type-files", true);
87  oc.addSynonyme("type-files", "xml-types", true);
88  oc.addSynonyme("type-files", "types");
89  oc.addDescription("type-files", "Input", "Read XML-type defs from FILE");
90 
91  oc.doRegister("shapefile-prefix", new Option_FileName());
92  oc.addSynonyme("shapefile-prefix", "shapefile");
93  oc.addSynonyme("shapefile-prefix", "arcview", true);
94  oc.addSynonyme("shapefile-prefix", "tiger", true);
95  oc.addDescription("shapefile-prefix", "Input", "Read shapefiles (ArcView, Tiger, ...) from files starting with 'FILE'");
96 
97  oc.doRegister("dlr-navteq-prefix", new Option_FileName());
98  oc.addSynonyme("dlr-navteq-prefix", "dlr-navteq");
99  oc.addSynonyme("dlr-navteq-prefix", "elmar2", true);
100  oc.addDescription("dlr-navteq-prefix", "Input", "Read converted Navteq GDF data (unsplitted Elmar-network) from path 'FILE'");
101 
102  oc.doRegister("osm-files", new Option_FileName());
103  oc.addSynonyme("osm-files", "osm");
104  oc.addDescription("osm-files", "Input", "Read OSM-network from path 'FILE(s)'");
105 
106  oc.doRegister("opendrive-files", new Option_FileName());
107  oc.addSynonyme("opendrive-files", "opendrive");
108  oc.addDescription("opendrive-files", "Input", "Read OpenDRIVE-network from FILE");
109 
110  oc.doRegister("visum-file", new Option_FileName());
111  oc.addSynonyme("visum-file", "visum");
112  oc.addDescription("visum-file", "Input", "Read VISUM-net from FILE");
113 
114  oc.doRegister("vissim-file", new Option_FileName());
115  oc.addSynonyme("vissim-file", "vissim");
116  oc.addDescription("vissim-file", "Input", "Read VISSIM-net from FILE");
117 
118  oc.doRegister("robocup-dir", new Option_FileName());
119  oc.addSynonyme("robocup-dir", "robocup-net", true);
120  oc.addSynonyme("robocup-dir", "robocup");
121  oc.addDescription("robocup-dir", "Input", "Read RoboCup-net from DIR");
122 
123  oc.doRegister("matsim-files", new Option_FileName());
124  oc.addSynonyme("matsim-files", "matsim");
125  oc.addDescription("matsim-files", "Input", "Read MATsim-net from FILE");
126 
127  oc.doRegister("itsumo-files", new Option_FileName());
128  oc.addSynonyme("itsumo-files", "itsumo");
129  oc.addDescription("itsumo-files", "Input", "Read ITSUMO-net from FILE");
130 
131  oc.doRegister("heightmap.shapefiles", new Option_FileName());
132  oc.addDescription("heightmap.shapefiles", "Input", "Read heightmap from ArcGIS shapefile");
133 
134  oc.doRegister("heightmap.geotiff", new Option_FileName());
135  oc.addDescription("heightmap.geotiff", "Input", "Read heightmap from GeoTIFF");
136 
137  // register basic processing options
138  oc.doRegister("ignore-errors", new Option_Bool(false));
139  oc.addSynonyme("ignore-errors", "dismiss-loading-errors", true);
140  oc.addDescription("ignore-errors", "Processing", "Continue on broken input");
141 
142  oc.doRegister("ignore-errors.connections", new Option_Bool(false));
143  oc.addDescription("ignore-errors.connections", "Processing", "Continue on invalid connections");
144 
145  oc.doRegister("show-errors.connections-first-try", new Option_Bool(false));
146  oc.addDescription("show-errors.connections-first-try", "Processing", "Show errors in connections at parsing");
147 
148  oc.doRegister("ignore-errors.edge-type", new Option_Bool(false));
149  oc.addDescription("ignore-errors.edge-type", "Processing", "Continue on unknown edge types");
150 
151  oc.doRegister("lanes-from-capacity.norm", new Option_Float((double) 1800));
152  oc.addSynonyme("lanes-from-capacity.norm", "capacity-norm");
153  oc.addDescription("lanes-from-capacity.norm", "Processing", "The factor for flow to no. lanes conversion");
154 
155  oc.doRegister("speed-in-kmh", new Option_Bool(false));
156  oc.addDescription("speed-in-kmh", "Processing", "vmax is parsed as given in km/h (some)");
157 
158  oc.doRegister("construction-date", new Option_String());
159  oc.addDescription("construction-date", "Processing", "Use YYYY-MM-DD date to determine the readiness of features under construction");
160 
161 
162  // register xml options
163  oc.doRegister("plain.extend-edge-shape", new Option_Bool(false));
164  oc.addSynonyme("plain.extend-edge-shape", "xml.keep-shape", true);
165  oc.addDescription("plain.extend-edge-shape", "Processing", "If edge shapes do not end at the node positions, extend them");
166 
167 
168  // register matsim options
169  oc.doRegister("matsim.keep-length", new Option_Bool(false));
170  oc.addDescription("matsim.keep-length", "Processing", "The edge lengths given in the MATSIM-file will be kept");
171 
172  oc.doRegister("matsim.lanes-from-capacity", new Option_Bool(false));
173  oc.addDescription("matsim.lanes-from-capacity", "Processing", "The lane number will be computed from the capacity");
174 
175 
176  // register shapefile options
177  oc.doRegister("shapefile.street-id", new Option_String());
178  oc.addSynonyme("shapefile.street-id", "arcview.street-id", true);
179  oc.addDescription("shapefile.street-id", "Processing", "Read edge ids from column STR");
180 
181  oc.doRegister("shapefile.from-id", new Option_String());
182  oc.addSynonyme("shapefile.from-id", "arcview.from-id", true);
183  oc.addDescription("shapefile.from-id", "Processing", "Read from-node ids from column STR");
184 
185  oc.doRegister("shapefile.to-id", new Option_String());
186  oc.addSynonyme("shapefile.to-id", "arcview.to-id", true);
187  oc.addDescription("shapefile.to-id", "Processing", "Read to-node ids from column STR");
188 
189  oc.doRegister("shapefile.type-id", new Option_String());
190  oc.addSynonyme("shapefile.type-id", "arcview.type-id", true);
191  oc.addDescription("shapefile.type-id", "Processing", "Read type ids from column STR");
192 
193  oc.doRegister("shapefile.use-defaults-on-failure", new Option_Bool(false));
194  oc.addSynonyme("shapefile.use-defaults-on-failure", "arcview.use-defaults-on-failure", true);
195  oc.addDescription("shapefile.use-defaults-on-failure", "Processing", "Uses edge type defaults on problems");
196 
197  oc.doRegister("shapefile.all-bidirectional", new Option_Bool(false));
198  oc.addSynonyme("shapefile.all-bidirectional", "shapefile.all-bidi");
199  oc.addSynonyme("shapefile.all-bidirectional", "arcview.all-bidi", true);
200  oc.addDescription("shapefile.all-bidirectional", "Processing", "Insert edges in both directions");
201 
202  oc.doRegister("shapefile.guess-projection", new Option_Bool(false));
203  oc.addSynonyme("shapefile.guess-projection", "arcview.guess-projection", true);
204  oc.addDescription("shapefile.guess-projection", "Processing", "Guess the proper projection");
205 
206 
207  // register vissim options
208  oc.doRegister("vissim.join-distance", new Option_Float(5.0f));
209  oc.addSynonyme("vissim.join-distance", "vissim.offset", true);
210  oc.addDescription("vissim.join-distance", "Processing", "Structure join offset");
211 
212  oc.doRegister("vissim.default-speed", new Option_Float(50.0f));
213  oc.addDescription("vissim.default-speed", "Processing", "Use FLOAT as default speed");
214 
215  oc.doRegister("vissim.speed-norm", new Option_Float(1.0f));
216  oc.addDescription("vissim.speed-norm", "Processing", "Factor for edge velocity");
217 
218  oc.doRegister("vissim.report-unset-speeds", new Option_Bool(false));
219  oc.addDescription("vissim.report-unset-speeds", "Processing", "Writes lanes without an explicit speed set");
220 
221 
222  // register visum options
223  oc.doRegister("visum.use-type-priority", new Option_Bool(false));
224  oc.addDescription("visum.use-type-priority", "Processing", "Uses priorities from types");
225 
226  oc.doRegister("visum.use-type-laneno", new Option_Bool(false));
227  oc.addDescription("visum.use-type-laneno", "Processing", "Uses lane numbers from types");
228 
229  oc.doRegister("visum.use-type-speed", new Option_Bool(false));
230  oc.addDescription("visum.use-type-speed", "Processing", "Uses speeds from types");
231 
232  oc.doRegister("visum.connector-speeds", new Option_Float(100.));
233  oc.addDescription("visum.connector-speeds", "Processing", "Sets connector speed");
234 
235  oc.doRegister("visum.connectors-lane-number", new Option_Integer(3));
236  oc.addSynonyme("visum.connectors-lane-number", "visum.connector-laneno", true);
237  oc.addDescription("visum.connectors-lane-number", "Processing", "Sets connector lane number");
238 
239  oc.doRegister("visum.no-connectors", new Option_Bool(false));
240  oc.addDescription("visum.no-connectors", "Processing", "Excludes connectors");
241 
242  oc.doRegister("visum.recompute-lane-number", new Option_Bool(false));
243  oc.addSynonyme("visum.recompute-lane-number", "visum.recompute-laneno", true);
244  oc.addDescription("visum.recompute-lane-number", "Processing", "Computes the number of lanes from the edges' capacities");
245 
246  oc.doRegister("visum.verbose-warnings", new Option_Bool(false));
247  oc.addDescription("visum.verbose-warnings", "Processing", "Prints all warnings, some of which are due to VISUM misbehaviour");
248 
249 
250  // register osm options
251  oc.doRegister("osm.skip-duplicates-check", new Option_Bool(false));
252  oc.addDescription("osm.skip-duplicates-check", "Processing", "Skips the check for duplicate nodes and edges");
253 
254  oc.doRegister("osm.elevation", new Option_Bool(false));
255  oc.addDescription("osm.elevation", "Processing", "Imports elevation data");
256 
257  oc.doRegister("osm.layer-elevation", new Option_Float(0));
258  oc.addDescription("osm.layer-elevation", "Processing", "Reconstruct (relative) elevation based on layer data. Each layer is raised by FLOAT m");
259 
260  oc.doRegister("osm.layer-elevation.max-grade", new Option_Float(10));
261  oc.addDescription("osm.layer-elevation.max-grade", "Processing", "Maximum grade threshold in % at 50km/h when reconstrucing elevation based on layer data. The value is scaled according to road speed.");
262 
263  oc.doRegister("osm.oneway-spread-right", new Option_Bool(false));
264  oc.addDescription("osm.oneway-spread-right", "Processing", "Whether one-way roads should be spread to the side instead of centered");
265 
266  oc.doRegister("osm.stop-output.length", new Option_Float(100));
267  oc.addDescription("osm.stop-output.length", "Processing", "The default length of a bus/train stop in FLOAT m");
268 
269  // register opendrive options
270  oc.doRegister("opendrive.import-all-lanes", new Option_Bool(false));
271  oc.addDescription("opendrive.import-all-lanes", "Processing", "Imports all lane types");
272  oc.doRegister("opendrive.ignore-widths", new Option_Bool(false));
273  oc.addDescription("opendrive.ignore-widths", "Processing", "Whether lane widths shall be ignored.");
274  oc.doRegister("opendrive.curve-resolution", new Option_Float(2.0));
275  oc.addDescription("opendrive.curve-resolution", "Processing", "The geometry resolution in m when importing curved geometries as line segments.");
276  oc.doRegister("opendrive.advance-stopline", new Option_Float(12.0));
277  oc.addDescription("opendrive.advance-stopline", "Processing", "Allow stop lines to be built beyond the start of the junction if the geometries allow so");
278 
279  // register some additional options
280  oc.doRegister("tls.discard-loaded", new Option_Bool(false));
281  oc.addDescription("tls.discard-loaded", "TLS Building", "Does not instatiate traffic lights loaded from other formats than XML");
282 
283  oc.doRegister("tls.discard-simple", new Option_Bool(false));
284  oc.addDescription("tls.discard-simple", "TLS Building", "Does not instatiate traffic lights at geometry-like nodes loaded from other formats than XML");
285 }
286 
287 
288 bool
291  bool ok = oc.checkDependingSuboptions("shapefile", "shapefile.");
292  ok &= oc.checkDependingSuboptions("visum-file", "visum.");
293  ok &= oc.checkDependingSuboptions("vissim-file", "vissim.");
294 #ifdef HAVE_PROJ
295  int numProjections = oc.getBool("simple-projection") + oc.getBool("proj.utm") + oc.getBool("proj.dhdn") + (oc.getString("proj").length() > 1);
296  if ((oc.isSet("osm-files") || oc.isSet("dlr-navteq-prefix") || oc.isSet("shapefile-prefix")) && numProjections == 0) {
297  if (oc.isDefault("proj")) {
298  oc.set("proj.utm", "true");
299  }
300  }
301  if (oc.isSet("dlr-navteq-prefix") && oc.isDefault("proj.scale")) {
302  oc.set("proj.scale", toString(NIImporter_DlrNavteq::GEO_SCALE));
303  }
304 #else
305  if ((oc.isSet("osm-files") || oc.isSet("dlr-navteq-prefix") || oc.isSet("shapefile-prefix")) && !oc.getBool("simple-projection")) {
306  WRITE_ERROR("Cannot import network data without PROJ-Library. Please install packages proj before building sumo");
307  ok = false;
308  }
309 #endif
310  if (oc.isSet("sumo-net-file")) {
311  if (oc.isWriteable("no-turnarounds")) {
312  // changed default since turnarounds are loaded from the net file.
313  oc.set("no-turnarounds", "true");
314  }
315  if (oc.isWriteable("offset.disable-normalization")) {
316  // changed default since we wish to preserve the network as far as possible
317  oc.set("offset.disable-normalization", "true");
318  }
319  }
320  if (!oc.isSet("type-files")) {
321  const char* sumoPath = std::getenv("SUMO_HOME");
322  if (sumoPath == 0) {
323  WRITE_WARNING("Environment variable SUMO_HOME is not set, using built in type maps.");
324  } else {
325  const std::string path = sumoPath + std::string("/data/typemap/");
326  if (oc.isSet("osm-files")) {
327  oc.setDefault("type-files", path + "osmNetconvert.typ.xml");
328  }
329  if (oc.isSet("opendrive-files")) {
330  oc.setDefault("type-files", path + "opendriveNetconvert.typ.xml");
331  }
332  }
333  }
334  if (oc.isSet("opendrive-files")) {
335  if (oc.isDefault("tls.left-green.time")) {
336  // legacy behavior. see #2114
337  oc.set("tls.left-green.time", "0");
338  }
339  if (oc.isDefault("rectangular-lane-cut")) {
340  // a better interpretation of imported geometries
341  oc.set("rectangular-lane-cut", "true");
342  }
343  }
344  return ok;
345 }
346 
347 
348 
349 /****************************************************************************/
350 
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
Definition: OptionsCont.cpp:82
static void fillOptions()
Inserts options used by the network importer and network building modules.
Definition: NIFrame.cpp:56
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
#define WRITE_WARNING(msg)
Definition: MsgHandler.h:200
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:65
void addSynonyme(const std::string &name1, const std::string &name2, bool isDeprecated=false)
Adds a synonyme for an options name (any order)
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:56
bool setDefault(const std::string &name, const std::string &value)
Sets the given value for the named option as new default value.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool isWriteable(const std::string &name)
Returns the information whether the named option may be set.
static bool checkOptions()
Checks set options from the OptionsCont-singleton for being valid.
Definition: NIFrame.cpp:289
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:206
bool checkDependingSuboptions(const std::string &name, const std::string &prefix) const
Checks whether an option is set, which has options with a prefix depending on it. ...
bool set(const std::string &name, const std::string &value)
Sets the given value for the named option.
An integer-option.
Definition: Option.h:313
void addXMLDefault(const std::string &name, const std::string &xmlRoot="")
Adds an XML root element to handle by default. The special root "" denotes the default handler...
A storage for options typed value containers)
Definition: OptionsCont.h:99
static const int GEO_SCALE
scaling factor for geo coordinates (DLRNavteq format uses this to increase floating point precisions)...
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.