110 importer.
load(oc, nb);
122 delete myEdge.second;
126 delete myPlatformShape.second;
132 if (!oc.
isSet(
"osm-files")) {
135 const std::vector<std::string> files = oc.
getStringVector(
"osm-files");
136 std::vector<SUMOSAXReader*> readers;
156 for (
const std::string& file : files) {
165 if (!readers.back()->parseFirst(file) || !readers.back()->parseSection(
SUMO_TAG_NODE) ||
178 for (
const std::string& file : files) {
180 readers[idx]->setHandler(edgesHandler);
185 readers[idx] =
nullptr;
192 if (!oc.
getBool(
"osm.skip-duplicates-check")) {
196 std::set<const Edge*, CompareEdges> dupsFinder;
198 if (dupsFinder.count(it->second) > 0) {
203 dupsFinder.insert(it->second);
208 if (numRemoved > 0) {
217 std::map<long long int, int> nodeUsage;
219 for (
const auto& edgeIt :
myEdges) {
220 assert(edgeIt.second->myCurrentIsRoad);
221 for (
const long long int node : edgeIt.second->myCurrentNodes) {
227 if (nodesIt.second->tlsControlled || nodesIt.second->railwaySignal || (nodesIt.second->pedestrianCrossing &&
myImportCrossings) ) {
230 nodeUsage[nodesIt.first]++;
239 for (
const auto& edgeIt :
myEdges) {
240 Edge*
const e = edgeIt.second;
254 NBNode* currentFrom = first;
256 std::vector<long long int> passed;
258 passed.push_back(*j);
261 running =
insertEdge(e, running, currentFrom, currentTo, passed, nb, first, last);
262 currentFrom = currentTo;
264 passed.push_back(*j);
270 insertEdge(e, running, currentFrom, last, passed, nb, first, last);
283 for (
auto item : nodeUsage) {
289 size_t incomingEdgesNo = incomingEdges.size();
290 size_t outgoingEdgesNo = outgoingEdges.size();
292 for (
size_t i = 0; i < incomingEdgesNo; i++) {
300 auto const iEdge = incomingEdges[i];
304 std::string
const& iEdgeId = iEdge->getID();
305 std::size_t
const m = iEdgeId.find_first_of(
"#");
306 std::string
const& iWayId = iEdgeId.substr(0, m);
307 for (
size_t j = 0; j < outgoingEdgesNo; j++) {
308 auto const oEdge = outgoingEdges[j];
311 if (oEdge->getID().find(iWayId) != std::string::npos
313 && oEdge->getID().rfind(iWayId, 0) != 0) {
316 edgeVector.push_back(oEdge);
319 if (!
n->checkCrossingDuplicated(edgeVector)) {
320 n->addCrossing(edgeVector, crossingWidth,
false);
326 for (
size_t i = 0; i < outgoingEdgesNo; i++) {
328 auto const oEdge = outgoingEdges[i];
332 std::string
const& oEdgeId = oEdge->getID();
333 std::size_t
const m = oEdgeId.find_first_of(
"#");
334 std::string
const& iWayId = oEdgeId.substr(0, m);
335 for (
size_t j = 0; j < incomingEdgesNo; j++) {
336 auto const iEdge = incomingEdges[j];
337 if (iEdge->getID().find(iWayId) != std::string::npos
339 && iEdge->getID().rfind(iWayId, 0) != 0) {
342 edgeVector.push_back(iEdge);
345 if (!
n->checkCrossingDuplicated(edgeVector)) {
346 n->addCrossing(edgeVector, crossingWidth,
false);
356 const double layerElevation = oc.
getFloat(
"osm.layer-elevation");
357 if (layerElevation > 0) {
369 for (
const std::string& file : files) {
370 if (readers[idx] !=
nullptr) {
372 readers[idx]->setHandler(relationHandler);
382 std::set<std::string> stopNames;
384 stopNames.insert(item.second->getName());
388 if (
n->ptStopPosition && stopNames.count(
n->name) == 0) {
391 WRITE_ERRORF(
"Unable to project coordinates for node '%'.",
n->id);
393 std::shared_ptr<NBPTStop> ptStop = std::make_shared<NBPTStop>(
toString(
n->id), ptPos,
"",
"",
n->ptStopLength,
n->name,
n->permissions);
406 if (node ==
nullptr) {
410 WRITE_ERRORF(
"Unable to project coordinates for junction '%'.",
id);
420 if (
n->railwayCrossing) {
421 if (
n->getParameter(
"crossing:barrier") !=
"no") {
423 }
else if (
n->getParameter(
"crossing.light") ==
"yes") {
426 }
else if (
n->railwaySignal) {
428 }
else if (
n->tlsControlled) {
435 if (!tlsc.
insert(tlDef)) {
441 if (
n->railwayBufferStop) {
445 if (
n->railwaySignal) {
460 const std::vector<long long int>& passed,
NBNetBuilder& nb,
470 if (from ==
nullptr || to ==
nullptr) {
471 WRITE_ERRORF(
"Discarding edge '%' because the nodes could not be built.",
id);
480 assert(passed.size() >= 2);
481 if (passed.size() == 2) {
482 WRITE_WARNINGF(
TL(
"Discarding edge '%' which connects two identical nodes without geometry."),
id);
486 int intermediateIndex = (int) passed.size() / 2;
488 std::vector<long long int> part1(passed.begin(), passed.begin() + intermediateIndex + 1);
489 std::vector<long long int> part2(passed.begin() + intermediateIndex, passed.end());
490 index =
insertEdge(e, index, from, intermediate, part1, nb, first, last);
491 return insertEdge(e, index, intermediate, to, part2, nb, first, last);
493 const int newIndex = index + 1;
506 std::vector<SumoXMLAttr> defaults;
511 SVCPermissions permissions = (defaultPermissions & ~extraDis) | extra;
512 if (defaultPermissions ==
SVC_SHIP) {
514 permissions = defaultPermissions;
517 defaultsToOneWay =
false;
525 double distanceStart =
myOSMNodes[passed.front()]->positionMeters;
526 double distanceEnd =
myOSMNodes[passed.back()]->positionMeters;
527 const bool useDistance = distanceStart != std::numeric_limits<double>::max() && distanceEnd != std::numeric_limits<double>::max();
530 if (distanceStart < distanceEnd) {
543 std::vector<std::shared_ptr<NBPTStop> > ptStops;
544 for (
long long i : passed) {
547 if (
n->ptStopPosition && (
n->permissions == 0 || (permissions &
n->permissions) != 0)) {
548 std::shared_ptr<NBPTStop> existingPtStop = sc.
get(
toString(
n->id));
549 if (existingPtStop !=
nullptr) {
550 existingPtStop->registerAdditionalEdge(
toString(e->
id),
id);
554 WRITE_ERRORF(
"Unable to project coordinates for node '%'.",
n->id);
556 ptStops.push_back(std::make_shared<NBPTStop>(
toString(
n->id), ptPos,
id,
toString(e->
id),
n->ptStopLength,
n->name,
n->permissions));
557 sc.
insert(ptStops.back());
560 if (
n->railwaySignal) {
561 nodeDirection |=
n->myRailDirection;
564 shape.push_back(pos);
566#ifdef DEBUG_LAYER_ELEVATION
567 if (e->
id ==
"DEBUGID") {
572 <<
" nodeDirection=" << nodeDirection
584 WRITE_ERRORF(
"Unable to project coordinates for edge '%'.",
id);
590 if (streetName == e->
ref) {
607 const std::string& onewayBike = e->
myExtraTags[
"oneway:bicycle"];
608 if (onewayBike ==
"false" || onewayBike ==
"no" || onewayBike ==
"0") {
619 bool addForward =
true;
620 bool addBackward =
true;
621 const bool explicitTwoWay = e->
myIsOneWay ==
"no";
637 if (addBackward && (onewayBike ==
"true" || onewayBike ==
"yes" || onewayBike ==
"1")) {
640 if (addForward && (onewayBike ==
"reverse" || onewayBike ==
"-1")) {
643 if (!addBackward && (onewayBike ==
"false" || onewayBike ==
"no" || onewayBike ==
"0")) {
650 if (addForward && !addBackward) {
652 }
else if (!addForward && addBackward) {
660 numLanesForward = (int) std::ceil(e->
myNoLanes / 2.0);
662 numLanesBackward = e->
myNoLanes - numLanesForward;
665 numLanesForward =
MAX2(1, numLanesForward);
666 numLanesBackward =
MAX2(1, numLanesBackward);
677 numLanesForward =
MAX2(numLanesForward, 2);
683 numLanesBackward =
MAX2(numLanesForward, 2);
698 numLanesBackward = 1;
701 const int taggedLanes = (addForward ? numLanesForward : 0) + (addBackward ? numLanesBackward : 0);
705 forwardWidth = e->
myWidth / taggedLanes;
706 backwardWidth = forwardWidth;
715 double speedBackward = speed;
719 if (speed <= 0 || speedBackward <= 0) {
726 if (!addForward && (cyclewayType &
WAY_FORWARD) != 0) {
729 forwardWidth = bikeLaneWidth;
734 if (!addBackward && (cyclewayType &
WAY_BACKWARD) != 0) {
737 backwardWidth = bikeLaneWidth;
738 numLanesBackward = 1;
752 if (!addForward && (sidewalkType &
WAY_FORWARD) != 0) {
759 }
else if (addSidewalk && addForward && (sidewalkType &
WAY_BOTH) == 0
760 && numLanesForward == 1 && numLanesBackward <= 1
767 if (!addBackward && (sidewalkType &
WAY_BACKWARD) != 0) {
771 numLanesBackward = 1;
774 }
else if (addSidewalk && addBackward && (sidewalkType &
WAY_BOTH) == 0
775 && numLanesBackward == 1 && numLanesForward <= 1
787 const int offsetFactor = lefthand ? -1 : 1;
797 if (defaults.size() > 0) {
802 const std::string reverseID =
"-" + id;
805 assert(numLanesForward > 0);
809 if (markOSMDirection) {
846 if ((
int)nbe->
getLanes().size() != numForwardLanesFromWidthKey) {
847 WRITE_WARNINGF(
TL(
"Forward lanes count for edge '%' ('%') is not matching the number of lanes defined in width:lanes:forward key ('%'). Using default width values."),
848 id, nbe->
getLanes().size(), numForwardLanesFromWidthKey);
850 for (
int i = 0; i < numForwardLanesFromWidthKey; i++) {
852 const int laneIndex = lefthand ? i : numForwardLanesFromWidthKey - i - 1;
864 assert(numLanesBackward > 0);
868 if (markOSMDirection) {
899 if ((
int)nbe->
getLanes().size() != numBackwardLanesFromWidthKey) {
900 WRITE_WARNINGF(
TL(
"Backward lanes count for edge '%' ('%') is not matching the number of lanes defined in width:lanes:backward key ('%'). Using default width values."),
901 id, nbe->
getLanes().size(), numBackwardLanesFromWidthKey);
903 for (
int i = 0; i < numBackwardLanesFromWidthKey; i++) {
905 const int laneIndex = lefthand ? i : numBackwardLanesFromWidthKey - i - 1;
952 std::map<NBNode*, std::vector<std::pair<double, double> > > layerForces;
955 std::set<NBNode*> knownElevation;
957 Edge* e = myEdge.second;
961 if (node !=
nullptr) {
962 knownElevation.insert(node);
963 layerForces[node].emplace_back(e->
myLayer * layerElevation, POSITION_EPS);
968#ifdef DEBUG_LAYER_ELEVATION
969 std::cout <<
"known elevations:\n";
970 for (std::set<NBNode*>::iterator it = knownElevation.begin(); it != knownElevation.end(); ++it) {
971 const std::vector<std::pair<double, double> >& primaryLayers = layerForces[*it];
972 std::cout <<
" node=" << (*it)->getID() <<
" ele=";
973 for (std::vector<std::pair<double, double> >::const_iterator it_ele = primaryLayers.begin(); it_ele != primaryLayers.end(); ++it_ele) {
974 std::cout << it_ele->first <<
" ";
982 std::map<NBNode*, double> knownEleMax;
983 for (
auto it : knownElevation) {
984 double eleMax = -std::numeric_limits<double>::max();
985 const std::vector<std::pair<double, double> >& primaryLayers = layerForces[it];
986 for (
const auto& primaryLayer : primaryLayers) {
987 eleMax =
MAX2(eleMax, primaryLayer.first);
989 knownEleMax[it] = eleMax;
995 for (
auto it = knownElevation.begin(); it != knownElevation.end(); ++it) {
998 / gradeThreshold * 3,
1000 for (
auto& neighbor : neighbors) {
1001 if (knownElevation.count(neighbor.first) != 0) {
1002 const double grade = fabs(knownEleMax[*it] - knownEleMax[neighbor.first])
1003 /
MAX2(POSITION_EPS, neighbor.second.first);
1004#ifdef DEBUG_LAYER_ELEVATION
1005 std::cout <<
" grade at node=" << (*it)->getID() <<
" ele=" << knownEleMax[*it] <<
" neigh=" << it_neigh->first->getID() <<
" neighEle=" << knownEleMax[it_neigh->first] <<
" grade=" << grade <<
" dist=" << it_neigh->second.first <<
" speed=" << it_neigh->second.second <<
"\n";
1007 if (grade > gradeThreshold * 50 / 3.6 / neighbor.second.second) {
1009 const double eleMax =
MAX2(knownEleMax[*it], knownEleMax[neighbor.first]);
1010 if (knownEleMax[*it] < eleMax) {
1011 knownEleMax[*it] = eleMax;
1013 knownEleMax[neighbor.first] = eleMax;
1023 std::set<NBNode*> unknownElevation;
1024 for (
auto it = knownElevation.begin(); it != knownElevation.end(); ++it) {
1025 const double eleMax = knownEleMax[*it];
1026 const double maxDist = fabs(eleMax) * 100 / layerElevation;
1027 std::map<NBNode*, std::pair<double, double> > neighbors =
getNeighboringNodes(*it, maxDist, knownElevation);
1028 for (
auto& neighbor : neighbors) {
1029 if (knownElevation.count(neighbor.first) == 0) {
1030 unknownElevation.insert(neighbor.first);
1031 layerForces[neighbor.first].emplace_back(eleMax, neighbor.second.first);
1037 for (
auto it = unknownElevation.begin(); it != unknownElevation.end(); ++it) {
1038 double eleMax = -std::numeric_limits<double>::max();
1039 const std::vector<std::pair<double, double> >& primaryLayers = layerForces[*it];
1040 for (
const auto& primaryLayer : primaryLayers) {
1041 eleMax =
MAX2(eleMax, primaryLayer.first);
1043 const double maxDist = fabs(eleMax) * 100 / layerElevation;
1044 std::map<NBNode*, std::pair<double, double> > neighbors =
getNeighboringNodes(*it, maxDist, knownElevation);
1045 for (
auto& neighbor : neighbors) {
1046 if (knownElevation.count(neighbor.first) == 0 && unknownElevation.count(neighbor.first) == 0) {
1047 layerForces[*it].emplace_back(0, neighbor.second.first);
1052#ifdef DEBUG_LAYER_ELEVATION
1053 std::cout <<
"summation of forces\n";
1055 std::map<NBNode*, double> nodeElevation;
1056 for (
auto& layerForce : layerForces) {
1057 const std::vector<std::pair<double, double> >& forces = layerForce.second;
1058 if (knownElevation.count(layerForce.first) != 0) {
1066#ifdef DEBUG_LAYER_ELEVATION
1067 std::cout <<
" node=" << it->first->getID() <<
" knownElevation=" << knownEleMax[it->first] <<
"\n";
1069 nodeElevation[layerForce.first] = knownEleMax[layerForce.first];
1070 }
else if (forces.size() == 1) {
1071 nodeElevation[layerForce.first] = forces.front().first;
1075 for (
const auto& force : forces) {
1076 distSum += force.second;
1078 double weightSum = 0;
1079 double elevation = 0;
1080#ifdef DEBUG_LAYER_ELEVATION
1081 std::cout <<
" node=" << it->first->getID() <<
" distSum=" << distSum <<
"\n";
1083 for (
const auto& force : forces) {
1084 const double weight = (distSum - force.second) / distSum;
1085 weightSum += weight;
1086 elevation += force.first * weight;
1088#ifdef DEBUG_LAYER_ELEVATION
1089 std::cout <<
" force=" << it_force->first <<
" dist=" << it_force->second <<
" weight=" << weight <<
" ele=" << elevation <<
"\n";
1092 nodeElevation[layerForce.first] = elevation / weightSum;
1095#ifdef DEBUG_LAYER_ELEVATION
1096 std::cout <<
"final elevations:\n";
1097 for (std::map<NBNode*, double>::iterator it = nodeElevation.begin(); it != nodeElevation.end(); ++it) {
1098 std::cout <<
" node=" << (it->first)->getID() <<
" ele=" << it->second <<
"\n";
1102 for (
auto& it : nodeElevation) {
1104 n->reinit(
n->getPosition() +
Position(0, 0, it.second),
n->getType());
1108 for (
const auto& it : ec) {
1109 NBEdge* edge = it.second;
1111 const double length = geom.
length2D();
1112 const double zFrom = nodeElevation[edge->
getFromNode()];
1113 const double zTo = nodeElevation[edge->
getToNode()];
1118 for (
auto it_pos = geom.begin(); it_pos != geom.end(); ++it_pos) {
1119 if (it_pos != geom.begin()) {
1120 dist += (*it_pos).distanceTo2D(*(it_pos - 1));
1122 newGeom.push_back((*it_pos) +
Position(0, 0, zFrom + (zTo - zFrom) * dist / length));
1128std::map<NBNode*, std::pair<double, double> >
1130 std::map<NBNode*, std::pair<double, double> > result;
1131 std::set<NBNode*> visited;
1132 std::vector<NBNode*> open;
1133 open.push_back(node);
1134 result[node] = std::make_pair(0, 0);
1135 while (!open.empty()) {
1138 if (visited.count(
n) != 0) {
1143 for (
auto e : edges) {
1145 if (
n->hasIncoming(e)) {
1146 s = e->getFromNode();
1150 const double dist = result[
n].first + e->getGeometry().length2D();
1151 const double speed =
MAX2(e->getSpeed(), result[
n].second);
1152 if (result.count(s) == 0) {
1153 result[s] = std::make_pair(dist, speed);
1155 result[s] = std::make_pair(
MIN2(dist, result[s].first),
MAX2(speed, result[s].second));
1157 if (dist < maxDist && knownElevation.count(s) == 0) {
1169 if (tc.
knows(type)) {
1180 std::vector<std::string> types;
1182 std::string t = tok.
next();
1184 if (std::find(types.begin(), types.end(), t) == types.end()) {
1187 }
else if (tok.
size() > 1) {
1189 WRITE_WARNINGF(
TL(
"Discarding unknown compound '%' in type '%' (first occurrence for edge '%')."), t, type,
id);
1193 if (types.empty()) {
1195 WRITE_WARNINGF(
TL(
"Discarding unusable type '%' (first occurrence for edge '%')."), type,
id);
1201 if (tc.
knows(newType)) {
1209 double maxSpeed = 0;
1214 bool defaultIsOneWay =
true;
1217 bool discard =
true;
1218 bool hadDiscard =
false;
1219 for (
auto& type2 : types) {
1236 if (hadDiscard && permissions == 0) {
1240 WRITE_WARNINGF(
TL(
"Discarding compound type '%' (first occurrence for edge '%')."), newType,
id);
1255 WRITE_MESSAGEF(
TL(
"Adding new type '%' (first occurrence for edge '%')."), type,
id);
1256 tc.
insertEdgeType(newType, numLanes, maxSpeed, prio, permissions, spreadType, width,
1257 defaultIsOneWay, sidewalkWidth, bikelaneWidth, 0, 0, 0);
1258 for (
auto& type3 : types) {
1273 std::vector<NIOSMNode*> nodes;
1274 std::vector<double> usablePositions;
1275 std::vector<int> usableIndex;
1279 if (node->
positionMeters != std::numeric_limits<double>::max()) {
1281 usableIndex.push_back((
int)nodes.size());
1283 nodes.push_back(node);
1285 if (usablePositions.size() == 0) {
1288 bool forward =
true;
1289 if (usablePositions.size() == 1) {
1290 WRITE_WARNINGF(
TL(
"Ambiguous railway kilometrage direction for way '%' (assuming forward)"),
id);
1292 forward = usablePositions.front() < usablePositions.back();
1295 for (
int i = 1; i < (int)usablePositions.size(); i++) {
1296 if ((usablePositions[i - 1] < usablePositions[i]) != forward) {
1297 WRITE_WARNINGF(
TL(
"Inconsistent railway kilometrage direction for way '%': % (skipping)"),
id,
toString(usablePositions));
1301 if (nodes.size() > usablePositions.size()) {
1305 shape.push_back(
Position(node->lon, node->lat, 0));
1310 double sign = forward ? 1 : -1;
1312 for (
int i = usableIndex.front() - 1; i >= 0; i--) {
1313 nodes[i]->positionMeters = nodes[i + 1]->positionMeters - sign * shape[i].distanceTo2D(shape[i + 1]);
1316 for (
int i = usableIndex.front() + 1; i < (
int)nodes.size(); i++) {
1317 if (nodes[i]->positionMeters == std::numeric_limits<double>::max()) {
1318 nodes[i]->positionMeters = nodes[i - 1]->positionMeters + sign * shape[i].distanceTo2D(shape[i - 1]);
1345 return std::numeric_limits<double>::max();
1351 if (type ==
"train") {
1353 }
else if (type ==
"subway") {
1355 }
else if (type ==
"aerialway") {
1357 }
else if (type ==
"light_rail" || type ==
"monorail") {
1359 }
else if (type ==
"share_taxi") {
1361 }
else if (type ==
"minibus") {
1363 }
else if (type ==
"trolleybus") {
1368 std::string stop =
"";
1371 }
else if (result ==
SVC_BUS) {
1386 bool multiLane = changeProhibition > 3;
1388 for (
int lane = 0; changeProhibition > 0 && lane < e->
getNumLanes(); lane++) {
1389 int code = changeProhibition % 4;
1394 changeProhibition = changeProhibition >> 2;
1408 for (
int lane = 0; lane < numLanes; lane++) {
1410 const int i = lefthand ? lane : numLanes - 1 - lane;
1415 if (i < (
int)designated.size() && designated[i]) {
1427 if (signs.empty()) {
1428 signs.insert(signs.begin(), signs2.begin(), signs2.end());
1430 for (
int i = 0; i < (int)
MIN2(signs.size(), signs2.size()); i++) {
1431 signs[i] |= signs2[i];
1443 for (
int i = 0; i < (int)turnSigns.size(); i++) {
1460 std::set<NIOSMNode*, CompareNodes>& uniqueNodes,
const OptionsCont& oc) :
1472 if (kv ==
"DEFAULT") {
1473 myRailSignalRules.push_back(
"railway:signal:main=");
1474 myRailSignalRules.push_back(
"railway:signal:combined=");
1475 }
else if (kv ==
"ALL") {
1498 if (action ==
"delete" || !ok) {
1505 const auto insertionIt =
myToFill.lower_bound(
id);
1506 if (insertionIt ==
myToFill.end() || insertionIt->first !=
id) {
1525 WRITE_ERROR(
TL(
"Attribute 'id' in the definition of a node is not of type long long int."));
1531 WRITE_ERROR(
TL(
"Tag element on wrong XML hierarchy level."));
1537 if (key ==
"highway" || key ==
"ele" || key ==
"crossing" || key ==
"railway" || key ==
"public_transport"
1538 || key ==
"name" || key ==
"train" || key ==
"bus" || key ==
"tram" || key ==
"light_rail" || key ==
"subway" || key ==
"station" || key ==
"noexit"
1539 || key ==
"crossing:barrier"
1540 || key ==
"crossing:light"
1541 || key ==
"railway:ref"
1546 if (key ==
"highway" &&
value.find(
"traffic_signal") != std::string::npos) {
1548 }
else if (key ==
"crossing" &&
value.find(
"traffic_signals") != std::string::npos) {
1550 }
else if (key ==
"highway" &&
value.find(
"crossing") != std::string::npos) {
1552 }
else if ((key ==
"noexit" &&
value ==
"yes")
1553 || (key ==
"railway" &&
value ==
"buffer_stop")) {
1555 }
else if (key ==
"railway" &&
value.find(
"crossing") != std::string::npos) {
1557 }
else if (key ==
"crossing:barrier") {
1559 }
else if (key ==
"crossing:light") {
1561 }
else if (key ==
"railway:signal:direction") {
1562 if (
value ==
"both") {
1564 }
else if (
value ==
"backward") {
1566 }
else if (
value ==
"forward") {
1570 std::string kv = key +
"=" +
value;
1571 std::string kglob = key +
"=";
1579 }
else if ((key ==
"public_transport" &&
value ==
"stop_position") ||
1580 (key ==
"highway" &&
value ==
"bus_stop")) {
1586 }
else if (key ==
"name") {
1591 if (std::isnan(elevation)) {
1599 }
else if (key ==
"station") {
1602 }
else if (key ==
"railway:ref") {
1635 const std::map<long long int, NIOSMNode*>& osmNodes,
1636 std::map<long long int, Edge*>& toFill, std::map<long long int, Edge*>& platformShapes,
1739 const long long int id = attrs.
get<
long long int>(
SUMO_ATTR_ID,
nullptr, ok);
1741 if (action ==
"delete" || !ok) {
1758 ref = node->second->id;
1771 const std::string buswaySpec = key.substr(7);
1773 if (buswaySpec ==
"right") {
1775 }
else if (buswaySpec ==
"left") {
1777 }
else if (buswaySpec ==
"both") {
1790 && key !=
"maxspeed" && key !=
"maxspeed:type"
1791 && key !=
"zone:maxspeed"
1792 && key !=
"maxspeed:forward" && key !=
"maxspeed:backward"
1793 && key !=
"junction" && key !=
"name" && key !=
"tracks" && key !=
"layer"
1798 && key !=
"highspeed"
1802 && key !=
"postal_code"
1803 && key !=
"railway:preferred_direction"
1804 && key !=
"railway:bidirectional"
1805 && key !=
"railway:track_ref"
1808 && key !=
"emergency"
1810 && key !=
"electrified"
1811 && key !=
"segregated"
1816 && key !=
"oneway:bicycle"
1817 && key !=
"oneway:bus"
1818 && key !=
"oneway:psv"
1819 && key !=
"bus:lanes"
1820 && key !=
"bus:lanes:forward"
1821 && key !=
"bus:lanes:backward"
1822 && key !=
"psv:lanes"
1823 && key !=
"psv:lanes:forward"
1824 && key !=
"psv:lanes:backward"
1825 && key !=
"bicycle:lanes"
1826 && key !=
"bicycle:lanes:forward"
1827 && key !=
"bicycle:lanes:backward"
1830 && key !=
"public_transport") {
1837 || key ==
"aeroway" || key ==
"aerialway" || key ==
"usage" || key ==
"service") {
1843 if (key ==
"cycleway") {
1846 }
else if (
value ==
"both") {
1848 }
else if (
value ==
"right") {
1850 }
else if (
value ==
"left") {
1852 }
else if (
value ==
"opposite_track") {
1854 }
else if (
value ==
"opposite_lane") {
1856 }
else if (
value ==
"opposite") {
1861 if (key ==
"cycleway:left") {
1870 if (key ==
"cycleway:right") {
1879 if (key ==
"cycleway:both") {
1890 if (key ==
"cycleway" &&
value !=
"lane" &&
value !=
"track" &&
value !=
"opposite_track" &&
value !=
"opposite_lane") {
1899 if (key ==
"sidewalk") {
1902 }
else if (
value ==
"both") {
1904 }
else if (
value ==
"right") {
1906 }
else if (
value ==
"left") {
1910 if (key ==
"sidewalk:left") {
1914 if (
value ==
"yes") {
1918 if (key ==
"sidewalk:right") {
1922 if (
value ==
"yes") {
1926 if (key ==
"sidewalk:both") {
1931 if (
value ==
"yes") {
1941 if (key ==
"busway") {
1942 if (
value ==
"no") {
1945 if (
value ==
"opposite_track") {
1947 }
else if (
value ==
"opposite_lane") {
1953 std::string singleTypeID = key +
"." +
value;
1954 if (key ==
"highspeed") {
1955 if (
value ==
"no") {
1958 singleTypeID =
"railway.highspeed";
1962 }
else if (key ==
"bus" || key ==
"psv") {
1975 }
else if (key ==
"emergency") {
1983 }
else if (key ==
"access") {
1984 if (
value ==
"no") {
1990 std::vector<double> widthLanes;
1991 for (std::string width : values) {
1993 widthLanes.push_back(parsedWidth);
1996 if (key ==
"width:lanes" || key ==
"width:lanes:forward") {
1998 }
else if (key ==
"width:lanes:backward") {
2006 }
else if (key ==
"width") {
2012 }
else if (key ==
"foot") {
2013 if (
value ==
"use_sidepath" ||
value ==
"no") {
2015 }
else if (
value ==
"yes" ||
value ==
"designated" ||
value ==
"permissive") {
2018 }
else if (key ==
"bicycle") {
2019 if (
value ==
"use_sidepath" ||
value ==
"no") {
2021 }
else if (
value ==
"yes" ||
value ==
"designated" ||
value ==
"permissive") {
2024 }
else if (key ==
"oneway:bicycle") {
2026 }
else if (key ==
"oneway:bus" || key ==
"oneway:psv") {
2027 if (
value ==
"no") {
2031 }
else if (key ==
"lanes") {
2037 std::vector<std::string> list = st.
getVector();
2038 if (list.size() >= 2) {
2039 int minLanes = std::numeric_limits<int>::max();
2041 for (
auto& i : list) {
2043 minLanes =
MIN2(minLanes, numLanes);
2054 }
else if (key ==
"lanes:forward") {
2065 }
else if (key ==
"lanes:backward") {
2078 (key ==
"maxspeed" || key ==
"maxspeed:type" || key ==
"maxspeed:forward" || key ==
"zone:maxspeed")) {
2083 }
else if (key ==
"junction") {
2087 if (
value ==
"roundabout") {
2090 }
else if (key ==
"oneway") {
2092 }
else if (key ==
"name") {
2094 }
else if (key ==
"ref") {
2097 }
else if (key ==
"layer") {
2103 }
else if (key ==
"tracks") {
2113 }
else if (key ==
"railway:preferred_direction") {
2114 if (
value ==
"both") {
2117 if (
value ==
"backward") {
2119 }
else if (
value ==
"forward") {
2123 }
else if (key ==
"railway:bidirectional") {
2124 if (
value ==
"regular") {
2127 }
else if (key ==
"electrified" || key ==
"segregated") {
2128 if (
value !=
"no") {
2131 }
else if (key ==
"railway:track_ref") {
2133 }
else if (key ==
"public_transport" &&
value ==
"platform") {
2141 }
else if (key ==
"change" || key ==
"change:lanes") {
2143 }
else if (key ==
"change:forward" || key ==
"change:lanes:forward") {
2145 }
else if (key ==
"change:backward" || key ==
"change:lanes:backward") {
2147 }
else if (key ==
"vehicle:lanes" || key ==
"vehicle:lanes:forward") {
2150 }
else if (key ==
"vehicle:lanes:backward") {
2153 }
else if (key ==
"bus:lanes" || key ==
"bus:lanes:forward") {
2155 }
else if (key ==
"bus:lanes:backward") {
2157 }
else if (key ==
"psv:lanes" || key ==
"psv:lanes:forward") {
2160 }
else if (key ==
"psv:lanes:backward") {
2163 }
else if (key ==
"bicycle:lanes" || key ==
"bicycle:lanes:forward") {
2165 }
else if (key ==
"bicycle:lanes:backward") {
2179 std::vector<int> turnCodes;
2180 for (std::string codeList : values) {
2183 if (codes.size() == 0) {
2186 for (std::string code : codes) {
2187 if (code ==
"" || code ==
"none" || code ==
"through") {
2189 }
else if (code ==
"left" || code ==
"sharp_left") {
2191 }
else if (code ==
"right" || code ==
"sharp_right") {
2193 }
else if (code ==
"slight_left") {
2195 }
else if (code ==
"slight_right") {
2197 }
else if (code ==
"reverse") {
2199 }
else if (code ==
"merge_to_left" || code ==
"merge_to_right") {
2203 turnCodes.push_back(turnCode);
2221 if (!
myCurrentEdge->myHighWayType.empty() && singleTypeID !=
"railway.highspeed") {
2229 types.push_back(singleTypeID);
2244 if (
value.substr(3, 4) ==
"zone") {
2253 WRITE_WARNING(
"Value of key '" + key +
"' is not numeric ('" +
value +
"') in edge '" +
2265 for (
const std::string& val : values) {
2268 }
else if (val ==
"not_left") {
2270 }
else if (val ==
"not_right") {
2273 result = result << 2;
2276 result = result >> 2;
2278 if (values.size() > 1) {
2291 std::vector<SVCPermissions>& disallowed = forward ?
myCurrentEdge->myDisallowedLaneForward :
myCurrentEdge->myDisallowedLaneBackward;
2292 designated.resize(
MAX2(designated.size(), values.size()),
false);
2296 for (
const std::string& val : values) {
2297 if (val ==
"yes" || val ==
"permissive") {
2299 }
else if (val ==
"lane" || val ==
"designated") {
2301 designated[i] =
true;
2302 }
else if (val ==
"no") {
2303 disallowed[i] |= svc;
2323 }
else if (
myCurrentEdge->myExtraTags.count(
"platform") != 0) {
2343 const std::map<long long int, NIOSMNode*>& osmNodes,
2344 const std::map<long long int, Edge*>& osmEdges,
NBPTStopCont* nbptStopCont,
2345 const std::map<long long int, Edge*>& platformShapes,
2390 if (action ==
"delete" || !ok) {
2405 const long long int ref = attrs.
get<
long long int>(
SUMO_ATTR_REF,
nullptr, ok);
2406 if (role ==
"via") {
2411 }
else if (memberType ==
"node") {
2428 if (memberType ==
"way") {
2429 const std::map<long long int, NIImporter_OpenStreetMap::Edge*>::const_iterator& wayIt =
myPlatformShapes.find(ref);
2432 platform.
isWay =
true;
2436 }
else if (memberType ==
"node") {
2441 platform.
isWay =
false;
2446 }
else if (role ==
"station") {
2448 }
else if (role.empty()) {
2450 if (memberType ==
"way") {
2452 }
else if (memberType ==
"node") {
2454 if (it !=
myOSMNodes.end() && it->second->hasParameter(
"railway:ref")) {
2468 if (key ==
"type" || key ==
"restriction") {
2470 if (key ==
"type" &&
value ==
"restriction") {
2474 if (key ==
"type" &&
value ==
"route") {
2478 if (key ==
"restriction") {
2481 if (
value.substr(0, 5) ==
"only_") {
2483 }
else if (
value.substr(0, 3) ==
"no_") {
2490 }
else if (key ==
"except") {
2495 }
else if (v ==
"bicycle") {
2497 }
else if (v ==
"hgv") {
2499 }
else if (v ==
"motorcar") {
2501 }
else if (v ==
"emergency") {
2505 }
else if (key ==
"public_transport") {
2507 if (
value ==
"stop_area") {
2510 }
else if (key ==
"route") {
2517 }
else if (key ==
"name") {
2519 }
else if (key ==
"colour") {
2526 }
else if (key ==
"ref") {
2528 }
else if (key ==
"interval" || key ==
"headway") {
2530 }
else if (key ==
"by_night") {
2573 for (
long long ref :
myStops) {
2584 if (ptStop ==
nullptr) {
2591 if (myPlatform.isWay) {
2610 WRITE_ERRORF(
"Unable to project coordinates for node '%'.", pNode->
id);
2613 p.push_back(pNodePos);
2615 if (p.size() == 0) {
2616 WRITE_WARNINGF(
TL(
"Referenced platform: '%' in relation: '%' is corrupt. Probably OSM file is incomplete."),
2621 ptStop->addPlatformCand(platform);
2632 WRITE_ERRORF(
"Unable to project coordinates for node '%'.", pNode->
id);
2635 ptStop->addPlatformCand(platform);
2644 if (station !=
nullptr) {
2646 ptStop->setParameter(
"stationRef", station->
getParameter(
"railway:ref"));
2655 bool hadGap =
false;
2656 int missingBefore = 0;
2657 int missingAfter = 0;
2658 for (
long long ref :
myStops) {
2673 missingAfter = (int)
myStops.size() - missingBefore - (int)ptLine->
getStops().size();
2679 if (ptStop ==
nullptr) {
2683 WRITE_ERRORF(
"Unable to project coordinates for node '%'.",
n->id);
2685 ptStop = std::make_shared<NBPTStop>(
toString(
n->id), ptPos,
"",
"",
n->ptStopLength,
n->name,
n->permissions);
2688 ptStop->setIsMultipleStopPositions(
false,
myStopAreas[
n->id]);
2691 ptStop->setIsPlatform();
2696 for (
long long& myWay :
myWays) {
2699 Edge* edge = entr->second;
2727 if (viaNode ==
nullptr) {
2733 if (from ==
nullptr) {
2737 if (to ==
nullptr) {
2768 WRITE_WARNINGF(
TL(
"direction of restriction relation could not be determined%"),
"");
2776 const std::vector<NBEdge*>& candidates)
const {
2777 const std::string prefix =
toString(wayRef);
2778 const std::string backPrefix =
"-" + prefix;
2779 NBEdge* result =
nullptr;
2781 for (
auto candidate : candidates) {
2782 if ((candidate->getID().substr(0, prefix.size()) == prefix) ||
2783 (candidate->getID().substr(0, backPrefix.size()) == backPrefix)) {
2789 WRITE_WARNINGF(
TL(
"Ambiguous way reference '%' in restriction relation"), prefix);
#define WRITE_WARNINGF(...)
#define WRITE_MESSAGEF(...)
#define WRITE_ERRORF(...)
#define WRITE_WARNING(msg)
#define PROGRESS_BEGIN_TIME_MESSAGE(msg)
#define PROGRESS_TIME_MESSAGE(before)
#define PROGRESS_DONE_MESSAGE()
#define PROGRESS_BEGIN_MESSAGE(msg)
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
const std::string invalid_return< std::string >::value
SVCPermissions extraDisallowed(SVCPermissions disallowed, const MMVersion &networkVersion)
Interprets disallowed vehicles depending on network version.
const SVCPermissions SVCAll
all VClasses are allowed
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permissions is a (exclusive) railway edge.
StringBijection< SUMOVehicleClass > SumoVehicleClassStrings(sumoVehicleClassStringInitializer, SVC_CUSTOM2, false)
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_SHIP
is an arbitrary ship
@ SVC_PRIVATE
private vehicles
@ SVC_TRUCK
vehicle is a large transport vehicle
@ SVC_IGNORING
vehicles ignoring classes
@ SVC_RAIL
vehicle is a not electrified rail
@ SVC_RAIL_CLASSES
classes which drive on tracks
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_RAIL_FAST
vehicle that is allowed to drive on high-speed rail tracks
@ SVC_TRAILER
vehicle is a large transport vehicle
@ SVC_RAIL_ELECTRIC
rail vehicle that requires electrified tracks
@ SVC_RAIL_URBAN
vehicle is a city rail
@ SVC_EMERGENCY
public emergency vehicles
@ SVC_AUTHORITY
authorities vehicles
@ SVC_TRAM
vehicle is a light rail
@ SVC_PUBLIC_CLASSES
public transport
@ SVC_TAXI
vehicle is a taxi
@ SVC_BUS
vehicle is a bus
@ SVC_PEDESTRIAN
pedestrian
@ SUMO_TAG_NODE
alternative definition for junction
LaneSpreadFunction
Numbers representing special SUMO-XML-attribute values Information how the edge's lateral offset shal...
@ PARTLEFT
The link is a partial left direction.
@ RIGHT
The link is a (hard) right direction.
@ TURN
The link is a 180 degree turn.
@ LEFT
The link is a (hard) left direction.
@ STRAIGHT
The link is a straight direction.
@ PARTRIGHT
The link is a partial right direction.
@ NODIR
The link has no direction (is a dead end link).
const double SUMO_const_laneWidth
std::string joinToStringSorting(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
static bool isReadable(std::string path)
Checks whether the given file is readable.
void setFileName(const std::string &name)
Sets the current file name.
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
Storage for edges, including some functionality operating on multiple edges.
int extractRoundabouts()
Determines which edges have been marked as roundabouts and stores them internally.
bool insert(NBEdge *edge, bool ignorePrunning=false)
Adds an edge to the dictionary.
The representation of a single edge during network building.
static const int TURN_SIGN_SHIFT_BUS
shift values for decoding turn signs
static const int TURN_SIGN_SHIFT_BICYCLE
void setPermittedChanging(int lane, SVCPermissions changeLeft, SVCPermissions changeRight)
set allowed classes for changing to the left and right from the given lane
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
void setPermissions(SVCPermissions permissions, int lane=-1)
set allowed/disallowed classes for the given lane or for all lanes if -1 is given
void addBikeLane(double width)
add a bicycle lane of the given width and shift existing connctions
NBNode * getToNode() const
Returns the destination node of the edge.
static const double UNSPECIFIED_FRICTION
unspecified lane friction
Lane & getLaneStruct(int lane)
const PositionVector & getGeometry() const
Returns the geometry of the edge.
bool addEdge2EdgeConnection(NBEdge *dest, bool overrideRemoval=false, SVCPermissions permission=SVC_UNSPECIFIED)
Adds a connection to another edge.
void setTurnSignTarget(const std::string &target)
void setDistance(double distance)
set kilometrage at start of edge (negative value implies couting down along the edge)
const std::vector< NBEdge::Lane > & getLanes() const
Returns the lane definitions.
const std::string & getID() const
void setLaneWidth(int lane, double width)
set lane specific width (negative lane implies set for all lanes)
void addSidewalk(double width)
add a pedestrian sidewalk of the given width and shift existing connctions
int getNumLanes() const
Returns the number of lanes.
void removeFromConnections(NBEdge *toEdge, int fromLane=-1, int toLane=-1, bool tryLater=false, const bool adaptToLaneRemoval=false, const bool keepPossibleTurns=false)
Removes the specified connection(s).
bool isConnectedTo(const NBEdge *e, const bool ignoreTurnaround=false) const
Returns the information whethe a connection to the given edge has been added (or computed).
static const int TURN_SIGN_SHIFT_TAXI
void preferVehicleClass(int lane, SVCPermissions vclasses)
prefer certain vehicle classes for the given lane or for all lanes if -1 is given (ensures also permi...
NBNode * getFromNode() const
Returns the origin node of the edge.
static const double UNSPECIFIED_WIDTH
unspecified lane width
static const double UNSPECIFIED_OFFSET
unspecified lane offset
void setJunctionPriority(const NBNode *const node, int prio)
Sets the junction priority of the edge.
void setGeometry(const PositionVector &g, bool inner=false)
(Re)sets the edge's geometry
Instance responsible for building networks.
static bool transformCoordinates(PositionVector &from, bool includeInBoundary=true, GeoConvHelper *from_srs=nullptr)
NBPTLineCont & getPTLineCont()
Returns a reference to the pt line container.
NBParkingCont & getParkingCont()
NBPTStopCont & getPTStopCont()
Returns a reference to the pt stop container.
NBNodeCont & getNodeCont()
Returns a reference to the node container.
NBEdgeCont & getEdgeCont()
NBTypeCont & getTypeCont()
Returns a reference to the type container.
NBTrafficLightLogicCont & getTLLogicCont()
Returns a reference to the traffic light logics container.
static bool transformCoordinate(Position &from, bool includeInBoundary=true, GeoConvHelper *from_srs=nullptr)
transforms loaded coordinates handles projections, offsets (using GeoConvHelper) and import of height...
Container for nodes during the netbuilding process.
bool insert(const std::string &id, const Position &position, NBDistrict *district=0)
Inserts a node into the map.
NBNode * retrieve(const std::string &id) const
Returns the node with the given name.
Represents a single node (junction) during network building.
void reinit(const Position &position, SumoXMLNodeType type, bool updateEdgeGeometries=false)
Resets initial values.
SumoXMLNodeType getType() const
Returns the type of this node.
const EdgeVector & getIncomingEdges() const
Returns this node's incoming edges (The edges which yield in this node).
const EdgeVector & getOutgoingEdges() const
Returns this node's outgoing edges (The edges which start at this node).
static const int FORWARD
edge directions (for pedestrian related stuff)
void setFringeType(FringeType fringeType)
set fringe type
A traffic light logics which must be computed (only nodes/edges are given).
void setNumOfStops(int numStops, int missingBefore, int missingAfter)
void addWayNode(long long int way, long long int node)
const std::vector< std::shared_ptr< NBPTStop > > & getStops()
void addPTStop(std::shared_ptr< NBPTStop > pStop)
Container for public transport stops during the net building process.
int cleanupDeleted(NBEdgeCont &cont)
remove stops on non existing (removed) edges
const std::map< std::string, std::shared_ptr< NBPTStop > > & getStops() const
Returns an unmodifiable reference to the stored pt stops.
std::shared_ptr< NBPTStop > get(std::string id) const
Retrieve a previously inserted pt stop.
bool insert(std::shared_ptr< NBPTStop > ptStop, bool floating=false)
Inserts a node into the map.
The representation of an imported parking area.
static const std::string OSM_DIRECTION
processing parameter for rail signal edges and nodes
static const std::string OSM_SIGNAL_DIRECTION
A container for traffic light definitions and built programs.
bool insert(NBTrafficLightDefinition *logic, bool forceInsert=false)
Adds a logic definition to the dictionary.
A storage for available edgeTypes of edges.
bool getEdgeTypeShallBeDiscarded(const std::string &edgeType) const
Returns the information whether edges of this edgeType shall be discarded.
void insertEdgeType(const std::string &id, int numLanes, double maxSpeed, int prio, SVCPermissions permissions, LaneSpreadFunction spreadType, double width, bool oneWayIsDefault, double sidewalkWidth, double bikeLaneWidth, double widthResolution, double maxWidth, double minWidth)
Adds a edgeType into the list.
bool copyEdgeTypeRestrictionsAndAttrs(const std::string &fromId, const std::string &toId)
Copy restrictions to a edgeType.
double getEdgeTypeSpeed(const std::string &edgeType) const
Returns the maximal velocity for the given edgeType [m/s].
int getEdgeTypePriority(const std::string &edgeType) const
Returns the priority for the given edgeType.
int getEdgeTypeNumLanes(const std::string &edgeType) const
Returns the number of lanes for the given edgeType.
double getEdgeTypeWidth(const std::string &edgeType) const
Returns the lane width for the given edgeType [m].
SVCPermissions getEdgeTypePermissions(const std::string &edgeType) const
Returns allowed vehicle classes for the given edgeType.
bool knows(const std::string &edgeType) const
Returns whether the named edgeType is in the container.
double getEdgeTypeSidewalkWidth(const std::string &edgeType) const
Returns the lane width for a sidewalk to be added [m].
LaneSpreadFunction getEdgeTypeSpreadType(const std::string &edgeType) const
Returns spreadType for the given edgeType.
double getEdgeTypeBikeLaneWidth(const std::string &edgeType) const
Returns the lane width for a bike lane to be added [m].
bool getEdgeTypeIsOneWay(const std::string &edgeType) const
Returns whether edges are one-way per default for the given edgeType.
Functor which compares two Edges.
bool operator()(const Edge *e1, const Edge *e2) const
An internal definition of a loaded edge.
std::vector< SVCPermissions > myDisallowedLaneBackward
(optional) information about additional disallowed SVCs on backward lane(s)
std::map< std::string, std::string > myExtraTags
Additionally tagged information.
std::vector< double > myWidthLanesForward
Information on lane width.
WayType mySidewalkType
Information about the kind of sidwalk along this road.
std::vector< double > myWidthLanesBackward
std::vector< SVCPermissions > myDisallowedLaneForward
(optional) information about additional disallowed SVCs on forward lane(s)
bool myCurrentIsRoad
Information whether this is a road.
WayType myCyclewayType
Information about the kind of cycleway along this road.
std::vector< int > myTurnSignsBackward
int myNoLanesForward
number of lanes in forward direction or 0 if unknown, negative if backwards lanes are meant
double myMaxSpeed
maximum speed in km/h, or MAXSPEED_UNGIVEN
std::string ref
The edge's track name.
std::vector< SVCPermissions > myAllowedLaneForward
(optional) information about additional allowed SVCs on forward lane(s)
std::string myHighWayType
The type, stored in "highway" key.
const long long int id
The edge's id.
bool myAmInRoundabout
Information whether this road is part of a roundabout.
int myLayer
Information about the relative z-ordering of ways.
std::vector< bool > myDesignatedLaneBackward
(optional) information about whether the backward lanes are designated to some SVCs
SVCPermissions myExtraDisallowed
Extra permissions prohibited from tags instead of highway type.
std::vector< SVCPermissions > myAllowedLaneBackward
(optional) information about additional allowed SVCs on backward lane(s)
int myNoLanes
number of lanes, or -1 if unknown
std::vector< int > myTurnSignsForward
turning direction (arrows printed on the road)
std::vector< long long int > myCurrentNodes
The list of nodes this edge is made of.
int myParkingType
Information about road-side parking.
double myMaxSpeedBackward
maximum speed in km/h, or MAXSPEED_UNGIVEN
WayType myBuswayType
Information about the kind of busway along this road.
int myChangeForward
Information about change prohibitions (forward direction.
SVCPermissions myExtraAllowed
Extra permissions added from tags instead of highway type.
int myChangeBackward
Information about change prohibitions (backward direction.
std::string streetName
The edge's street name.
WayType myRailDirection
Information about the direction(s) of railway usage.
std::vector< bool > myDesignatedLaneForward
(optional) information about whether the forward lanes are designated to some SVCs
std::string myIsOneWay
Information whether this is an one-way road.
A class which extracts OSM-edges from a parsed OSM-file.
void addType(const std::string &singleTypeID)
Edge * myCurrentEdge
The currently built edge.
const std::map< long long int, NIOSMNode * > & myOSMNodes
The previously parsed nodes.
void interpretLaneUse(const std::string &value, SUMOVehicleClass svc, const bool forward) const
int interpretChangeType(const std::string &value) const
EdgesHandler(const std::map< long long int, NIOSMNode * > &osmNodes, std::map< long long int, Edge * > &toFill, std::map< long long int, Edge * > &platformShapes, const NBTypeCont &tc)
Constructor.
~EdgesHandler() override
Destructor.
void myEndElement(int element) override
Called when a closing tag occurs.
double interpretSpeed(const std::string &key, std::string value)
std::map< long long int, Edge * > & myEdgeMap
A map of built edges.
const NBTypeCont & myTypeCont
std::map< long long int, Edge * > & myPlatformShapesMap
A map of built edges.
std::map< std::string, double > mySpeedMap
A map of non-numeric speed descriptions to their numeric values.
void myStartElement(int element, const SUMOSAXAttributes &attrs) override
Called on the opening of a tag;.
A class which extracts OSM-nodes from a parsed OSM-file.
int myHierarchyLevel
The current hierarchy level.
~NodesHandler() override
Destructor.
const bool myImportElevation
whether elevation data should be imported
int getDuplicateNodes() const
std::string myLastNodeID
id of the currently parsed node
std::set< NIOSMNode *, CompareNodes > & myUniqueNodes
the set of unique nodes (used for duplicate detection/substitution)
void myStartElement(int element, const SUMOSAXAttributes &attrs) override
Called on the opening of a tag;.
std::map< long long int, NIOSMNode * > & myToFill
The nodes container to fill.
NodesHandler(std::map< long long int, NIOSMNode * > &toFill, std::set< NIOSMNode *, CompareNodes > &uniqueNodes, const OptionsCont &cont)
Constructor.
const OptionsCont & myOptionsCont
the options
void myEndElement(int element) override
Called when a closing tag occurs.
NIOSMNode * myCurrentNode
the currently parsed node
int myDuplicateNodes
number of duplicate nodes
StringVector myRailSignalRules
custom requirements for rail signal tagging
A class which extracts relevant relation information from a parsed OSM-file.
void myEndElement(int element) override
Called when a closing tag occurs.
const std::map< long long int, Edge * > & myPlatformShapes
The previously parsed platform shapes.
long long int myViaNode
the via node/way for the current restriction
bool myIsRestriction
whether the currently parsed relation is a restriction
std::vector< long long int > myWays
ways in pt line references
SVCPermissions myRestrictionException
exceptions to the restriction currenlty being parsed
long long int myCurrentRelation
The currently parsed relation.
RestrictionType myRestrictionType
std::set< long long int > myPlatformStops
myStops which are actually platforms (in case there is no stop_position)
void resetValues()
reset members to their defaults for parsing a new relation
void myStartElement(int element, const SUMOSAXAttributes &attrs) override
Called on the opening of a tag;.
const std::map< long long int, NIOSMNode * > & myOSMNodes
The previously parsed nodes.
const OptionsCont & myOptionsCont
the options cont
@ UNKNOWN
The relation tag was missing.
@ ONLY
The only valid connection is declared.
@ NO
The only invalid connection is declared.
std::string myNightService
night service information of the pt line
std::string myPTRouteType
indicates whether current relation is a pt route
~RelationHandler() override
Destructor.
std::vector< long long int > myStops
bus stop references
NBPTLineCont * myNBPTLineCont
PT Line container to be filled.
std::vector< NIIPTPlatform > myPlatforms
bus stop platforms
bool myIsStopArea
indicates whether current relation is a pt stop area
bool myIsRoute
indicates whether current relation is a route
RGBColor myRouteColor
official route color
std::string myName
name of the relation
std::string myRef
ref of the pt line
long long int myStation
the station node for the current stop_area
RelationHandler(const std::map< long long int, NIOSMNode * > &osmNodes, const std::map< long long int, Edge * > &osmEdges, NBPTStopCont *nbptStopCont, const std::map< long long int, Edge * > &platfromShapes, NBPTLineCont *nbptLineCont, const OptionsCont &oc)
Constructor.
int myInterval
service interval of the pt line in minutes
std::map< long long int, long long int > myStopAreas
the map from stop area member to stop_area id
NBPTStopCont * myNBPTStopCont
The previously filled pt stop container.
bool checkEdgeRef(long long int ref) const
check whether a referenced way has a corresponding edge
long long int myFromWay
the origination way for the current restriction
long long int myToWay
the destination way for the current restriction
bool applyRestriction() const
try to apply the parsed restriction and return whether successful
NBEdge * findEdgeRef(long long int wayRef, const std::vector< NBEdge * > &candidates) const
try to find the way segment among candidates
const std::map< long long int, Edge * > & myOSMEdges
The previously parsed edges.
int insertEdge(Edge *e, int index, NBNode *from, NBNode *to, const std::vector< long long int > &passed, NBNetBuilder &nb, const NBNode *first, const NBNode *last)
Builds an NBEdge.
std::map< long long int, Edge * > myEdges
the map from OSM way ids to edge objects
bool myImportCrossings
import crossings
std::map< long long int, NIOSMNode * > myOSMNodes
the map from OSM node ids to actual nodes
NIImporter_OpenStreetMap()
static void loadNetwork(const OptionsCont &oc, NBNetBuilder &nb)
Loads content of the optionally given OSM file.
static const long long int INVALID_ID
void applyLaneUse(NBEdge *e, NIImporter_OpenStreetMap::Edge *nie, const bool forward)
Applies lane use information from nie to e.
static const double MAXSPEED_UNGIVEN
bool myOnewayDualSidewalk
import sidewalks
~NIImporter_OpenStreetMap()
std::map< long long int, Edge * > myPlatformShapes
the map from OSM way ids to platform shapes
void load(const OptionsCont &oc, NBNetBuilder &nb)
void applyTurnSigns(NBEdge *e, const std::vector< int > &turnSigns)
bool myImportSidewalks
import sidewalks
std::set< NIOSMNode *, CompareNodes > myUniqueNodes
the set of unique nodes used in NodesHandler, used when freeing memory
static bool myAllAttributes
whether additional way and node attributes shall be imported
void reconstructLayerElevation(double layerElevation, NBNetBuilder &nb)
reconstruct elevation from layer info
static SUMOVehicleClass interpretTransportType(const std::string &type, NIOSMNode *toSet=nullptr)
translate osm transport designations into sumo vehicle class
bool myImportLaneAccess
import lane specific access restrictions
bool myImportTurnSigns
import turning signals (turn:lanes) to guide connection building
std::map< std::string, std::string > myKnownCompoundTypes
The compound types that have already been mapped to other known types.
static const std::string compoundTypeSeparator
The separator within newly created compound type names.
std::set< std::string > myUnusableTypes
The compounds types that do not contain known types.
std::map< NBNode *, std::pair< double, double > > getNeighboringNodes(NBNode *node, double maxDist, const std::set< NBNode * > &knownElevation)
collect neighboring nodes with their road distance and maximum between-speed. Search does not continu...
static std::set< std::string > myExtraAttributes
extra attributes to import
bool myImportBikeAccess
import bike path specific permissions and directions
bool myAnnotateDefaults
whether edges should carry information on the use of typemap defaults
static double interpretDistance(NIOSMNode *node)
read distance value from node and return value in m
NBNode * insertNodeChecking(long long int id, NBNodeCont &nc, NBTrafficLightLogicCont &tlsc)
Builds an NBNode.
static void mergeTurnSigns(std::vector< int > &signs, std::vector< int > signs2)
void extendRailwayDistances(Edge *e, NBTypeCont &tc)
extend kilometrage data for all nodes along railway
std::string usableType(const std::string &type, const std::string &id, NBTypeCont &tc)
check whether the type is known or consists of known type compounds. return empty string otherwise
static void applyChangeProhibition(NBEdge *e, int changeProhibition)
const std::string & getID() const
Returns the id.
A storage for options typed value containers).
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float).
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool).
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.
void unsetParameter(const std::string &key)
Removes a parameter.
bool hasParameter(const std::string &key) const
Returns whether the parameter is set.
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
const Parameterised::Map & getParametersMap() const
Returns the inner key/value map.
virtual void setParameter(const std::string &key, const std::string &value)
Sets a parameter.
void updateParameters(const Parameterised::Map &mapArg)
Adds or updates all given parameters from the map.
A point in 2D or 3D with translation and scaling methods.
double length2D() const
Returns the length.
double length() const
Returns the length.
PositionVector reverse() const
reverse position vector
static RGBColor parseColor(std::string coldef)
Parses a color information.
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.
virtual std::string getStringSecure(int id, const std::string &def) const =0
Returns the string-value of the named (by its enum-value) attribute.
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.
SUMOSAXHandler(const std::string &file="", const std::string &expectedRoot="")
Constructor.
static StringBijection< TrafficLightType > TrafficLightTypes
traffic light types
int size() const
returns the number of existing substrings
std::vector< std::string > getVector()
return vector of strings
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 long long int toLong(const std::string &sData)
converts a string into the long value described by it by calling the char-type converter,...
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter
static std::string escapeXML(const std::string &orig, const bool maskDoubleHyphen=false)
Replaces the standard escapes by their XML entities.
static std::string prune(const std::string &str)
Removes trailing and leading whitechars.
static double parseDist(const std::string &sData)
parse a distance, length or width value with a unit
static bool startsWith(const std::string &str, const std::string prefix)
Checks whether a given string starts with the prefix.
static double parseSpeed(const std::string &sData, const bool defaultKmph=true)
parse a speed value with a unit
static bool endsWith(const std::string &str, const std::string suffix)
Checks whether a given string ends with the suffix.
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter,...
static bool toBool(const std::string &sData)
converts a string into the bool value described by it by calling the char-type converter
static SUMOSAXReader * getSAXReader(SUMOSAXHandler &handler, const bool isNet=false, const bool isRoute=false)
Builds a reader and assigns the handler to it.
*brief user defined string literal for JSON values *sa std::size_t n
An (internal) definition of a single lane of an edge.
int turnSigns
turning signs printed on the road, bitset of LinkDirection (imported from OSM)
An internal representation of an OSM-node.
SVCPermissions permissions
type of pt stop
NBNode * node
the NBNode that was instantiated
double positionMeters
position converted to m (using highest precision available)
std::string position
kilometrage/mileage
const long long int id
The node's id.
bool pedestrianCrossing
Whether this is a pedestrian crossing.
double ptStopLength
The length of the pt stop.
double ele
The elevation of this node.
const double lon
The longitude the node is located at.
const double lat
The latitude the node is located at.