53 const bool emptyDestinationsAllowed,
54 const bool ignoreErrors,
55 const bool checkSchema) :
59 OptionsCont::getOptions().getFloat(
"mapmatch.distance"),
79 &&
OptionsCont::getOptions().getBool(
"write-trips.junctions")) {
107 const std::string element =
toString(tag);
117 if (type !=
nullptr) {
126 const std::string tazType = useJunction ?
"junction" :
"taz";
128 const ROEdge* fromTaz =
myNet.getEdge(tazID +
"-source");
129 if (fromTaz ==
nullptr) {
170 const ROEdge* viaSink =
myNet.getEdge(junctionID +
"-sink");
171 if (viaSink ==
nullptr) {
175 viaEdges.push_back(viaSink);
181 for (
const ROEdge* e : viaEdges) {
190 const std::string tazType = useJunction ?
"junction" :
"taz";
192 const ROEdge* toTaz =
myNet.getEdge(tazID +
"-sink");
193 if (toTaz ==
nullptr) {
253 (*myActiveContainerPlan) << attrs;
262 (*myActiveContainerPlan) << attrs;
291 std::vector<double> probs;
302 const std::string typeID = st.
next();
304 if (dist !=
nullptr) {
305 const double distProb = ((int)probs.size() > probIndex ? probs[probIndex] : 1.) / dist->
getOverallProb();
306 std::vector<double>::const_iterator probIt = dist->
getProbs().begin();
313 if (type ==
nullptr) {
316 const double prob = ((int)probs.size() > probIndex ? probs[probIndex] : type->
defaultProbability);
322 if (probs.size() > 0 && probIndex != (
int)probs.size()) {
396 if (type !=
nullptr) {
401 myErrorOutput->inform(
"Disconnected route " + rid +
" when repeating.");
463 const ROEdge* last =
nullptr;
466 if (last !=
nullptr) {
468 if (intern->isInternal() && intern->getSuccessors().size() == 1 && intern->getSuccessors().front() == roe) {
469 fullRoute.push_back(intern);
473 fullRoute.push_back(roe);
485 if (stop.until > 0) {
490 throw ProcessError(
TLF(
"Cannot repeat stops with 'until' in route % because no cycleTime is defined.", description));
547 if (ok && index < 0) {
548 myErrorOutput->inform(
"Negative index of a route alternative (id='" +
id +
"').");
557 const std::string routeID = st.
next();
559 if (route ==
nullptr) {
560 myErrorOutput->inform(
"Unknown route '" + routeID +
"' in distribution '" +
id +
"'.");
588 const ROEdge* fromTaz =
myNet.getEdge(tazID +
"-source");
589 if (fromTaz ==
nullptr) {
596 edges.push_back(fromTaz);
603 const ROEdge* toTaz =
myNet.getEdge(tazID +
"-sink");
604 if (toTaz ==
nullptr) {
611 edges.push_back(toTaz);
638 if (type ==
nullptr) {
652 if (route ==
nullptr) {
659 const bool needCopy = route->
getID()[0] !=
'!';
667 }
else if (needCopy) {
693 if (type ==
nullptr) {
702 person->
getPlan().push_back(item);
704 if (
myNet.addPerson(person)) {
747 std::vector<SUMOTime> departures;
752 std::sort(departures.begin(), departures.end());
753 std::reverse(departures.begin(), departures.end());
794 person->
getPlan().push_back(item->clone());
796 if (
myNet.addPerson(person)) {
898 if (stopParam !=
nullptr) {
913 if (toStop ==
nullptr) {
919 if (toStop ==
nullptr) {
925 if (toStop ==
nullptr) {
932 if (toStop ==
nullptr) {
939 if (toStop ==
nullptr) {
951 (*myActiveContainerPlan) << attrs;
956 std::string errorSuffix;
972 const ROEdge* edge =
nullptr;
973 std::string stoppingPlaceID;
976 if (stoppingPlace !=
nullptr) {
985 if (ok && stop.
edge !=
"") {
987 if (edge ==
nullptr) {
988 myErrorOutput->inform(
"The edge '" + stop.
edge +
"' for a stop is not known" + errorSuffix);
991 }
else if (ok && stop.
lane !=
"") {
993 if (edge ==
nullptr) {
994 myErrorOutput->inform(
"The lane '" + stop.
lane +
"' for a stop is not known" + errorSuffix);
1008 positions.push_back(pos);
1013 if (type !=
nullptr) {
1019 edge = geoEdges.front();
1025 stop.
endPos = edge->
getLanes()[0]->getShape().nearest_offset_to_point2D(pos,
false);
1029 }
else if (!ok || (stop.
lane ==
"" && stop.
edge ==
"")) {
1030 myErrorOutput->inform(
"A stop must be placed on a bus stop, a container stop, a parking area, an edge or a lane" + errorSuffix);
1040 myErrorOutput->inform(
"Invalid start or end position for stop" + errorSuffix);
1066 std::vector<ROPerson::PlanItem*>& plan = *
myActivePlan;
1069 const ROEdge* from =
nullptr;
1070 const ROEdge* to =
nullptr;
1077 }
else if (plan.empty()) {
1078 myErrorOutput->inform(
"The start edge for person '" + pid +
"' is not known.");
1081 std::string stoppingPlaceID;
1083 if (stop !=
nullptr) {
1095 stop ==
nullptr ? std::numeric_limits<double>::infinity() : stop->
endPos);
1102 myErrorOutput->inform(
"Triggered departure for person '" + pid +
"' requires a unique lines value.");
1105 const std::string vehID = st.
front();
1106 if (
myNet.knowsVehicle(vehID)) {
1108 if (vehDepart == -1) {
1109 myErrorOutput->inform(
"Cannot use triggered vehicle '" + vehID +
"' in triggered departure for person '" + pid +
"'.");
1115 myErrorOutput->inform(
"Unknown vehicle '" + vehID +
"' in triggered departure for person '" + pid +
"'.");
1132 if (st.
size() != 1) {
1133 throw ProcessError(
TLF(
"Triggered departure for container '%' requires a unique lines value.", pid));
1135 const std::string vehID = st.
front();
1136 if (!
myNet.knowsVehicle(vehID)) {
1138 throw ProcessError(
"Unknown vehicle '" + vehID +
"' in triggered departure for container '" + pid +
"'.");
1143 if (vehDepart == -1) {
1144 throw ProcessError(
"Cannot use triggered vehicle '" + vehID +
"' in triggered departure for container '" + pid +
"'.");
1158 const std::string& rid,
bool& ok) {
1160 const std::string
id = st.next();
1162 if (edge ==
nullptr) {
1163 myErrorOutput->inform(
"The edge '" +
id +
"' within the route " + rid +
" is not known.");
1166 into.push_back(edge);
1175 double& departPos,
double& arrivalPos, std::string& busStopID,
1177 const std::string description =
"walk or personTrip of '" + personID +
"'.";
1179 WRITE_WARNING(
TL(
"The attribute departPos is no longer supported for walks, please use the person attribute, the arrivalPos of the previous step or explicit stops."));
1182 if (lastStage !=
nullptr) {
1189 if (bs !=
nullptr) {
1191 arrivalPos = (bs->startPos + bs->endPos) / 2;
1193 if (toEdge !=
nullptr) {
1210 const ROEdge* from =
nullptr;
1211 const ROEdge* to =
nullptr;
1234 double departPos = 0;
1235 double arrivalPos = std::numeric_limits<double>::infinity();
1236 std::string busStopID;
1244 const std::string mode = st.next();
1245 if (mode ==
"car") {
1247 }
else if (mode ==
"taxi") {
1249 }
else if (mode ==
"bicycle") {
1251 }
else if (mode ==
"public") {
1262 departPos, originStopID, arrivalPos, busStopID, walkFactor, group);
1278 if (route ==
nullptr) {
1295 double departPos = 0.;
1296 double arrivalPos = std::numeric_limits<double>::infinity();
1298 WRITE_WARNING(
TL(
"The attribute departPos is no longer supported for walks, please use the person attribute, the arrivalPos of the previous step or explicit stops."));
1303 std::string stoppingPlaceID;
1304 const std::string errorSuffix =
" for walk of person '" +
myVehicleParameter->id +
"'";
1318 for (
const auto& edgeItem :
myNet.getEdgeMap()) {
1319 for (
ROLane* lane : edgeItem.second->getLanes()) {
1320 Boundary b = lane->getShape().getBoxBoundary();
1321 const float cmin[2] = {(float) b.xmin(), (float) b.ymin()};
1322 const float cmax[2] = {(float) b.xmax(), (float) b.ymax()};
1323 tree->
Insert(cmin, cmax, lane);
1331 return myNet.getEdge(
id);
#define JUNCTION_TAZ_MISSING_HELP
#define WRITE_WARNINGF(...)
#define WRITE_WARNING(msg)
std::vector< const ROEdge * > ConstROEdgeVector
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
const double DEFAULT_VEH_PROB
const std::string DEFAULT_PEDTYPE_ID
const std::string DEFAULT_VTYPE_ID
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_IGNORING
vehicles ignoring classes
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_TAXI
vehicle is a taxi
@ SVC_BUS
vehicle is a bus
@ SVC_PEDESTRIAN
pedestrian
const std::string LINE_ANY
const long long int VEHPARS_TO_TAZ_SET
const long long int VEHPARS_FROM_TAZ_SET
@ GIVEN
The time is given.
@ TRIGGERED
The departure is person triggered.
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_TAG_CHARGING_STATION
A Charging Station.
@ SUMO_TAG_CONTAINER_STOP
A container stop.
@ SUMO_TAG_BUS_STOP
A bus stop.
@ SUMO_TAG_STOP
stop for vehicles
@ SUMO_TAG_FLOW
a flow definition using from and to edges or a route
@ SUMO_TAG_PARKING_AREA
A parking area.
@ SUMO_TAG_OVERHEAD_WIRE_SEGMENT
An overhead wire segment.
@ SUMO_TAG_PARAM
parameter associated to a certain key
@ SUMO_TAG_TRIP
a single trip definition (used by router)
@ SUMO_ATTR_FROM_JUNCTION
@ SUMO_ATTR_CONTAINER_STOP
@ SUMO_ATTR_EDGES
the edges of a route
@ SUMO_ATTR_CHARGING_STATION
@ SUMO_ATTR_OVERHEAD_WIRE_SEGMENT
@ SUMO_ATTR_COLOR
A color information.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
A class that stores a 2D geometrical boundary.
static const GeoConvHelper & getFinal()
the coordinate transformation for writing the location element and for tracking the original coordina...
bool x2cartesian_const(Position &from) const
Converts the given coordinate into a cartesian using the previous initialisation.
MapMatcher(bool matchJunctions, bool matchTAZ, double matchDistance, MsgHandler *errorOutput)
void parseGeoEdges(const PositionVector &positions, bool geo, SUMOVehicleClass vClass, std::vector< const ROEdge * > &into, const std::string &rid, bool isFrom, bool &ok, bool forceEdge=false)
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
const std::string & getID() const
Returns the id.
A RT-tree for efficient storing of SUMO's Named objects.
void Insert(const float a_min[2], const float a_max[2], Named *const &a_data)
Insert entry.
A storage for options typed value containers).
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float).
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector).
static OptionsCont & getOptions()
Retrieves the options.
An output device that encapsulates an ofstream.
An upper class for objects with additional parameters.
A point in 2D or 3D with translation and scaling methods.
A basic edge for routing applications.
const ROEdge * getNormalBefore() const
if this edge is an internal edge, return its first normal predecessor, otherwise the edge itself
bool isInternal() const
return whether this edge is an internal edge
int getNumSuccessors() const
Returns the number of edges this edge is connected to.
const ROEdgeVector & getSuccessors(SUMOVehicleClass vClass=SVC_IGNORING) const
Returns the following edges, restricted by vClass.
int getNumPredecessors() const
Returns the number of edges connected to this edge.
const std::vector< ROLane * > & getLanes() const
Returns this edge's lanes.
double getLength() const
Returns the length of the edge.
A single lane the router may use.
The router's network representation.
Every person has a plan comprising of multiple planItems.
virtual double getDestinationPos() const =0
A person as used by router.
static void addTrip(std::vector< PlanItem * > &plan, const std::string &id, const ROEdge *const from, const ROEdge *const to, const SVCPermissions modeSet, const std::string &vTypes, const double departPos, const std::string &stopOrigin, const double arrivalPos, const std::string &busStop, double walkFactor, const std::string &group)
static void addStop(std::vector< PlanItem * > &plan, const SUMOVehicleParameter::Stop &stopPar, const ROEdge *const stopEdge)
static void addRide(std::vector< PlanItem * > &plan, const ROEdge *const from, const ROEdge *const to, const std::string &lines, double arrivalPos, const std::string &destStop, const std::string &group)
static void addWalk(std::vector< PlanItem * > &plan, const ConstROEdgeVector &edges, const double duration, const double speed, const double departPos, const double arrivalPos, const std::string &busStop)
std::vector< PlanItem * > & getPlan()
Base class for a vehicle's route definition.
const RORoute * getFirstRoute() const
RORouteDef * copy(const std::string &id, const SUMOTime stopOffset) const
Returns a deep copy of the route definition.
void openVehicleTypeDistribution(const SUMOSAXAttributes &attrs) override
opens a type distribution for reading
const SUMOVehicleParameter::Stop * retrieveStoppingPlace(const SUMOSAXAttributes &attrs, const std::string &errorSuffix, std::string &id, const SUMOVehicleParameter::Stop *stopParam=nullptr)
retrieve stopping place element
bool myUseTaz
cached options
void addTransport(const SUMOSAXAttributes &attrs) override
Processing of a transport.
void deleteActivePlanAndVehicleParameter()
void openRoute(const SUMOSAXAttributes &attrs) override
opens a route for reading
std::string myCurrentVTypeDistributionID
The id of the currently parsed vehicle type distribution.
void addFlowPerson(const std::string &typeID, SUMOTime depart, const std::string &baseID, int i)
Processing of a person from a personFlow.
void closeContainerFlow() override
Ends the processing of a containerFlow.
RORouteHandler(RONet &net, const std::string &file, const bool tryRepair, const bool emptyDestinationsAllowed, const bool ignoreErrors, const bool checkSchema)
standard constructor
void parseEdges(const std::string &desc, ConstROEdgeVector &into, const std::string &rid, bool &ok)
Parse edges from strings.
RONet & myNet
The current route.
void addRide(const SUMOSAXAttributes &attrs) override
Processing of a ride.
ConstROEdgeVector myActiveRoute
The current route.
void closeRouteDistribution() override
closes (ends) the building of a distribution
void addTranship(const SUMOSAXAttributes &attrs) override
Processing of a tranship.
void closeContainer() override
Ends the processing of a container.
std::vector< ROPerson::PlanItem * > * myActivePlan
The plan of the current person.
const bool myWriteFlows
whether flows shall not be expanded
const bool myTryRepair
Information whether routes shall be repaired.
bool checkLastDepart() override
Checks whether the route file is sorted by departure time if needed.
OutputDevice_String * myActiveContainerPlan
The plan of the current container.
void closeVehicle() override
Ends the processing of a vehicle.
SUMOTime myActiveRoutePeriod
const SUMOTime myBegin
The begin time.
void closeRoute(const bool mayBeDisconnected=false) override
closes (ends) the building of a route.
Parameterised * addStop(const SUMOSAXAttributes &attrs) override
Processing of a stop.
RandomDistributor< SUMOVTypeParameter * > * myCurrentVTypeDistribution
The currently parsed distribution of vehicle types (probability->vehicle type).
void closePersonFlow() override
Ends the processing of a personFlow.
void openRouteDistribution(const SUMOSAXAttributes &attrs) override
opens a route distribution for reading
int myActiveContainerPlanSize
The number of stages in myActiveContainerPlan.
const bool myKeepVTypeDist
whether to keep the vtype distribution in output
void openTrip(const SUMOSAXAttributes &attrs) override
opens a trip for reading
const bool myUnsortedInput
whether input is read all at once (no sorting check is necessary)
const bool myEmptyDestinationsAllowed
Information whether the "to" attribute is mandatory.
void parseWalkPositions(const SUMOSAXAttributes &attrs, const std::string &personID, const ROEdge *fromEdge, const ROEdge *&toEdge, double &departPos, double &arrivalPos, std::string &busStopID, const ROPerson::PlanItem *const lastStage, bool &ok)
@ brief parse depart- and arrival positions of a walk
MsgHandler *const myErrorOutput
Depending on the "ignore-errors" option different outputs are used.
int myActiveRouteRepeat
number of repetitions of the active route
void closeFlow() override
Ends the processing of a flow.
ROEdge * retrieveEdge(const std::string &id) override
void addPersonTrip(const SUMOSAXAttributes &attrs) override
add a routing request for a walking or intermodal person
void closePerson() override
Ends the processing of a person.
~RORouteHandler() override
standard destructor
RORouteDef * myCurrentAlternatives
The currently parsed route alternatives.
void myStartElement(int element, const SUMOSAXAttributes &attrs) override
Called on the opening of a tag;.
void addWalk(const SUMOSAXAttributes &attrs) override
add a fully specified walk
void initLaneTree(NamedRTree *tree) override
void openRouteFlow(const SUMOSAXAttributes &attrs) override
opens a route flow for reading
void closeTrip() override
Ends the processing of a trip.
void openFlow(const SUMOSAXAttributes &attrs) override
opens a flow for reading
void closeVType() override
Ends the processing of a vehicle type.
void closeVehicleTypeDistribution() override
closes (ends) the building of a distribution
void parseFromViaTo(SumoXMLTag tag, const SUMOSAXAttributes &attrs, bool &ok)
Called for parsing from and to and the corresponding taz attributes.
A complete router's route.
const ConstROEdgeVector & getEdgeVector() const
Returns the list of edges this route consists of.
A vehicle as used by router.
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1).
Represents a generic random distribution.
double getOverallProb() const
Return the sum of the probabilites assigned to the members.
const std::vector< T > & getVals() const
Returns the members of the distribution.
const std::vector< double > & getProbs() const
Returns the probabilities assigned to the members of the distribution.
bool parseStop(SUMOVehicleParameter::Stop &stop, const SUMOSAXAttributes &attrs, std::string errorSuffix, MsgHandler *const errorOutput)
parses attributes common to all stops
std::set< std::string > mySkippedVehicles
IDs of skipped vehicles to suppress errors for the triggered transportables within.
void registerLastDepart()
save last depart (only to be used if vehicle is not discarded)
SUMORouteHandler(const std::string &file, const std::string &expectedRoot, const bool hardFail)
standard constructor
double myCurrentCosts
The currently parsed route costs.
std::string myActiveRouteID
The id of the current route.
std::vector< Parameterised * > myParamStack
The stack of currently parsed parameterised objects.
SUMOVehicleParameter * myVehicleParameter
Parameter of the current vehicle, trip, person, container or flow.
const bool myHardFail
flag to enable or disable hard fails
StopParVector myActiveRouteStops
List of the stops on the parsed route.
SUMOVTypeParameter * myCurrentVType
The currently parsed vehicle type.
static StopPos checkStopPos(double &startPos, double &endPos, const double laneLength, const double minLength, const bool friendlyPos)
check start and end position of a stop
virtual void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
double myActiveRouteProbability
The probability of the current route.
int myInsertStopEdgesAt
where stop edges can be inserted into the current route (-1 means no insertion)
std::string myActiveRouteRefID
The id of the route the current route references to.
const RGBColor * myActiveRouteColor
The currently parsed route's color.
virtual bool checkLastDepart()
Checks whether the route file is sorted by departure time if needed.
Encapsulated SAX-Attributes.
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue=T(), bool report=true) const
Tries to read given attribute assuming it is an int.
SUMOTime getOptSUMOTimeReporting(int attr, const char *objectid, bool &ok, SUMOTime defaultValue, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
Structure representing possible vehicle parameter.
double defaultProbability
The probability when being added to a distribution without an explicit probability.
SUMOVehicleClass vehicleClass
The vehicle's class.
std::string id
The vehicle type's id.
Definition of vehicle stop (position and duration).
std::string edge
The edge to stop at.
std::string lane
The lane to stop at.
std::string parkingarea
(Optional) parking area if one is assigned to the stop
double startPos
The stopping position start.
std::string chargingStation
(Optional) charging station if one is assigned to the stop
std::string overheadWireSegment
(Optional) overhead line segment if one is assigned to the stop
int parametersSet
Information for the output which parameter were set.
double endPos
The stopping position end.
std::string busstop
(Optional) bus stop if one is assigned to the stop
std::string containerstop
(Optional) container stop if one is assigned to the stop
Structure representing possible vehicle parameter.
std::string vtypeid
The vehicle's type id.
std::string id
The vehicle's id.
static double parseWalkPos(SumoXMLAttr attr, const bool hardFail, const std::string &id, double maxPos, const std::string &val, SumoRNG *rng=0)
parse departPos or arrivalPos for a walk
static std::string getEdgeIDFromLane(const std::string laneID)
return edge id when given the lane ID
std::string front()
returns the first substring without moving the iterator
int size() const
returns the number of existing substrings
std::string get(int pos) const
returns the item at the given position
bool hasNext()
returns the information whether further substrings exist
std::string next()
returns the next substring when it exists. Otherwise the behaviour is undefined
static double toDoubleSecure(const std::string &sData, const double def)
converts a string into the integer value described by it