31 #define DEBUGSTOPID ""
47 delete myPTLine.second;
59 if (item.second->getMyWays().size() > 0) {
70 const std::vector<std::string>& waysIds = line->
getMyWays();
71 if (waysIds.size() <= 1) {
72 WRITE_WARNING(
"Cannot revise pt stop localization for pt line: " + line->
getLineID() +
", which consist of one way only. Ignoring!");
76 WRITE_WARNING(
"Cannot revise pt stop localization for pt line: " + line->
getLineID() +
", which has no route edges. Ignoring!");
79 std::vector<NBPTStop*> stops = line->
getStops();
82 stop =
findWay(line, stop, ec, sc);
83 auto waysIdsIt = std::find(waysIds.begin(), waysIds.end(), stop->getOrigEdgeId());
84 if (waysIdsIt == waysIds.end()) {
89 std::vector<long long int>* way = line->
getWaysNodes(stop->getOrigEdgeId());
91 WRITE_WARNING(
"Cannot assign stop '" + stop->getID() +
"' on edge '" + stop->getOrigEdgeId() +
"' to pt line '" + line->
getLineID() +
"' (wayNodes not found). Ignoring!");
97 std::string adjIdPrev;
98 std::string adjIdNext;
99 if (waysIdsIt != waysIds.begin()) {
100 adjIdPrev = *(waysIdsIt - 1);
102 if (waysIdsIt != (waysIds.end() - 1)) {
103 adjIdNext = *(waysIdsIt + 1);
105 std::vector<long long int>* wayPrev = line->
getWaysNodes(adjIdPrev);
106 std::vector<long long int>* wayNext = line->
getWaysNodes(adjIdNext);
107 if (wayPrev ==
nullptr && wayNext ==
nullptr) {
112 long long int wayEnds = *(way->end() - 1);
113 long long int wayBegins = *(way->begin());
114 long long int wayPrevEnds = wayPrev !=
nullptr ? *(wayPrev->end() - 1) : 0;
115 long long int wayPrevBegins = wayPrev !=
nullptr ? *(wayPrev->begin()) : 0;
116 long long int wayNextEnds = wayNext !=
nullptr ? *(wayNext->end() - 1) : 0;
117 long long int wayNextBegins = wayNext !=
nullptr ? *(wayNext->begin()) : 0;
118 if (wayBegins == wayPrevEnds || wayBegins == wayPrevBegins || wayEnds == wayNextBegins
119 || wayEnds == wayNextEnds) {
121 }
else if (wayEnds == wayPrevBegins || wayEnds == wayPrevEnds || wayBegins == wayNextEnds
122 || wayBegins == wayNextBegins) {
130 std::string edgeId = stop->getEdgeId();
132 int assignedTo = edgeId.at(0) ==
'-' ?
BWD :
FWD;
134 if (dir != assignedTo) {
136 if (reverse ==
nullptr) {
137 WRITE_WARNING(
"Could not re-assign PT stop: " + stop->getID() +
" probably broken osm file");
140 stop->setEdgeId(reverse->
getID(), ec);
141 WRITE_WARNING(
"PT stop: " + stop->getID() +
" has been moved to edge: " + reverse->
getID());
144 stop->addLine(line->
getRef());
150 const std::vector<std::string>& waysIds = line->
getMyWays();
151 #ifdef DEBUG_FIND_WAY
158 double minDist = std::numeric_limits<double>::max();
162 if (dist < minDist) {
167 #ifdef DEBUG_FIND_WAY
170 <<
" found=" << (std::find(waysIds.begin(), waysIds.end(),
getWayID(best->
getID())) != waysIds.end())
171 <<
" wayIDs=" <<
toString(waysIds) <<
"\n";
183 if (newStop ==
nullptr) {
193 +
"' (closest edge '" + best->
getID() +
"', distance " +
toString(minDist) +
"). Ignoring!");
197 auto waysIdsIt = waysIds.begin();
198 for (; waysIdsIt != waysIds.end(); waysIdsIt++) {
204 if (waysIdsIt == waysIds.end()) {
208 waysIdsIt = waysIds.begin();
209 for (; waysIdsIt != waysIds.end(); waysIdsIt++) {
210 if ((*waysIdsIt) == edgeCand.first) {
211 if (stop->
setEdgeId(edgeCand.second, ec)) {
222 if (waysIdsIt == waysIds.end()) {
232 std::vector<NBEdge*> edges;
236 std::vector<NBEdge*> prevWayEdges;
237 std::vector<NBEdge*> prevWayMinusEdges;
238 prevWayEdges.clear();
239 prevWayMinusEdges.clear();
240 std::vector<NBEdge*> currentWayEdges;
241 std::vector<NBEdge*> currentWayMinusEdges;
242 for (
auto it3 = pTLine->
getMyWays().begin();
243 it3 != pTLine->
getMyWays().end(); it3++) {
245 if (cont.
retrieve(*it3,
false) !=
nullptr) {
246 currentWayEdges.push_back(cont.
retrieve(*it3,
false));
249 while (cont.
retrieve(*it3 +
"#" + std::to_string(i),
false) !=
nullptr) {
250 currentWayEdges.push_back(cont.
retrieve(*it3 +
"#" + std::to_string(i),
false));
255 if (cont.
retrieve(
"-" + *it3,
false) !=
nullptr) {
256 currentWayMinusEdges.push_back(cont.
retrieve(
"-" + *it3,
false));
259 while (cont.
retrieve(
"-" + *it3 +
"#" + std::to_string(i),
false) !=
nullptr) {
260 currentWayMinusEdges.insert(currentWayMinusEdges.begin(),
261 cont.
retrieve(
"-" + *it3 +
"#" + std::to_string(i),
false));
265 if (currentWayEdges.empty()) {
268 if (last == currentWayEdges.front()->getFromNode() && last !=
nullptr) {
269 if (!prevWayEdges.empty()) {
270 edges.insert(edges.end(), prevWayEdges.begin(), prevWayEdges.end());
271 prevWayEdges.clear();
272 prevWayMinusEdges.clear();
274 edges.insert(edges.end(), currentWayEdges.begin(), currentWayEdges.end());
275 last = currentWayEdges.back()->getToNode();
276 }
else if (last == currentWayEdges.back()->getToNode() && last !=
nullptr) {
277 if (!prevWayEdges.empty()) {
278 edges.insert(edges.end(), prevWayEdges.begin(), prevWayEdges.end());
279 prevWayEdges.clear();
280 prevWayMinusEdges.clear();
282 if (currentWayMinusEdges.empty()) {
283 currentWayEdges.clear();
287 edges.insert(edges.end(), currentWayMinusEdges.begin(), currentWayMinusEdges.end());
288 last = currentWayMinusEdges.back()->getToNode();
290 }
else if (first == currentWayEdges.front()->getFromNode() && first !=
nullptr) {
291 edges.insert(edges.end(), prevWayMinusEdges.begin(), prevWayMinusEdges.end());
292 edges.insert(edges.end(), currentWayEdges.begin(), currentWayEdges.end());
293 last = currentWayEdges.back()->getToNode();
294 prevWayEdges.clear();
295 prevWayMinusEdges.clear();
296 }
else if (first == currentWayEdges.back()->getToNode() && first !=
nullptr) {
297 edges.insert(edges.end(), prevWayMinusEdges.begin(), prevWayMinusEdges.end());
298 if (currentWayMinusEdges.empty()) {
299 currentWayEdges.clear();
301 prevWayEdges.clear();
302 prevWayMinusEdges.clear();
305 edges.insert(edges.end(), currentWayMinusEdges.begin(), currentWayMinusEdges.end());
306 last = currentWayMinusEdges.back()->getToNode();
307 prevWayEdges.clear();
308 prevWayMinusEdges.clear();
311 if (it3 != pTLine->
getMyWays().begin()) {
313 (pTLine->
getName() !=
"" ?
"' (" + pTLine->
getName() +
")" :
""));
315 prevWayEdges = currentWayEdges;
316 prevWayMinusEdges = currentWayMinusEdges;
317 if (!prevWayEdges.empty()) {
318 first = prevWayEdges.front()->getFromNode();
319 last = prevWayEdges.back()->getToNode();
325 currentWayEdges.clear();
326 currentWayMinusEdges.clear();
334 if (oc.
isSet(
"ptline-output")) {
336 for (
auto edge : item.second->getRoute()) {
337 into.insert(edge->getID());
344 std::set<std::string>&
352 std::map<std::string, SUMOVehicleClass> types;
365 std::vector<NBPTStop*> stops = line->
getStops();
366 if (stops.size() < 2) {
369 if (types.count(line->
getType()) == 0) {
370 WRITE_WARNING(
"Could not determine vehicle class for public transport line of type '"
375 std::vector<NBPTStop*> newStops;
377 for (
auto it = stops.begin(); it != stops.end(); ++it) {
381 double best = std::numeric_limits<double>::max();
383 if (from ==
nullptr) {
384 if ((it + 1) != stops.end()) {
388 const double c1 =
getCost(ec, *router, from, to, &veh);
389 const double c2 =
getCost(ec, *router, from2, to, &veh);
395 const double c3 =
getCost(ec, *router, from, to2, &veh);
396 const double c4 =
getCost(ec, *router, from2, to2, &veh);
421 const double c1 =
getCost(ec, *router, from, to, &veh);
422 const double c2 =
getCost(ec, *router, from, to2, &veh);
433 if (best < std::numeric_limits<double>::max()) {
440 newStops.push_back(used);
442 assert(stops.size() == newStops.size());
454 if (fromEdge ==
nullptr || toEdge ==
nullptr) {
455 return std::numeric_limits<double>::max();
457 std::vector<const NBRouterEdge*> route;
458 router.
compute(fromEdge, toEdge, veh, 0, route);
459 if (route.size() == 0) {
460 return std::numeric_limits<double>::max();
469 std::size_t found = edgeID.rfind(
"#");
470 std::string result = edgeID;
471 if (found != std::string::npos) {
472 result = edgeID.substr(0, found);
474 if (result[0] ==
'-') {
475 result = result.substr(1);