#include <config.h>
#include <string>
#include <utils/common/UtilExceptions.h>
#include <utils/common/MsgHandler.h>
#include <utils/options/OptionsCont.h>
#include <utils/options/Option.h>
#include <utils/common/FileHelpers.h>
#include <utils/common/StringUtils.h>
#include <utils/common/ToString.h>
#include <utils/common/StringUtils.h>
#include <utils/geom/GeoConvHelper.h>
#include <netbuild/NBTypeCont.h>
#include <netbuild/NBNodeCont.h>
#include <netbuild/NBEdgeCont.h>
#include <netbuild/NBHeightMapper.h>
#include <netbuild/NBNetBuilder.h>
#include <netimport/NIXMLEdgesHandler.h>
#include <netimport/NIXMLNodesHandler.h>
#include <netimport/NIXMLTrafficLightsHandler.h>
#include <netimport/NIXMLTypesHandler.h>
#include <netimport/NIXMLPTHandler.h>
#include <netimport/NIXMLShapeHandler.h>
#include <netimport/NIXMLConnectionsHandler.h>
#include <netimport/NIImporter_DlrNavteq.h>
#include <netimport/NIImporter_VISUM.h>
#include <netimport/vissim/NIImporter_Vissim.h>
#include <netimport/NIImporter_ArcView.h>
#include <netimport/NIImporter_SUMO.h>
#include <netimport/NIImporter_OpenStreetMap.h>
#include <netimport/NIImporter_OpenDrive.h>
#include <netimport/NIImporter_MATSim.h>
#include <netimport/NIImporter_ITSUMO.h>
#include <netimport/typemap.h>
#include "NILoader.h"
#include "NITypeLoader.h"
NILoader::NILoader(NBNetBuilder& nb)
: myNetBuilder(nb) {}
NILoader::~NILoader() {}
void
NILoader::load(OptionsCont& oc) {
bool ok = true;
NIXMLTypesHandler handler(myNetBuilder.getTypeCont());
if (!oc.isSet("type-files")) {
std::vector<std::string> files;
if (oc.isSet("osm-files")) {
files.push_back(osmTypemap);
}
if (oc.isSet("opendrive-files")) {
files.push_back(opendriveTypemap);
}
ok &= NITypeLoader::load(handler, files, toString(SUMO_TAG_TYPES), true);
} else {
ok &= NITypeLoader::load(handler, oc.getStringVector("type-files"), toString(SUMO_TAG_TYPES));
}
NBHeightMapper::loadIfSet(oc);
NIImporter_SUMO::loadNetwork(oc, myNetBuilder);
NIImporter_OpenStreetMap::loadNetwork(oc, myNetBuilder);
NIImporter_VISUM::loadNetwork(oc, myNetBuilder);
NIImporter_ArcView::loadNetwork(oc, myNetBuilder);
NIImporter_Vissim::loadNetwork(oc, myNetBuilder);
NIImporter_DlrNavteq::loadNetwork(oc, myNetBuilder);
NIImporter_OpenDrive::loadNetwork(oc, myNetBuilder);
NIImporter_MATSim::loadNetwork(oc, myNetBuilder);
NIImporter_ITSUMO::loadNetwork(oc, myNetBuilder);
if (oc.getBool("tls.discard-loaded") || oc.getBool("tls.discard-simple")) {
myNetBuilder.getNodeCont().discardTrafficLights(myNetBuilder.getTLLogicCont(), oc.getBool("tls.discard-simple"));
int removed = myNetBuilder.getTLLogicCont().getNumExtracted();
if (removed > 0) {
WRITE_MESSAGEF(TL(" Removed % traffic lights before loading plain-XML"), toString(removed));
}
}
if (oc.getBool("railway.signals.discard")) {
myNetBuilder.getNodeCont().discardRailSignals();
}
ok &= loadXML(oc);
if (myNetBuilder.getNodeCont().size() == 0) {
throw ProcessError(TL("No nodes loaded."));
}
if (myNetBuilder.getEdgeCont().size() == 0) {
throw ProcessError(TL("No edges loaded."));
}
if (!myNetBuilder.getEdgeCont().checkConsistency(myNetBuilder.getNodeCont())) {
throw ProcessError();
}
if (!ok && !oc.getBool("ignore-errors")) {
throw ProcessError();
}
myNetBuilder.getNodeCont().applyConditionalDefaults();
WRITE_MESSAGE(TL(" Import done:"));
if (myNetBuilder.getDistrictCont().size() > 0) {
WRITE_MESSAGEF(TL(" % districts loaded."), toString(myNetBuilder.getDistrictCont().size()));
}
WRITE_MESSAGEF(TL(" % nodes loaded."), toString(myNetBuilder.getNodeCont().size()));
if (myNetBuilder.getTypeCont().size() > 0) {
WRITE_MESSAGEF(TL(" % types loaded."), toString(myNetBuilder.getTypeCont().size()));
}
WRITE_MESSAGEF(TL(" % edges loaded."), toString(myNetBuilder.getEdgeCont().size()));
if (myNetBuilder.getEdgeCont().getNumEdgeSplits() > 0) {
WRITE_MESSAGEF(TL("The split of edges was performed % times."), toString(myNetBuilder.getEdgeCont().getNumEdgeSplits()));
}
if (GeoConvHelper::getProcessing().usingGeoProjection()) {
WRITE_MESSAGEF(TL("Proj projection parameters used: '%'."), GeoConvHelper::getProcessing().getProjString());
}
}
bool
NILoader::loadXML(OptionsCont& oc) {
NIXMLNodesHandler nodesHandler(myNetBuilder.getNodeCont(), myNetBuilder.getEdgeCont(),
myNetBuilder.getTLLogicCont(), oc);
bool ok = NITypeLoader::load(nodesHandler, oc.getStringVector("node-files"), "nodes");
if (ok) {
NIXMLEdgesHandler edgesHandler(myNetBuilder.getNodeCont(), myNetBuilder.getEdgeCont(),
myNetBuilder.getTypeCont(), myNetBuilder.getDistrictCont(),
myNetBuilder.getTLLogicCont(), oc);
ok = NITypeLoader::load(edgesHandler, oc.getStringVector("edge-files"), "edges");
}
if (!deprecatedVehicleClassesSeen.empty()) {
WRITE_WARNINGF(TL("Deprecated vehicle class(es) '%' in input edge files."), toString(deprecatedVehicleClassesSeen));
}
if (ok) {
NIXMLConnectionsHandler connectionsHandler(myNetBuilder.getEdgeCont(),
myNetBuilder.getNodeCont(), myNetBuilder.getTLLogicCont());
ok = NITypeLoader::load(connectionsHandler, oc.getStringVector("connection-files"), "connections");
}
if (ok) {
NIXMLTrafficLightsHandler tlHandler(myNetBuilder.getTLLogicCont(), myNetBuilder.getEdgeCont());
ok = NITypeLoader::load(tlHandler, oc.getStringVector("tllogic-files"), "traffic lights");
}
if (ok && oc.exists("ptstop-files")) {
NIXMLPTHandler ptHandler(myNetBuilder.getEdgeCont(),
myNetBuilder.getPTStopCont(), myNetBuilder.getPTLineCont());
ok = NITypeLoader::load(ptHandler, oc.getStringVector("ptstop-files"), "public transport stops");
}
if (ok && oc.exists("ptline-files")) {
NIXMLPTHandler ptHandler(myNetBuilder.getEdgeCont(),
myNetBuilder.getPTStopCont(), myNetBuilder.getPTLineCont());
ok = NITypeLoader::load(ptHandler, oc.getStringVector("ptline-files"), "public transport lines");
}
if (ok && oc.exists("polygon-files")) {
NIXMLShapeHandler shapeHandler(myNetBuilder.getShapeCont(), myNetBuilder.getEdgeCont());
ok = NITypeLoader::load(shapeHandler, oc.getStringVector("polygon-files"), "polygon data");
}
return ok;
}