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