SUMO - Simulation of Urban MObility
NIFrame.cpp
Go to the documentation of this file.
00001 /****************************************************************************/
00009 // Sets and checks options for netimport
00010 /****************************************************************************/
00011 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00012 // Copyright (C) 2001-2012 DLR (http://www.dlr.de/) and contributors
00013 /****************************************************************************/
00014 //
00015 //   This file is part of SUMO.
00016 //   SUMO is free software: you can redistribute it and/or modify
00017 //   it under the terms of the GNU General Public License as published by
00018 //   the Free Software Foundation, either version 3 of the License, or
00019 //   (at your option) any later version.
00020 //
00021 /****************************************************************************/
00022 
00023 
00024 // ===========================================================================
00025 // included modules
00026 // ===========================================================================
00027 #ifdef _MSC_VER
00028 #include <windows_config.h>
00029 #else
00030 #include <config.h>
00031 #endif
00032 
00033 #include <string>
00034 #include <iostream>
00035 #include <fstream>
00036 #include <utils/options/Option.h>
00037 #include <utils/options/OptionsCont.h>
00038 #include <utils/options/OptionsIO.h>
00039 #include <utils/common/MsgHandler.h>
00040 #include <utils/common/ToString.h>
00041 #include "NIFrame.h"
00042 #include <utils/common/FileHelpers.h>
00043 #include <utils/common/UtilExceptions.h>
00044 #include <utils/common/RandHelper.h>
00045 #include <netbuild/NBNetBuilder.h>
00046 #include <netwrite/NWFrame.h>
00047 #include <utils/common/SystemFrame.h>
00048 
00049 #ifdef CHECK_MEMORY_LEAKS
00050 #include <foreign/nvwa/debug_new.h>
00051 #endif // CHECK_MEMORY_LEAKS
00052 
00053 
00054 // ===========================================================================
00055 // method definitions
00056 // ===========================================================================
00057 void
00058 NIFrame::fillOptions() {
00059     OptionsCont& oc = OptionsCont::getOptions();
00060     // register input formats
00061     oc.doRegister("sumo-net-file", 's', new Option_FileName());
00062     oc.addSynonyme("sumo-net-file", "sumo-net", true);
00063     oc.addDescription("sumo-net-file", "Input", "Read SUMO-net from FILE");
00064 
00065     oc.doRegister("node-files", 'n', new Option_FileName());
00066     oc.addSynonyme("node-files", "xml-node-files", true);
00067     oc.addSynonyme("node-files", "xml-nodes", true);
00068     oc.addSynonyme("node-files", "nodes");
00069     oc.addDescription("node-files", "Input", "Read XML-node defs from FILE");
00070 
00071     oc.doRegister("edge-files", 'e', new Option_FileName());
00072     oc.addSynonyme("edge-files", "xml-edge-files", true);
00073     oc.addSynonyme("edge-files", "xml-edges", true);
00074     oc.addSynonyme("edge-files", "edges");
00075     oc.addDescription("edge-files", "Input", "Read XML-edge defs from FILE");
00076 
00077     oc.doRegister("connection-files", 'x', new Option_FileName());
00078     oc.addSynonyme("connection-files", "xml-connection-files", true);
00079     oc.addSynonyme("connection-files", "xml-connections", true);
00080     oc.addSynonyme("connection-files", "connections");
00081     oc.addDescription("connection-files", "Input", "Read XML-connection defs from FILE");
00082 
00083     oc.doRegister("tllogic-files", 'i', new Option_FileName());
00084     oc.addDescription("tllogic-files", "Input", "Read XML-traffic light defs from FILE");
00085 
00086     oc.doRegister("type-files", 't', new Option_FileName());
00087     oc.addSynonyme("type-files", "xml-type-files", true);
00088     oc.addSynonyme("type-files", "xml-types", true);
00089     oc.addSynonyme("type-files", "types");
00090     oc.addDescription("type-files", "Input", "Read XML-type defs from FILE");
00091 
00092     oc.doRegister("shapefile-prefix", new Option_FileName());
00093     oc.addSynonyme("shapefile-prefix", "shapefile");
00094     oc.addSynonyme("shapefile-prefix", "arcview", true);
00095     oc.addSynonyme("shapefile-prefix", "tiger", true);
00096     oc.addDescription("shapefile-prefix", "Input", "Read shapefiles (ArcView, Tiger, ...) from files starting with 'FILE'");
00097 
00098     oc.doRegister("dlr-navteq-prefix", new Option_FileName());
00099     oc.addSynonyme("dlr-navteq-prefix", "dlr-navteq");
00100     oc.addSynonyme("dlr-navteq-prefix", "elmar2", true);
00101     oc.addDescription("dlr-navteq-prefix", "Input", "Read converted Navteq GDF data (unsplitted Elmar-network) from path 'FILE'");
00102 
00103     oc.doRegister("osm-files", new Option_FileName());
00104     oc.addSynonyme("osm-files", "osm");
00105     oc.addDescription("osm-files", "Input", "Read OSM-network from path 'FILE(s)'");
00106 
00107     oc.doRegister("opendrive-files", new Option_FileName());
00108     oc.addSynonyme("opendrive-files", "opendrive");
00109     oc.addDescription("opendrive-files", "Input", "Read openDrive-network from FILE");
00110 
00111     oc.doRegister("visum-file", new Option_FileName());
00112     oc.addSynonyme("visum-file", "visum");
00113     oc.addDescription("visum-file", "Input", "Read VISUM-net from FILE");
00114 
00115     oc.doRegister("vissim-file", new Option_FileName());
00116     oc.addSynonyme("vissim-file", "vissim");
00117     oc.addDescription("vissim-file", "Input", "Read VISSIM-net from FILE");
00118 
00119     oc.doRegister("robocup-dir", new Option_FileName());
00120     oc.addSynonyme("robocup-dir", "robocup-net", true);
00121     oc.addSynonyme("robocup-dir", "robocup");
00122     oc.addDescription("robocup-dir", "Input", "Read RoboCup-net from DIR");
00123 
00124     oc.doRegister("matsim-files", new Option_FileName());
00125     oc.addSynonyme("matsim-files", "matsim");
00126     oc.addDescription("matsim-files", "Input", "Read MATsim-net from FILE");
00127 
00128     oc.doRegister("itsumo-files", new Option_FileName());
00129     oc.addSynonyme("itsumo-files", "itsumo");
00130     oc.addDescription("itsumo-files", "Input", "Read ITSUMO-net from FILE");
00131 
00132 #ifdef HAVE_MESOSIM // catchall for internal stuff
00133     oc.doRegister("heightmap.shapefiles", new Option_FileName());
00134     oc.addDescription("heightmap.shapefiles", "Input", "Read heightmap from ArcGIS shapefile");
00135 #endif // have HAVE_MESOSIM
00136 
00137     // register basic processing options
00138     oc.doRegister("ignore-errors", new Option_Bool(false));
00139     oc.addSynonyme("ignore-errors", "dismiss-loading-errors", true);
00140     oc.addDescription("ignore-errors", "Processing", "Continue on broken input");
00141 
00142     oc.doRegister("ignore-errors.connections", new Option_Bool(false));
00143     oc.addDescription("ignore-errors.connections", "Processing", "Continue on invalid connections");
00144 
00145     oc.doRegister("lanes-from-capacity.norm", new Option_Float((SUMOReal) 1800));
00146     oc.addSynonyme("lanes-from-capacity.norm", "capacity-norm");
00147     oc.addDescription("lanes-from-capacity.norm", "Processing", "The factor for flow to no. lanes conversion.");
00148 
00149     oc.doRegister("speed-in-kmh", new Option_Bool(false));
00150     oc.addDescription("speed-in-kmh", "Processing", "vmax is parsed as given in km/h (some)");
00151 
00152 
00153     // register xml options
00154     oc.doRegister("plain.keep-edge-shape", new Option_Bool(false));
00155     oc.addSynonyme("plain.keep-edge-shape", "xml.keep-shape", true);
00156     oc.addDescription("plain.keep-edge-shape", "Processing", "No node positions are added to the edge shape");
00157 
00158 
00159     // register matsim options
00160     oc.doRegister("matsim.keep-length", new Option_Bool(false));
00161     oc.addDescription("matsim.keep-length", "Processing", "The edge lengths given in the MATSIM-file will be kept.");
00162 
00163     oc.doRegister("matsim.lanes-from-capacity", new Option_Bool(false));
00164     oc.addDescription("matsim.lanes-from-capacity", "Processing", "The lane number will be computed from the capacity.");
00165 
00166 
00167     // register shapefile options
00168     oc.doRegister("shapefile.street-id", new Option_String());
00169     oc.addSynonyme("shapefile.street-id", "arcview.street-id", true);
00170     oc.addDescription("shapefile.street-id", "Processing", "Read edge ids from column STR");
00171 
00172     oc.doRegister("shapefile.from-id", new Option_String());
00173     oc.addSynonyme("shapefile.from-id", "arcview.from-id", true);
00174     oc.addDescription("shapefile.from-id", "Processing", "Read from-node ids from column STR");
00175 
00176     oc.doRegister("shapefile.to-id", new Option_String());
00177     oc.addSynonyme("shapefile.to-id", "arcview.to-id", true);
00178     oc.addDescription("shapefile.to-id", "Processing", "Read to-node ids from column STR");
00179 
00180     oc.doRegister("shapefile.type-id", new Option_String());
00181     oc.addSynonyme("shapefile.type-id", "arcview.type-id", true);
00182     oc.addDescription("shapefile.type-id", "Processing", "Read type ids from column STR");
00183 
00184     oc.doRegister("shapefile.use-defaults-on-failure", new Option_Bool(false));
00185     oc.addSynonyme("shapefile.use-defaults-on-failure", "arcview.use-defaults-on-failure", true);
00186     oc.addDescription("shapefile.use-defaults-on-failure", "Processing", "Uses edge type defaults on problems");
00187 
00188     oc.doRegister("shapefile.all-bidirectional", new Option_Bool(false));
00189     oc.addSynonyme("shapefile.all-bidirectional", "shapefile.all-bidi");
00190     oc.addSynonyme("shapefile.all-bidirectional", "arcview.all-bidi", true);
00191     oc.addDescription("shapefile.all-bidirectional", "Processing", "Insert edges in both directions");
00192 
00193     oc.doRegister("shapefile.guess-projection", new Option_Bool(false));
00194     oc.addSynonyme("shapefile.guess-projection", "arcview.guess-projection", true);
00195     oc.addDescription("shapefile.guess-projection", "Processing", "Guess the proper projection");
00196 
00197 
00198     // register vissim options
00199     oc.doRegister("vissim.join-distance", new Option_Float(5.0f));
00200     oc.addSynonyme("vissim.join-distance", "vissim.offset", true);
00201     oc.addDescription("vissim.join-distance", "Processing", "Structure join offset");
00202 
00203     oc.doRegister("vissim.default-speed", new Option_Float(50.0f));
00204     oc.addDescription("vissim.default-speed", "Processing", "Use FLOAT as default speed");
00205 
00206     oc.doRegister("vissim.speed-norm", new Option_Float(1.0f));
00207     oc.addDescription("vissim.speed-norm", "Processing", "Factor for edge velocity");
00208 
00209     oc.doRegister("vissim.report-unset-speeds", new Option_Bool(false));
00210     oc.addDescription("vissim.report-unset-speeds", "Processing", "Writes lanes without an explicit speed set.");
00211 
00212 
00213     // register visum options
00214     oc.doRegister("visum.use-type-priority", new Option_Bool(false));
00215     oc.addDescription("visum.use-type-priority", "Processing", "Uses priorities from types");
00216 
00217     oc.doRegister("visum.use-type-laneno", new Option_Bool(false));
00218     oc.addDescription("visum.use-type-laneno", "Processing", "Uses lane numbers from types");
00219 
00220     oc.doRegister("visum.use-type-speed", new Option_Bool(false));
00221     oc.addDescription("visum.use-type-speed", "Processing", "Uses speeds from types");
00222 
00223     oc.doRegister("visum.connector-speeds", new Option_Float(100.));
00224     oc.addDescription("visum.connector-speeds", "Processing", "Sets connector speed");
00225 
00226     oc.doRegister("visum.connectors-lane-number", new Option_Integer(3));
00227     oc.addSynonyme("visum.connectors-lane-number", "visum.connector-laneno", true);
00228     oc.addDescription("visum.connectors-lane-number", "Processing", "Sets connector lane number");
00229 
00230     oc.doRegister("visum.no-connectors", new Option_Bool(false));
00231     oc.addDescription("visum.no-connectors", "Processing", "Excludes connectors");
00232 
00233     oc.doRegister("visum.recompute-lane-number", new Option_Bool(false));
00234     oc.addSynonyme("visum.recompute-lane-number", "visum.recompute-laneno", true);
00235     oc.addDescription("visum.recompute-lane-number", "Processing", "Computes the number of lanes from the edges' capacities");
00236 
00237     oc.doRegister("visum.verbose-warnings", new Option_Bool(false));
00238     oc.addDescription("visum.verbose-warnings", "Processing", "Prints all warnings, some of which are due to VISUM misbehaviour");
00239 
00240 
00241     // register osm options
00242     oc.doRegister("osm.skip-duplicates-check", new Option_Bool(false));
00243     oc.addDescription("osm.skip-duplicates-check", "Processing", "Skips the check for duplicate nodes and edges.");
00244 
00245     oc.doRegister("osm.discard-tls", new Option_Bool(false));
00246     oc.addDescription("osm.discard-tls", "Processing", "Discards all traffic lights.");
00247 }
00248 
00249 
00250 bool
00251 NIFrame::checkOptions() {
00252     OptionsCont& oc = OptionsCont::getOptions();
00253     bool ok = oc.checkDependingSuboptions("shapefile", "shapefile.");
00254     ok &= oc.checkDependingSuboptions("visum-file", "visum.");
00255     ok &= oc.checkDependingSuboptions("vissim-file", "vissim.");
00256 #ifdef HAVE_PROJ
00257     unsigned numProjections = oc.getBool("simple-projection") + oc.getBool("proj.utm") + oc.getBool("proj.dhdn") + (oc.getString("proj").length() > 1);
00258     if ((oc.isSet("osm-files") || oc.isSet("dlr-navteq-prefix") || oc.isSet("shapefile-prefix")) && numProjections == 0) {
00259         if(oc.isDefault("proj")) {
00260             oc.set("proj.utm", "true");
00261         }
00262     }
00263     if (oc.isSet("dlr-navteq-prefix") && oc.isDefault("proj.scale")) {
00264         oc.set("proj.scale", std::string("5"));
00265     }
00266 #endif
00267     if (oc.isSet("sumo-net-file")) {
00268         if (oc.isWriteable("no-turnarounds")) {
00269             // changed default since turnarounds are loaded from the net file.
00270             oc.set("no-turnarounds", "true");
00271         }
00272         if (oc.isWriteable("offset.disable-normalization")) {
00273             // changed default since we wish to preserve the network as far as possible
00274             oc.set("offset.disable-normalization", "true");
00275         }
00276     }
00277     return ok;
00278 }
00279 
00280 
00281 
00282 /****************************************************************************/
00283 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines