71 std::vector<NBPTStop*> stops = myPTLine->
getStops();
72 for (
auto& stop : stops) {
74 std::string origId = stop->getOrigEdgeId();
76 std::vector<std::string> waysIds = myPTLine->
getMyWays();
77 auto waysIdsIt = waysIds.begin();
78 if (waysIds.size() <= 1) {
80 +
", which consist of one way only. Ignoring!");
83 for (; waysIdsIt != waysIds.end(); waysIdsIt++) {
84 if ((*waysIdsIt) == origId) {
89 if (waysIdsIt == waysIds.end()) {
90 for (
auto& edgeCand : stop->getMyAdditionalEdgeCandidates()) {
92 waysIdsIt = waysIds.begin();
93 for (; waysIdsIt != waysIds.end(); waysIdsIt++) {
94 if ((*waysIdsIt) == edgeCand.first) {
95 if (stop->setEdgeId(edgeCand.second, cont)) {
96 stop->setMyOrigEdgeId(edgeCand.first);
97 origId = edgeCand.first;
110 if (waysIdsIt == waysIds.end()) {
111 WRITE_WARNING(
"Cannot revise pt stop localization for incomplete pt line: " + myPTLine->
getName()
116 std::vector<long long int>* way = myPTLine->
getWaysNodes(origId);
117 if (way ==
nullptr) {
118 WRITE_WARNING(
"Cannot revise pt stop localization for incomplete pt line: " + myPTLine->
getName()
125 std::string adjIdPrev;
126 std::string adjIdNext;
127 if (waysIdsIt != waysIds.begin()) {
128 adjIdPrev = *(waysIdsIt - 1);
130 if (waysIdsIt != (waysIds.end() - 1)) {
131 adjIdNext = *(waysIdsIt + 1);
133 std::vector<long long int>* wayPrev = myPTLine->
getWaysNodes(adjIdPrev);
134 std::vector<long long int>* wayNext = myPTLine->
getWaysNodes(adjIdNext);
135 if (wayPrev ==
nullptr && wayNext ==
nullptr) {
136 WRITE_WARNING(
"Cannot revise pt stop localization for incomplete pt line: " + myPTLine->
getName()
140 long long int wayEnds = *(way->end() - 1);
141 long long int wayBegins = *(way->begin());
142 long long int wayPrevEnds = wayPrev !=
nullptr ? *(wayPrev->end() - 1) : 0;
143 long long int wayPrevBegins = wayPrev !=
nullptr ? *(wayPrev->begin()) : 0;
144 long long int wayNextEnds = wayNext !=
nullptr ? *(wayNext->end() - 1) : 0;
145 long long int wayNextBegins = wayNext !=
nullptr ? *(wayNext->begin()) : 0;
146 if (wayBegins == wayPrevEnds || wayBegins == wayPrevBegins || wayEnds == wayNextBegins
147 || wayEnds == wayNextEnds) {
149 }
else if (wayEnds == wayPrevBegins || wayEnds == wayPrevEnds || wayBegins == wayNextEnds
150 || wayBegins == wayNextBegins) {
153 WRITE_WARNING(
"Cannot revise pt stop localization for incomplete pt line: " + myPTLine->
getName()
158 std::string edgeId = stop->getEdgeId();
160 int assignedTo = edgeId.at(0) ==
'-' ?
BWD :
FWD;
162 if (dir != assignedTo) {
164 if (reverse ==
nullptr) {
165 WRITE_WARNING(
"Could not re-assign PT stop: " + stop->getID() +
" probably broken osm file");
168 stop->setEdgeId(reverse->
getID(), cont);
169 WRITE_WARNING(
"PT stop: " + stop->getID() +
" has been moved to edge: " + reverse->
getID());
177 std::vector<NBEdge*> edges;
181 std::vector<NBEdge*> prevWayEdges;
182 std::vector<NBEdge*> prevWayMinusEdges;
183 prevWayEdges.clear();
184 prevWayMinusEdges.clear();
185 std::vector<NBEdge*> currentWayEdges;
186 std::vector<NBEdge*> currentWayMinusEdges;
187 for (
auto it3 = pTLine->
getMyWays().begin();
188 it3 != pTLine->
getMyWays().end(); it3++) {
190 if (cont.
retrieve(*it3,
false) !=
nullptr) {
191 currentWayEdges.push_back(cont.
retrieve(*it3,
false));
194 while (cont.
retrieve(*it3 +
"#" + std::to_string(i),
false) !=
nullptr) {
195 currentWayEdges.push_back(cont.
retrieve(*it3 +
"#" + std::to_string(i),
false));
200 if (cont.
retrieve(
"-" + *it3,
false) !=
nullptr) {
201 currentWayMinusEdges.push_back(cont.
retrieve(
"-" + *it3,
false));
204 while (cont.
retrieve(
"-" + *it3 +
"#" + std::to_string(i),
false) !=
nullptr) {
205 currentWayMinusEdges.insert(currentWayMinusEdges.begin(),
206 cont.
retrieve(
"-" + *it3 +
"#" + std::to_string(i),
false));
210 if (currentWayEdges.empty()) {
213 if (last == currentWayEdges.front()->getFromNode() && last !=
nullptr) {
214 if (!prevWayEdges.empty()) {
215 edges.insert(edges.end(), prevWayEdges.begin(), prevWayEdges.end());
216 prevWayEdges.clear();
217 prevWayMinusEdges.clear();
219 edges.insert(edges.end(), currentWayEdges.begin(), currentWayEdges.end());
220 last = currentWayEdges.back()->getToNode();
221 }
else if (last == currentWayEdges.back()->getToNode() && last !=
nullptr) {
222 if (!prevWayEdges.empty()) {
223 edges.insert(edges.end(), prevWayEdges.begin(), prevWayEdges.end());
224 prevWayEdges.clear();
225 prevWayMinusEdges.clear();
227 if (currentWayMinusEdges.empty()) {
228 currentWayEdges.clear();
232 edges.insert(edges.end(), currentWayMinusEdges.begin(), currentWayMinusEdges.end());
233 last = currentWayMinusEdges.back()->getToNode();
235 }
else if (first == currentWayEdges.front()->getFromNode() && first !=
nullptr) {
236 edges.insert(edges.end(), prevWayMinusEdges.begin(), prevWayMinusEdges.end());
237 edges.insert(edges.end(), currentWayEdges.begin(), currentWayEdges.end());
238 last = currentWayEdges.back()->getToNode();
239 prevWayEdges.clear();
240 prevWayMinusEdges.clear();
241 }
else if (first == currentWayEdges.back()->getToNode() && first !=
nullptr) {
242 edges.insert(edges.end(), prevWayMinusEdges.begin(), prevWayMinusEdges.end());
243 if (currentWayMinusEdges.empty()) {
244 currentWayEdges.clear();
246 prevWayEdges.clear();
247 prevWayMinusEdges.clear();
250 edges.insert(edges.end(), currentWayMinusEdges.begin(), currentWayMinusEdges.end());
251 last = currentWayMinusEdges.back()->getToNode();
252 prevWayEdges.clear();
253 prevWayMinusEdges.clear();
256 if (it3 != pTLine->
getMyWays().begin()) {
259 prevWayEdges = currentWayEdges;
260 prevWayMinusEdges = currentWayMinusEdges;
261 if (!prevWayEdges.empty()) {
262 first = prevWayEdges.front()->getFromNode();
263 last = prevWayEdges.back()->getToNode();
269 currentWayEdges.clear();
270 currentWayMinusEdges.clear();
273 auto fr = edges.begin();
275 for (; fr != edges.end(); fr++) {
276 if ((*fr)->getID() == frStop->
getEdgeId()) {
282 for (; to != edges.end(); to++) {
283 if ((*to)->getID() == toStop->
getEdgeId()) {
295 if (oc.
isSet(
"ptline-output")) {
297 for (
auto edge : line->getRoute()) {
298 into.insert(edge->getID());
std::vector< long long int > * getWaysNodes(std::string wayId)
NBEdge * getByID(const std::string &edgeID) const
Returns the edge with id if it exists.
void reviseStops(NBPTLine *myPTLine, NBEdgeCont &cont)
const std::string getEdgeId()
The representation of a single edge during network building.
const std::string & getID() const
Returns the id.
The representation of a single pt stop.
#define WRITE_WARNING(msg)
const std::vector< std::string > & getMyWays() const
void process(NBEdgeCont &cont)
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
std::set< std::string > & getServedPTStops()
void insert(NBPTLine *pLine)
insert new line
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
void addEdgeVector(std::vector< NBEdge *>::iterator fr, std::vector< NBEdge *>::iterator to)
Storage for edges, including some functionality operating on multiple edges.
PTLinesCont myPTLines
The map of names to pt lines.
void addEdges2Keep(const OptionsCont &oc, std::set< std::string > &into)
add edges that must be kept
~NBPTLineCont()
destructor
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
A storage for options typed value containers)
Represents a single node (junction) during network building.
const std::string & getName() const
std::vector< NBPTStop * > getStops()
void constructRoute(NBPTLine *myPTLine, NBEdgeCont &cont)
NBPTLineCont()
constructor
long long int getLineID() const
static NBEdge * getReverseEdge(NBEdge *edge)
void setId(long long int id)
std::set< std::string > myServedPTStops