70 std::vector<NBPTStop*> stops = myPTLine->
getStops();
71 for (
auto& stop : stops) {
73 std::string origId = stop->getOrigEdgeId();
75 std::vector<std::string> waysIds = myPTLine->
getMyWays();
76 auto waysIdsIt = waysIds.begin();
77 if (waysIds.size() <= 1) {
79 +
", which consist of one way only. Ignoring!");
82 for (; waysIdsIt != waysIds.end(); waysIdsIt++) {
83 if ((*waysIdsIt) == origId) {
88 if (waysIdsIt == waysIds.end()) {
89 for (
auto& edgeCand : stop->getMyAdditionalEdgeCandidates()) {
91 waysIdsIt = waysIds.begin();
92 for (; waysIdsIt != waysIds.end(); waysIdsIt++) {
93 if ((*waysIdsIt) == edgeCand.first) {
94 stop->setEdgeId(edgeCand.second);
95 stop->setMyOrigEdgeId(edgeCand.first);
96 origId = edgeCand.first;
108 if (waysIdsIt == waysIds.end()) {
109 WRITE_WARNING(
"Cannot revise pt stop localization for incomplete pt line: " + myPTLine->
getName()
114 std::vector<long long int>* way = myPTLine->
getWaysNodes(origId);
115 if (way ==
nullptr) {
116 WRITE_WARNING(
"Cannot revise pt stop localization for incomplete pt line: " + myPTLine->
getName()
123 std::string adjIdPrev;
124 std::string adjIdNext;
125 if (waysIdsIt != waysIds.begin()) {
126 adjIdPrev = *(waysIdsIt - 1);
128 if (waysIdsIt != (waysIds.end() - 1)) {
129 adjIdNext = *(waysIdsIt + 1);
131 std::vector<long long int>* wayPrev = myPTLine->
getWaysNodes(adjIdPrev);
132 std::vector<long long int>* wayNext = myPTLine->
getWaysNodes(adjIdNext);
133 if (wayPrev ==
nullptr && wayNext ==
nullptr) {
134 WRITE_WARNING(
"Cannot revise pt stop localization for incomplete pt line: " + myPTLine->
getName()
138 long long int wayEnds = *(way->end() - 1);
139 long long int wayBegins = *(way->begin());
140 long long int wayPrevEnds = wayPrev !=
nullptr ? *(wayPrev->end() - 1) : 0;
141 long long int wayPrevBegins = wayPrev !=
nullptr ? *(wayPrev->begin()) : 0;
142 long long int wayNextEnds = wayNext !=
nullptr ? *(wayNext->end() - 1) : 0;
143 long long int wayNextBegins = wayNext !=
nullptr ? *(wayNext->begin()) : 0;
144 if (wayBegins == wayPrevEnds || wayBegins == wayPrevBegins || wayEnds == wayNextBegins
145 || wayEnds == wayNextEnds) {
147 }
else if (wayEnds == wayPrevBegins || wayEnds == wayPrevEnds || wayBegins == wayNextEnds
148 || wayBegins == wayNextBegins) {
151 WRITE_WARNING(
"Cannot revise pt stop localization for incomplete pt line: " + myPTLine->
getName()
156 std::string edgeId = stop->getEdgeId();
158 int assingedTo = edgeId.at(0) ==
'-' ?
BWD :
FWD;
160 if (dir != assingedTo) {
162 if (reverse ==
nullptr) {
163 WRITE_WARNING(
"Could not re-assign PT stop: " + stop->getID() +
" probably broken osm file");
166 stop->setEdgeId(reverse->
getID());
168 WRITE_WARNING(
"PT stop: " + stop->getID() +
" has been moved to edge: " + reverse->
getID());
176 std::vector<NBEdge*> edges;
180 std::vector<NBEdge*> prevWayEdges;
181 std::vector<NBEdge*> prevWayMinusEdges;
182 prevWayEdges.clear();
183 prevWayMinusEdges.clear();
184 std::vector<NBEdge*> currentWayEdges;
185 std::vector<NBEdge*> currentWayMinusEdges;
186 for (
auto it3 = pTLine->
getMyWays().begin();
187 it3 != pTLine->
getMyWays().end(); it3++) {
189 if (cont.
retrieve(*it3,
false) !=
nullptr) {
190 currentWayEdges.push_back(cont.
retrieve(*it3,
false));
193 while (cont.
retrieve(*it3 +
"#" + std::to_string(i),
false) !=
nullptr) {
194 currentWayEdges.push_back(cont.
retrieve(*it3 +
"#" + std::to_string(i),
false));
199 if (cont.
retrieve(
"-" + *it3,
false) !=
nullptr) {
200 currentWayMinusEdges.push_back(cont.
retrieve(
"-" + *it3,
false));
203 while (cont.
retrieve(
"-" + *it3 +
"#" + std::to_string(i),
false) !=
nullptr) {
204 currentWayMinusEdges.insert(currentWayMinusEdges.begin(),
205 cont.
retrieve(
"-" + *it3 +
"#" + std::to_string(i),
false));
209 if (currentWayEdges.empty()) {
212 if (last == currentWayEdges.front()->getFromNode() && last !=
nullptr) {
213 if (!prevWayEdges.empty()) {
214 edges.insert(edges.end(), prevWayEdges.begin(), prevWayEdges.end());
215 prevWayEdges.clear();
216 prevWayMinusEdges.clear();
218 edges.insert(edges.end(), currentWayEdges.begin(), currentWayEdges.end());
219 last = currentWayEdges.back()->getToNode();
220 }
else if (last == currentWayEdges.back()->getToNode() && last !=
nullptr) {
221 if (!prevWayEdges.empty()) {
222 edges.insert(edges.end(), prevWayEdges.begin(), prevWayEdges.end());
223 prevWayEdges.clear();
224 prevWayMinusEdges.clear();
226 if (currentWayMinusEdges.empty()) {
227 currentWayEdges.clear();
231 edges.insert(edges.end(), currentWayMinusEdges.begin(), currentWayMinusEdges.end());
232 last = currentWayMinusEdges.back()->getToNode();
234 }
else if (first == currentWayEdges.front()->getFromNode() && first !=
nullptr) {
235 edges.insert(edges.end(), prevWayMinusEdges.begin(), prevWayMinusEdges.end());
236 edges.insert(edges.end(), currentWayEdges.begin(), currentWayEdges.end());
237 last = currentWayEdges.back()->getToNode();
238 prevWayEdges.clear();
239 prevWayMinusEdges.clear();
240 }
else if (first == currentWayEdges.back()->getToNode() && first !=
nullptr) {
241 edges.insert(edges.end(), prevWayMinusEdges.begin(), prevWayMinusEdges.end());
242 if (currentWayMinusEdges.empty()) {
243 currentWayEdges.clear();
245 prevWayEdges.clear();
246 prevWayMinusEdges.clear();
249 edges.insert(edges.end(), currentWayMinusEdges.begin(), currentWayMinusEdges.end());
250 last = currentWayMinusEdges.back()->getToNode();
251 prevWayEdges.clear();
252 prevWayMinusEdges.clear();
255 if (it3 != pTLine->
getMyWays().begin()) {
256 std::cout <<
"Warning: incomplete route for " << pTLine->
getName() << std::endl;
258 prevWayEdges = currentWayEdges;
259 prevWayMinusEdges = currentWayMinusEdges;
260 if (!prevWayEdges.empty()) {
261 first = prevWayEdges.front()->getFromNode();
262 last = prevWayEdges.back()->getToNode();
268 currentWayEdges.clear();
269 currentWayMinusEdges.clear();
272 auto fr = edges.begin();
274 for (; fr != edges.end(); fr++) {
275 if ((*fr)->getID() == frStop->
getEdgeId()) {
281 for (; to != edges.end(); to++) {
282 if ((*to)->getID() == toStop->
getEdgeId()) {
std::vector< long long int > * getWaysNodes(std::string wayId)
void reviseStops(NBPTLine *myPTLine, NBEdgeCont &cont)
const std::string getEdgeId()
The representation of a single edge during network building.
The representation of a single pt stop.
static bool findLaneAndComputeBusStopExtend(NBPTStop *pStop, NBEdgeCont &cont)
#define WRITE_WARNING(msg)
NBEdge * getByID(const std::string &edgeID) const
Returns the edge with id if it exists.
void process(NBEdgeCont &cont)
const std::string & getID() const
Returns the id.
void insert(NBPTLine *pLine)
insert new line
Storage for edges, including some functionality operating on multiple edges.
PTLinesCont myPTLines
The map of names to pt lines.
~NBPTLineCont()
destructor
NBEdge * retrieve(const std::string &id, bool retrieveExtracted=false) const
Returns the edge that has the given id.
const std::vector< std::string > & getMyWays() const
Represents a single node (junction) during network building.
std::vector< NBPTStop * > getStops()
void constructRoute(NBPTLine *myPTLine, NBEdgeCont &cont)
NBPTLineCont()
constructor
static NBEdge * getReverseEdge(NBEdge *edge)
void setId(long long int id)
void addEdgeVector(std::vector< NBEdge * >::iterator fr, std::vector< NBEdge * >::iterator to)