117 importer.
load(oc, nb);
129 delete myEdge.second;
133 delete myPlatformShape.second;
139 if (!oc.
isSet(
"osm-files")) {
142 const std::vector<std::string> files = oc.
getStringVector(
"osm-files");
143 std::vector<SUMOSAXReader*> readers;
165 for (
const std::string& file : files) {
174 if (!readers.back()->parseFirst(file) || !readers.back()->parseSection(
SUMO_TAG_NODE) ||
187 for (
const std::string& file : files) {
189 readers[idx]->setHandler(edgesHandler);
194 readers[idx] =
nullptr;
201 if (!oc.
getBool(
"osm.skip-duplicates-check")) {
205 std::set<const Edge*, CompareEdges> dupsFinder;
207 if (dupsFinder.count(it->second) > 0) {
212 dupsFinder.insert(it->second);
217 if (numRemoved > 0) {
226 std::map<long long int, int> nodeUsage;
228 for (
const auto& edgeIt :
myEdges) {
229 assert(edgeIt.second->myCurrentIsRoad);
230 for (
const long long int node : edgeIt.second->myCurrentNodes) {
236 if (nodesIt.second->tlsControlled || nodesIt.second->railwaySignal || (nodesIt.second->pedestrianCrossing &&
myImportCrossings) ) {
239 nodeUsage[nodesIt.first]++;
248 for (
const auto& edgeIt :
myEdges) {
249 Edge*
const e = edgeIt.second;
263 NBNode* currentFrom = first;
265 std::vector<long long int> passed;
267 passed.push_back(*j);
270 running =
insertEdge(e, running, currentFrom, currentTo, passed, nb, first, last);
271 currentFrom = currentTo;
273 passed.push_back(*j);
279 insertEdge(e, running, currentFrom, last, passed, nb, first, last);
282 WRITE_MESSAGEF(
TL(
"Skipped applying OSM placement on % edge(s): % due to non-explicit one-way and % due to opposite-direction auxiliary edges."),
298 for (
auto item : nodeUsage) {
304 size_t incomingEdgesNo = incomingEdges.size();
305 size_t outgoingEdgesNo = outgoingEdges.size();
307 for (
size_t i = 0; i < incomingEdgesNo; i++) {
315 auto const iEdge = incomingEdges[i];
319 std::string
const& iEdgeId = iEdge->getID();
320 std::size_t
const m = iEdgeId.find_first_of(
"#");
321 std::string
const& iWayId = iEdgeId.substr(0, m);
322 for (
size_t j = 0; j < outgoingEdgesNo; j++) {
323 auto const oEdge = outgoingEdges[j];
326 if (oEdge->getID().find(iWayId) != std::string::npos
328 && oEdge->getID().rfind(iWayId, 0) != 0) {
331 edgeVector.push_back(oEdge);
341 for (
size_t i = 0; i < outgoingEdgesNo; i++) {
343 auto const oEdge = outgoingEdges[i];
347 std::string
const& oEdgeId = oEdge->getID();
348 std::size_t
const m = oEdgeId.find_first_of(
"#");
349 std::string
const& iWayId = oEdgeId.substr(0, m);
350 for (
size_t j = 0; j < incomingEdgesNo; j++) {
351 auto const iEdge = incomingEdges[j];
352 if (iEdge->getID().find(iWayId) != std::string::npos
354 && iEdge->getID().rfind(iWayId, 0) != 0) {
357 edgeVector.push_back(iEdge);
371 const double layerElevation = oc.
getFloat(
"osm.layer-elevation");
372 if (layerElevation > 0) {
384 for (
const std::string& file : files) {
385 if (readers[idx] !=
nullptr) {
387 readers[idx]->setHandler(relationHandler);
397 std::set<std::string> stopNames;
399 stopNames.insert(item.second->getName());
406 WRITE_ERRORF(
"Unable to project coordinates for node '%'.", n->
id);
422 if (node ==
nullptr) {
426 WRITE_ERRORF(
"Unable to project coordinates for junction '%'.",
id);
439 }
else if (n->
getParameter(
"crossing.light") ==
"yes") {
451 if (!tlsc.
insert(tlDef)) {
476 const std::vector<long long int>& passed,
NBNetBuilder& nb,
486 if (from ==
nullptr || to ==
nullptr) {
487 WRITE_ERRORF(
"Discarding edge '%' because the nodes could not be built.",
id);
496 assert(passed.size() >= 2);
497 if (passed.size() == 2) {
498 WRITE_WARNINGF(
TL(
"Discarding edge '%' which connects two identical nodes without geometry."),
id);
502 int intermediateIndex = (int) passed.size() / 2;
504 std::vector<long long int> part1(passed.begin(), passed.begin() + intermediateIndex + 1);
505 std::vector<long long int> part2(passed.begin() + intermediateIndex, passed.end());
506 index =
insertEdge(e, index, from, intermediate, part1, nb, first, last);
507 return insertEdge(e, index, intermediate, to, part2, nb, first, last);
509 const int newIndex = index + 1;
514 std::string routingType =
"";
522 std::vector<SumoXMLAttr> defaults;
525 extra = extra & ~SVC_BUS;
527 SVCPermissions permissions = (defaultPermissions & ~extraDis) | extra;
533 defaultsToOneWay =
true;
535 if (defaultPermissions ==
SVC_SHIP) {
537 permissions = defaultPermissions;
540 defaultsToOneWay =
false;
548 double distanceStart =
myOSMNodes[passed.front()]->positionMeters;
549 double distanceEnd =
myOSMNodes[passed.back()]->positionMeters;
550 const bool useDistance = distanceStart != std::numeric_limits<double>::max() && distanceEnd != std::numeric_limits<double>::max();
553 if (distanceStart < distanceEnd) {
566 std::vector<std::shared_ptr<NBPTStop> > ptStops;
567 for (
long long i : passed) {
571 std::shared_ptr<NBPTStop> existingPtStop = sc.
get(
toString(n->
id));
572 if (existingPtStop !=
nullptr) {
573 existingPtStop->registerAdditionalEdge(
toString(e->
id), id);
577 WRITE_ERRORF(
"Unable to project coordinates for node '%'.", n->
id);
581 sc.
insert(ptStops.back());
588 shape.push_back(pos);
590#ifdef DEBUG_LAYER_ELEVATION
591 if (e->
id ==
"DEBUGID") {
596 <<
" nodeDirection=" << nodeDirection
608 WRITE_ERRORF(
"Unable to project coordinates for edge '%'.",
id);
614 if (streetName == e->
ref) {
631 const std::string& onewayBike = e->
myExtraTags[
"oneway:bicycle"];
632 if (onewayBike ==
"false" || onewayBike ==
"no" || onewayBike ==
"0") {
643 bool addForward =
true;
644 bool addBackward =
true;
660 if (addBackward && (onewayBike ==
"true" || onewayBike ==
"yes" || onewayBike ==
"1")) {
663 if (addForward && (onewayBike ==
"reverse" || onewayBike ==
"-1")) {
666 if (!addBackward && (onewayBike ==
"false" || onewayBike ==
"no" || onewayBike ==
"0")) {
673 if (addForward && !addBackward) {
675 }
else if (!addForward && addBackward) {
683 numLanesForward = (int) std::ceil(e->
myNoLanes / 2.0);
685 numLanesBackward = e->
myNoLanes - numLanesForward;
688 numLanesForward =
MAX2(1, numLanesForward);
689 numLanesBackward =
MAX2(1, numLanesBackward);
700 numLanesForward =
MAX2(numLanesForward, 2);
706 numLanesBackward =
MAX2(numLanesForward, 2);
721 numLanesBackward = 1;
724 const int taggedLanes = (addForward ? numLanesForward : 0) + (addBackward ? numLanesBackward : 0);
728 forwardWidth = e->
myWidth / taggedLanes;
729 backwardWidth = forwardWidth;
738 double speedBackward = speed;
742 if (speed <= 0 || speedBackward <= 0) {
746 if (e->
myNoLanes == 1 && addForward && addBackward) {
759 routingType =
"narrow";
765 if (!addForward && (cyclewayType &
WAY_FORWARD) != 0) {
768 forwardWidth = bikeLaneWidth;
773 if (!addBackward && (cyclewayType &
WAY_BACKWARD) != 0) {
776 backwardWidth = bikeLaneWidth;
777 numLanesBackward = 1;
791 if (!addForward && (sidewalkType &
WAY_FORWARD) != 0) {
798 }
else if (addSidewalk && addForward && (sidewalkType &
WAY_BOTH) == 0
799 && numLanesForward == 1 && numLanesBackward <= 1
806 if (!addBackward && (sidewalkType &
WAY_BACKWARD) != 0) {
810 numLanesBackward = 1;
813 }
else if (addSidewalk && addBackward && (sidewalkType &
WAY_BOTH) == 0
814 && numLanesBackward == 1 && numLanesForward <= 1
823 bool applyPlacement =
false;
824 double placementOffset = 0;
826 if (!explicitOneWay) {
830 }
else if (!(addForward && !addBackward)) {
834 }
else if (numLanesForward <= 0) {
836 WRITE_WARNINGF(
TL(
"Ignoring placement for edge '%' because lane count is invalid."),
id);
841 std::vector<double> laneWidths((
size_t)numLanesForward, defaultPlacementWidth);
844 for (
int i = 0; i < numLanesForward; ++i) {
851 WRITE_WARNINGF(
TL(
"Ignoring placement for edge '%' because lane index '%' is out of range [1, %]."),
856 double leftOffset = 0;
857 for (
int i = 0; i < laneIndex; ++i) {
858 leftOffset += laneWidths[(size_t)i];
860 double placementRefOffset = leftOffset;
862 placementRefOffset += laneWidths[(size_t)laneIndex];
864 placementRefOffset += laneWidths[(size_t)laneIndex] / 2.;
866 double totalWidth = 0;
867 for (
double laneWidth : laneWidths) {
868 totalWidth += laneWidth;
870 placementOffset = totalWidth / 2. - placementRefOffset;
871 applyPlacement =
true;
875 if (applyPlacement && fabs(placementOffset) > POSITION_EPS) {
880 WRITE_WARNINGF(
TL(
"Ignoring placement for edge '%' because offset shape computation failed."),
id);
882 applyPlacement =
false;
890 const int offsetFactor = lefthand ? -1 : 1;
903 if (applyPlacement) {
907 if (defaults.size() > 0) {
912 const std::string reverseID =
"-" + id;
915 assert(numLanesForward > 0);
919 if (markOSMDirection) {
956 if ((
int)nbe->
getLanes().size() != numForwardLanesFromWidthKey) {
957 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."),
958 id, nbe->
getLanes().size(), numForwardLanesFromWidthKey);
960 for (
int i = 0; i < numForwardLanesFromWidthKey; i++) {
962 const int laneIndex = lefthand ? i : numForwardLanesFromWidthKey - i - 1;
979 assert(numLanesBackward > 0);
983 if (markOSMDirection) {
1014 if ((
int)nbe->
getLanes().size() != numBackwardLanesFromWidthKey) {
1015 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."),
1016 id, nbe->
getLanes().size(), numBackwardLanesFromWidthKey);
1018 for (
int i = 0; i < numBackwardLanesFromWidthKey; i++) {
1020 const int laneIndex = lefthand ? i : numBackwardLanesFromWidthKey - i - 1;
1072 std::map<NBNode*, std::vector<std::pair<double, double> > > layerForces;
1075 std::set<NBNode*> knownElevation;
1076 for (
auto& myEdge :
myEdges) {
1077 Edge* e = myEdge.second;
1081 if (node !=
nullptr) {
1082 knownElevation.insert(node);
1083 layerForces[node].emplace_back(e->
myLayer * layerElevation, POSITION_EPS);
1088#ifdef DEBUG_LAYER_ELEVATION
1089 std::cout <<
"known elevations:\n";
1090 for (std::set<NBNode*>::iterator it = knownElevation.begin(); it != knownElevation.end(); ++it) {
1091 const std::vector<std::pair<double, double> >& primaryLayers = layerForces[*it];
1092 std::cout <<
" node=" << (*it)->
getID() <<
" ele=";
1093 for (std::vector<std::pair<double, double> >::const_iterator it_ele = primaryLayers.begin(); it_ele != primaryLayers.end(); ++it_ele) {
1094 std::cout << it_ele->first <<
" ";
1102 std::map<NBNode*, double> knownEleMax;
1103 for (
auto it : knownElevation) {
1104 double eleMax = -std::numeric_limits<double>::max();
1105 const std::vector<std::pair<double, double> >& primaryLayers = layerForces[it];
1106 for (
const auto& primaryLayer : primaryLayers) {
1107 eleMax =
MAX2(eleMax, primaryLayer.first);
1109 knownEleMax[it] = eleMax;
1112 bool changed =
true;
1115 for (
auto it = knownElevation.begin(); it != knownElevation.end(); ++it) {
1118 / gradeThreshold * 3,
1120 for (
auto& neighbor : neighbors) {
1121 if (knownElevation.count(neighbor.first) != 0) {
1122 const double grade = fabs(knownEleMax[*it] - knownEleMax[neighbor.first])
1123 /
MAX2(POSITION_EPS, neighbor.second.first);
1124#ifdef DEBUG_LAYER_ELEVATION
1125 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";
1127 if (grade > gradeThreshold * 50 / 3.6 / neighbor.second.second) {
1129 const double eleMax =
MAX2(knownEleMax[*it], knownEleMax[neighbor.first]);
1130 if (knownEleMax[*it] < eleMax) {
1131 knownEleMax[*it] = eleMax;
1133 knownEleMax[neighbor.first] = eleMax;
1143 std::set<NBNode*> unknownElevation;
1144 for (
auto it = knownElevation.begin(); it != knownElevation.end(); ++it) {
1145 const double eleMax = knownEleMax[*it];
1146 const double maxDist = fabs(eleMax) * 100 / layerElevation;
1147 std::map<NBNode*, std::pair<double, double> > neighbors =
getNeighboringNodes(*it, maxDist, knownElevation);
1148 for (
auto& neighbor : neighbors) {
1149 if (knownElevation.count(neighbor.first) == 0) {
1150 unknownElevation.insert(neighbor.first);
1151 layerForces[neighbor.first].emplace_back(eleMax, neighbor.second.first);
1157 for (
auto it = unknownElevation.begin(); it != unknownElevation.end(); ++it) {
1158 double eleMax = -std::numeric_limits<double>::max();
1159 const std::vector<std::pair<double, double> >& primaryLayers = layerForces[*it];
1160 for (
const auto& primaryLayer : primaryLayers) {
1161 eleMax =
MAX2(eleMax, primaryLayer.first);
1163 const double maxDist = fabs(eleMax) * 100 / layerElevation;
1164 std::map<NBNode*, std::pair<double, double> > neighbors =
getNeighboringNodes(*it, maxDist, knownElevation);
1165 for (
auto& neighbor : neighbors) {
1166 if (knownElevation.count(neighbor.first) == 0 && unknownElevation.count(neighbor.first) == 0) {
1167 layerForces[*it].emplace_back(0, neighbor.second.first);
1172#ifdef DEBUG_LAYER_ELEVATION
1173 std::cout <<
"summation of forces\n";
1175 std::map<NBNode*, double> nodeElevation;
1176 for (
auto& layerForce : layerForces) {
1177 const std::vector<std::pair<double, double> >& forces = layerForce.second;
1178 if (knownElevation.count(layerForce.first) != 0) {
1186#ifdef DEBUG_LAYER_ELEVATION
1187 std::cout <<
" node=" << it->first->getID() <<
" knownElevation=" << knownEleMax[it->first] <<
"\n";
1189 nodeElevation[layerForce.first] = knownEleMax[layerForce.first];
1190 }
else if (forces.size() == 1) {
1191 nodeElevation[layerForce.first] = forces.front().first;
1195 for (
const auto& force : forces) {
1196 distSum += force.second;
1198 double weightSum = 0;
1199 double elevation = 0;
1200#ifdef DEBUG_LAYER_ELEVATION
1201 std::cout <<
" node=" << it->first->getID() <<
" distSum=" << distSum <<
"\n";
1203 for (
const auto& force : forces) {
1204 const double weight = (distSum - force.second) / distSum;
1205 weightSum += weight;
1206 elevation += force.first * weight;
1208#ifdef DEBUG_LAYER_ELEVATION
1209 std::cout <<
" force=" << it_force->first <<
" dist=" << it_force->second <<
" weight=" << weight <<
" ele=" << elevation <<
"\n";
1212 nodeElevation[layerForce.first] = elevation / weightSum;
1215#ifdef DEBUG_LAYER_ELEVATION
1216 std::cout <<
"final elevations:\n";
1217 for (std::map<NBNode*, double>::iterator it = nodeElevation.begin(); it != nodeElevation.end(); ++it) {
1218 std::cout <<
" node=" << (it->first)->getID() <<
" ele=" << it->second <<
"\n";
1222 for (
auto& it : nodeElevation) {
1228 for (
const auto& it : ec) {
1229 NBEdge* edge = it.second;
1231 const double length = geom.
length2D();
1232 const double zFrom = nodeElevation[edge->
getFromNode()];
1233 const double zTo = nodeElevation[edge->
getToNode()];
1238 for (
auto it_pos = geom.begin(); it_pos != geom.end(); ++it_pos) {
1239 if (it_pos != geom.begin()) {
1240 dist += (*it_pos).distanceTo2D(*(it_pos - 1));
1242 newGeom.push_back((*it_pos) +
Position(0, 0, zFrom + (zTo - zFrom) * dist / length));
1248std::map<NBNode*, std::pair<double, double> >
1250 std::map<NBNode*, std::pair<double, double> > result;
1251 std::set<NBNode*> visited;
1252 std::vector<NBNode*> open;
1253 open.push_back(node);
1254 result[node] = std::make_pair(0, 0);
1255 while (!open.empty()) {
1258 if (visited.count(n) != 0) {
1263 for (
auto e : edges) {
1266 s = e->getFromNode();
1270 const double dist = result[n].first + e->getGeometry().length2D();
1271 const double speed =
MAX2(e->getSpeed(), result[n].second);
1272 if (result.count(s) == 0) {
1273 result[s] = std::make_pair(dist, speed);
1275 result[s] = std::make_pair(
MIN2(dist, result[s].first),
MAX2(speed, result[s].second));
1277 if (dist < maxDist && knownElevation.count(s) == 0) {
1289 if (tc.
knows(type)) {
1300 std::vector<std::string> types;
1302 std::string t = tok.
next();
1304 if (std::find(types.begin(), types.end(), t) == types.end()) {
1307 }
else if (tok.
size() > 1) {
1309 WRITE_WARNINGF(
TL(
"Discarding unknown compound '%' in type '%' (first occurrence for edge '%')."), t, type,
id);
1313 if (types.empty()) {
1315 WRITE_WARNINGF(
TL(
"Discarding unusable type '%' (first occurrence for edge '%')."), type,
id);
1321 if (tc.
knows(newType)) {
1329 double maxSpeed = 0;
1334 bool defaultIsOneWay =
true;
1337 bool discard =
true;
1338 bool hadDiscard =
false;
1339 for (
auto& type2 : types) {
1356 if (hadDiscard && permissions == 0) {
1360 WRITE_WARNINGF(
TL(
"Discarding compound type '%' (first occurrence for edge '%')."), newType,
id);
1375 WRITE_MESSAGEF(
TL(
"Adding new type '%' (first occurrence for edge '%')."), type,
id);
1376 tc.
insertEdgeType(newType, numLanes, maxSpeed, prio, permissions, spreadType, width,
1377 defaultIsOneWay, sidewalkWidth, bikelaneWidth, 0, 0, 0);
1378 for (
auto& type3 : types) {
1393 std::vector<NIOSMNode*> nodes;
1394 std::vector<double> usablePositions;
1395 std::vector<int> usableIndex;
1399 if (node->
positionMeters != std::numeric_limits<double>::max()) {
1401 usableIndex.push_back((
int)nodes.size());
1403 nodes.push_back(node);
1405 if (usablePositions.size() == 0) {
1408 bool forward =
true;
1409 if (usablePositions.size() == 1) {
1410 WRITE_WARNINGF(
TL(
"Ambiguous railway kilometrage direction for way '%' (assuming forward)"),
id);
1412 forward = usablePositions.front() < usablePositions.back();
1415 for (
int i = 1; i < (int)usablePositions.size(); i++) {
1416 if ((usablePositions[i - 1] < usablePositions[i]) != forward) {
1417 WRITE_WARNINGF(
TL(
"Inconsistent railway kilometrage direction for way '%': % (skipping)"),
id,
toString(usablePositions));
1421 if (nodes.size() > usablePositions.size()) {
1425 shape.push_back(
Position(node->lon, node->lat, 0));
1430 double sign = forward ? 1 : -1;
1432 for (
int i = usableIndex.front() - 1; i >= 0; i--) {
1433 nodes[i]->positionMeters = nodes[i + 1]->positionMeters - sign * shape[i].distanceTo2D(shape[i + 1]);
1436 for (
int i = usableIndex.front() + 1; i < (int)nodes.size(); i++) {
1437 if (nodes[i]->positionMeters == std::numeric_limits<double>::max()) {
1438 nodes[i]->positionMeters = nodes[i - 1]->positionMeters + sign * shape[i].distanceTo2D(shape[i - 1]);
1465 return std::numeric_limits<double>::max();
1471 if (type ==
"train") {
1473 }
else if (type ==
"subway") {
1475 }
else if (type ==
"aerialway") {
1477 }
else if (type ==
"light_rail" || type ==
"monorail") {
1479 }
else if (type ==
"share_taxi") {
1481 }
else if (type ==
"minibus") {
1483 }
else if (type ==
"trolleybus") {
1488 std::string stop =
"";
1491 }
else if (result ==
SVC_BUS) {
1506 bool multiLane = changeProhibition > 3;
1508 for (
int lane = 0; changeProhibition > 0 && lane < e->
getNumLanes(); lane++) {
1509 int code = changeProhibition % 4;
1514 changeProhibition = changeProhibition >> 2;
1528 for (
int lane = 0; lane < numLanes; lane++) {
1530 const int i = lefthand ? lane : numLanes - 1 - lane;
1535 if (i < (
int)designated.size() && designated[i]) {
1547 if (signs.empty()) {
1548 signs.insert(signs.begin(), signs2.begin(), signs2.end());
1550 for (
int i = 0; i < (int)
MIN2(signs.size(), signs2.size()); i++) {
1551 signs[i] |= signs2[i];
1563 for (
int i = 0; i < (int)turnSigns.size(); i++) {
1580 std::set<NIOSMNode*, CompareNodes>& uniqueNodes,
const OptionsCont& oc) :
1583 myCurrentNode(nullptr),
1585 myHierarchyLevel(0),
1586 myUniqueNodes(uniqueNodes),
1587 myImportElevation(oc.getBool(
"osm.elevation")),
1588 myDuplicateNodes(0),
1592 if (kv ==
"DEFAULT") {
1595 }
else if (kv ==
"ALL") {
1612 if (myHierarchyLevel != 2) {
1613 WRITE_ERROR(
"Node element on wrong XML hierarchy level (id='" + myLastNodeID +
1614 "', level='" +
toString(myHierarchyLevel) +
"').");
1618 if (action ==
"delete" || !ok) {
1624 myCurrentNode =
nullptr;
1625 const auto insertionIt = myToFill.lower_bound(
id);
1626 if (insertionIt == myToFill.end() || insertionIt->first !=
id) {
1628 const double tlon = attrs.
get<
double>(
SUMO_ATTR_LON, myLastNodeID.c_str(), ok);
1629 const double tlat = attrs.
get<
double>(
SUMO_ATTR_LAT, myLastNodeID.c_str(), ok);
1633 myCurrentNode =
new NIOSMNode(
id, tlon, tlat);
1638 delete myCurrentNode;
1639 myCurrentNode = *similarNode;
1642 myToFill.emplace_hint(insertionIt,
id, myCurrentNode);
1645 WRITE_ERROR(
TL(
"Attribute 'id' in the definition of a node is not of type long long int."));
1649 if (element ==
SUMO_TAG_TAG && myCurrentNode !=
nullptr) {
1650 if (myHierarchyLevel != 3) {
1651 WRITE_ERROR(
TL(
"Tag element on wrong XML hierarchy level."));
1655 const std::string& key = attrs.
get<std::string>(
SUMO_ATTR_K, myLastNodeID.c_str(), ok,
false);
1657 if (key ==
"highway" || key ==
"ele" || key ==
"crossing" || key ==
"railway" || key ==
"public_transport"
1658 || key ==
"name" || key ==
"train" || key ==
"bus" || key ==
"tram" || key ==
"light_rail" || key ==
"subway" || key ==
"station" || key ==
"noexit"
1659 || key ==
"crossing:barrier"
1660 || key ==
"crossing:light"
1661 || key ==
"railway:ref"
1665 const std::string& value = attrs.
get<std::string>(
SUMO_ATTR_V, myLastNodeID.c_str(), ok,
false);
1666 if (key ==
"highway" && value.find(
"traffic_signal") != std::string::npos) {
1667 myCurrentNode->tlsControlled =
true;
1668 }
else if (key ==
"crossing" && value.find(
"traffic_signals") != std::string::npos) {
1669 myCurrentNode->tlsControlled =
true;
1670 }
else if (key ==
"highway" && value.find(
"crossing") != std::string::npos) {
1671 myCurrentNode->pedestrianCrossing =
true;
1672 }
else if ((key ==
"noexit" && value ==
"yes")
1673 || (key ==
"railway" && value ==
"buffer_stop")) {
1674 myCurrentNode->railwayBufferStop =
true;
1675 }
else if (key ==
"railway" && value.find(
"crossing") != std::string::npos) {
1676 myCurrentNode->railwayCrossing =
true;
1677 }
else if (key ==
"crossing:barrier") {
1678 myCurrentNode->setParameter(
"crossing:barrier", value);
1679 }
else if (key ==
"crossing:light") {
1680 myCurrentNode->setParameter(
"crossing:light", value);
1681 }
else if (key ==
"railway:signal:direction") {
1682 if (value ==
"both") {
1683 myCurrentNode->myRailDirection =
WAY_BOTH;
1684 }
else if (value ==
"backward") {
1686 }
else if (value ==
"forward") {
1690 std::string kv = key +
"=" + value;
1691 std::string kglob = key +
"=";
1692 if ((std::find(myRailSignalRules.begin(), myRailSignalRules.end(), kv) != myRailSignalRules.end())
1693 || (std::find(myRailSignalRules.begin(), myRailSignalRules.end(), kglob) != myRailSignalRules.end())) {
1694 myCurrentNode->railwaySignal =
true;
1696 }
else if (
StringUtils::startsWith(key,
"railway:position") && value.size() > myCurrentNode->position.size()) {
1698 myCurrentNode->position = value;
1699 }
else if ((key ==
"public_transport" && value ==
"stop_position") ||
1700 (key ==
"highway" && value ==
"bus_stop")) {
1701 myCurrentNode->ptStopPosition =
true;
1702 if (myCurrentNode->ptStopLength == 0) {
1704 myCurrentNode->ptStopLength = myOptionsCont.getFloat(
"osm.stop-output.length");
1706 }
else if (key ==
"name") {
1707 myCurrentNode->name = value;
1708 }
else if (myImportElevation && key ==
"ele") {
1711 if (std::isnan(elevation)) {
1712 WRITE_WARNINGF(
TL(
"Value of key '%' is invalid ('%') in node '%'."), key, value, myLastNodeID);
1714 myCurrentNode->ele = elevation;
1717 WRITE_WARNINGF(
TL(
"Value of key '%' is not numeric ('%') in node '%'."), key, value, myLastNodeID);
1719 }
else if (key ==
"station") {
1722 }
else if (key ==
"railway:ref") {
1723 myRailwayRef = value;
1730 const std::string info =
"node=" +
toString(myCurrentNode->id) +
", k=" + key;
1731 myCurrentNode->setParameter(key, attrs.
get<std::string>(
SUMO_ATTR_V, info.c_str(), ok,
false));
1740 if (myIsStation && myRailwayRef !=
"") {
1741 myCurrentNode->setParameter(
"railway:ref", myRailwayRef);
1743 myCurrentNode =
nullptr;
1744 myIsStation =
false;
1755 const std::map<long long int, NIOSMNode*>& osmNodes,
1756 std::map<long long int, Edge*>& toFill, std::map<long long int, Edge*>& platformShapes,
1761 myPlatformShapesMap(platformShapes),
1859 const long long int id = attrs.
get<
long long int>(
SUMO_ATTR_ID,
nullptr, ok);
1861 if (action ==
"delete" || !ok) {
1862 myCurrentEdge =
nullptr;
1865 myCurrentEdge =
new Edge(
id);
1868 if (element ==
SUMO_TAG_ND && myCurrentEdge !=
nullptr) {
1878 ref = node->second->id;
1879 if (myCurrentEdge->myCurrentNodes.empty() ||
1880 myCurrentEdge->myCurrentNodes.back() != ref) {
1881 myCurrentEdge->myCurrentNodes.push_back(ref);
1886 if (element ==
SUMO_TAG_TAG && myCurrentEdge !=
nullptr) {
1891 const std::string buswaySpec = key.substr(7);
1893 if (buswaySpec ==
"right") {
1895 }
else if (buswaySpec ==
"left") {
1897 }
else if (buswaySpec ==
"both") {
1898 myCurrentEdge->myBuswayType = (
WayType)(myCurrentEdge->myBuswayType |
WAY_BOTH);
1904 const std::string info =
"way=" +
toString(myCurrentEdge->id) +
", k=" + key;
1905 myCurrentEdge->setParameter(key, attrs.
get<std::string>(
SUMO_ATTR_V, info.c_str(), ok,
false));
1910 && key !=
"maxspeed" && key !=
"maxspeed:type"
1911 && key !=
"zone:maxspeed"
1912 && key !=
"maxspeed:forward" && key !=
"maxspeed:backward"
1913 && key !=
"junction" && key !=
"name" && key !=
"tracks" && key !=
"layer"
1918 && key !=
"highspeed"
1922 && key !=
"postal_code"
1923 && key !=
"railway:preferred_direction"
1924 && key !=
"railway:bidirectional"
1925 && key !=
"railway:track_ref"
1928 && key !=
"emergency"
1930 && key !=
"electrified"
1931 && key !=
"segregated"
1936 && key !=
"oneway:bicycle"
1937 && key !=
"oneway:bus"
1938 && key !=
"oneway:psv"
1939 && key !=
"placement"
1940 && key !=
"bus:lanes"
1941 && key !=
"bus:lanes:forward"
1942 && key !=
"bus:lanes:backward"
1943 && key !=
"psv:lanes"
1944 && key !=
"psv:lanes:forward"
1945 && key !=
"psv:lanes:backward"
1946 && key !=
"bicycle:lanes"
1947 && key !=
"bicycle:lanes:forward"
1948 && key !=
"bicycle:lanes:backward"
1951 && key !=
"public_transport") {
1954 const std::string value = attrs.
get<std::string>(
SUMO_ATTR_V,
toString(myCurrentEdge->id).c_str(), ok,
false);
1958 || key ==
"aeroway" || key ==
"aerialway" || key ==
"usage" || key ==
"service") {
1960 if (key !=
"highway" || myTypeCont.knows(key +
"." + value)) {
1961 myCurrentEdge->myCurrentIsRoad =
true;
1964 if (key ==
"cycleway") {
1965 if (value ==
"no" || value ==
"none" || value ==
"separate") {
1966 myCurrentEdge->myCyclewayType =
WAY_NONE;
1967 }
else if (value ==
"both") {
1968 myCurrentEdge->myCyclewayType =
WAY_BOTH;
1969 }
else if (value ==
"right") {
1971 }
else if (value ==
"left") {
1973 }
else if (value ==
"opposite_track") {
1975 }
else if (value ==
"opposite_lane") {
1977 }
else if (value ==
"opposite") {
1982 if (key ==
"cycleway:left") {
1983 if (myCurrentEdge->myCyclewayType ==
WAY_UNKNOWN) {
1984 myCurrentEdge->myCyclewayType =
WAY_NONE;
1986 if (value ==
"yes" || value ==
"lane" || value ==
"track") {
1991 if (key ==
"cycleway:right") {
1992 if (myCurrentEdge->myCyclewayType ==
WAY_UNKNOWN) {
1993 myCurrentEdge->myCyclewayType =
WAY_NONE;
1995 if (value ==
"yes" || value ==
"lane" || value ==
"track") {
1996 myCurrentEdge->myCyclewayType = (
WayType)(myCurrentEdge->myCyclewayType |
WAY_FORWARD);
2000 if (key ==
"cycleway:both") {
2001 if (myCurrentEdge->myCyclewayType ==
WAY_UNKNOWN) {
2002 if (value ==
"no" || value ==
"none" || value ==
"separate") {
2003 myCurrentEdge->myCyclewayType =
WAY_NONE;
2005 if (value ==
"yes" || value ==
"lane" || value ==
"track") {
2006 myCurrentEdge->myCyclewayType =
WAY_BOTH;
2011 if (key ==
"cycleway" && value !=
"lane" && value !=
"track" && value !=
"opposite_track" && value !=
"opposite_lane") {
2020 if (key ==
"sidewalk") {
2021 if (value ==
"no" || value ==
"none" || value ==
"separate") {
2022 myCurrentEdge->mySidewalkType =
WAY_NONE;
2023 }
else if (value ==
"both") {
2024 myCurrentEdge->mySidewalkType =
WAY_BOTH;
2025 }
else if (value ==
"right") {
2027 }
else if (value ==
"left") {
2031 if (key ==
"sidewalk:left") {
2032 if (myCurrentEdge->mySidewalkType ==
WAY_UNKNOWN) {
2033 myCurrentEdge->mySidewalkType =
WAY_NONE;
2035 if (value ==
"yes") {
2039 if (key ==
"sidewalk:right") {
2040 if (myCurrentEdge->mySidewalkType ==
WAY_UNKNOWN) {
2041 myCurrentEdge->mySidewalkType =
WAY_NONE;
2043 if (value ==
"yes") {
2044 myCurrentEdge->mySidewalkType = (
WayType)(myCurrentEdge->mySidewalkType |
WAY_FORWARD);
2047 if (key ==
"sidewalk:both") {
2048 if (myCurrentEdge->mySidewalkType ==
WAY_UNKNOWN) {
2049 if (value ==
"no" || value ==
"none" || value ==
"separate") {
2050 myCurrentEdge->mySidewalkType =
WAY_NONE;
2052 if (value ==
"yes") {
2053 myCurrentEdge->mySidewalkType =
WAY_BOTH;
2062 if (key ==
"busway") {
2063 if (value ==
"no") {
2066 if (value ==
"opposite_track") {
2068 }
else if (value ==
"opposite_lane") {
2074 std::string singleTypeID = key +
"." + value;
2075 if (key ==
"highspeed") {
2076 if (value ==
"no") {
2079 singleTypeID =
"railway.highspeed";
2081 addType(singleTypeID);
2083 }
else if (key ==
"bus" || key ==
"psv") {
2087 myCurrentEdge->myExtraAllowed |=
SVC_BUS;
2090 myCurrentEdge->myExtraDisallowed |=
SVC_BUS;
2093 myCurrentEdge->myExtraAllowed |=
SVC_BUS;
2096 }
else if (key ==
"emergency") {
2104 }
else if (key ==
"access") {
2105 if (value ==
"no") {
2111 std::vector<double> widthLanes;
2112 for (std::string width : values) {
2114 widthLanes.push_back(parsedWidth);
2117 if (key ==
"width:lanes" || key ==
"width:lanes:forward") {
2118 myCurrentEdge->myWidthLanesForward = widthLanes;
2119 }
else if (key ==
"width:lanes:backward") {
2120 myCurrentEdge->myWidthLanesBackward = widthLanes;
2122 WRITE_WARNINGF(
TL(
"Using default lane width for edge '%' as key '%' could not be parsed."),
toString(myCurrentEdge->id), key);
2125 WRITE_WARNINGF(
TL(
"Using default lane width for edge '%' as value '%' could not be parsed."),
toString(myCurrentEdge->id), value);
2127 }
else if (key ==
"width") {
2131 WRITE_WARNINGF(
TL(
"Using default width for edge '%' as value '%' could not be parsed."),
toString(myCurrentEdge->id), value);
2133 }
else if (key ==
"foot") {
2134 if (value ==
"use_sidepath" || value ==
"no") {
2136 }
else if (value ==
"yes" || value ==
"designated" || value ==
"permissive") {
2139 }
else if (key ==
"bicycle") {
2140 if (value ==
"use_sidepath" || value ==
"no") {
2142 }
else if (value ==
"yes" || value ==
"designated" || value ==
"permissive") {
2145 }
else if (key ==
"oneway:bicycle") {
2146 myCurrentEdge->myExtraTags[
"oneway:bicycle"] = value;
2147 }
else if (key ==
"oneway:bus" || key ==
"oneway:psv") {
2148 if (value ==
"no") {
2152 }
else if (key ==
"placement") {
2153 if (!interpretPlacement(value, myCurrentEdge->myPlacement, myCurrentEdge->myPlacementLane)) {
2154 WRITE_WARNINGF(
TL(
"Ignoring unsupported placement value '%' for edge '%'."), value, myCurrentEdge->id);
2156 }
else if (key ==
"lanes") {
2162 std::vector<std::string> list = st.
getVector();
2163 if (list.size() >= 2) {
2164 int minLanes = std::numeric_limits<int>::max();
2166 for (
auto& i : list) {
2168 minLanes =
MIN2(minLanes, numLanes);
2170 myCurrentEdge->myNoLanes = minLanes;
2173 WRITE_WARNINGF(
TL(
"Value of key '%' is not numeric ('%') in edge '%'."), key, value, myCurrentEdge->id);
2177 WRITE_WARNINGF(
TL(
"Value of key '%' is not numeric ('%') in edge '%'."), key, value, myCurrentEdge->id);
2179 }
else if (key ==
"lanes:forward") {
2182 if (myCurrentEdge->myNoLanesForward < 0 && myCurrentEdge->myNoLanes < 0) {
2184 myCurrentEdge->myNoLanes = numLanes - myCurrentEdge->myNoLanesForward;
2186 myCurrentEdge->myNoLanesForward = numLanes;
2188 WRITE_WARNINGF(
TL(
"Value of key '%' is not numeric ('%') in edge '%'."), key, value, myCurrentEdge->id);
2190 }
else if (key ==
"lanes:backward") {
2193 if (myCurrentEdge->myNoLanesForward > 0 && myCurrentEdge->myNoLanes < 0) {
2195 myCurrentEdge->myNoLanes = numLanes + myCurrentEdge->myNoLanesForward;
2198 myCurrentEdge->myNoLanesForward = -numLanes;
2200 WRITE_WARNINGF(
TL(
"Value of key '%' is not numeric ('%') in edge '%'."), key, value, myCurrentEdge->id);
2203 (key ==
"maxspeed" || key ==
"maxspeed:type" || key ==
"maxspeed:forward" || key ==
"zone:maxspeed")) {
2205 myCurrentEdge->myMaxSpeed = interpretSpeed(key, value);
2206 }
else if (key ==
"maxspeed:backward" && myCurrentEdge->myMaxSpeedBackward ==
MAXSPEED_UNGIVEN) {
2207 myCurrentEdge->myMaxSpeedBackward = interpretSpeed(key, value);
2208 }
else if (key ==
"junction") {
2209 if ((value ==
"roundabout" || value ==
"circular") && myCurrentEdge->myIsOneWay.empty()) {
2210 myCurrentEdge->myIsOneWay =
"yes";
2212 if (value ==
"roundabout") {
2213 myCurrentEdge->myAmInRoundabout =
true;
2215 }
else if (key ==
"oneway") {
2216 myCurrentEdge->myIsOneWay = value;
2217 }
else if (key ==
"name") {
2218 myCurrentEdge->streetName = value;
2219 }
else if (key ==
"ref") {
2220 myCurrentEdge->ref = value;
2221 myCurrentEdge->setParameter(
"ref", value);
2222 }
else if (key ==
"layer") {
2226 WRITE_WARNINGF(
TL(
"Value of key '%' is not numeric ('%') in edge '%'."), key, value, myCurrentEdge->id);
2228 }
else if (key ==
"tracks") {
2231 myCurrentEdge->myIsOneWay =
"true";
2233 WRITE_WARNINGF(
TL(
"Ignoring track count % for edge '%'."), value, myCurrentEdge->id);
2236 WRITE_WARNINGF(
TL(
"Value of key '%' is not numeric ('%') in edge '%'."), key, value, myCurrentEdge->id);
2238 }
else if (key ==
"railway:preferred_direction") {
2239 if (value ==
"both") {
2241 }
else if (value ==
"backward") {
2243 }
else if (value ==
"forward") {
2246 }
else if (key ==
"railway:bidirectional") {
2247 if (value ==
"regular") {
2248 myCurrentEdge->myRailDirection = (myCurrentEdge->myRailDirection |
WAY_BOTH) & ~
WAY_UNKNOWN;
2250 }
else if (key ==
"electrified" || key ==
"segregated") {
2251 if (value !=
"no") {
2252 myCurrentEdge->myExtraTags[key] = value;
2254 }
else if (key ==
"railway:track_ref") {
2255 myCurrentEdge->setParameter(key, value);
2256 }
else if (key ==
"public_transport" && value ==
"platform") {
2257 myCurrentEdge->myExtraTags[
"platform"] =
"yes";
2262 }
else if ((key ==
"parking:right" || key ==
"parking:lane:right") && !
StringUtils::startsWith(value,
"no")) {
2264 }
else if (key ==
"change" || key ==
"change:lanes") {
2265 myCurrentEdge->myChangeForward = myCurrentEdge->myChangeBackward = interpretChangeType(value);
2266 }
else if (key ==
"change:forward" || key ==
"change:lanes:forward") {
2267 myCurrentEdge->myChangeForward = interpretChangeType(value);
2268 }
else if (key ==
"change:backward" || key ==
"change:lanes:backward") {
2269 myCurrentEdge->myChangeBackward = interpretChangeType(value);
2270 }
else if (key ==
"vehicle:lanes" || key ==
"vehicle:lanes:forward") {
2273 }
else if (key ==
"vehicle:lanes:backward") {
2276 }
else if (key ==
"bus:lanes" || key ==
"bus:lanes:forward") {
2277 interpretLaneUse(value,
SVC_BUS,
true);
2278 }
else if (key ==
"bus:lanes:backward") {
2279 interpretLaneUse(value,
SVC_BUS,
false);
2280 }
else if (key ==
"psv:lanes" || key ==
"psv:lanes:forward") {
2281 interpretLaneUse(value,
SVC_BUS,
true);
2282 interpretLaneUse(value,
SVC_TAXI,
true);
2283 }
else if (key ==
"psv:lanes:backward") {
2284 interpretLaneUse(value,
SVC_BUS,
false);
2285 interpretLaneUse(value,
SVC_TAXI,
false);
2286 }
else if (key ==
"bicycle:lanes" || key ==
"bicycle:lanes:forward") {
2288 }
else if (key ==
"bicycle:lanes:backward") {
2302 std::vector<int> turnCodes;
2303 for (std::string codeList : values) {
2306 if (codes.size() == 0) {
2309 for (std::string code : codes) {
2310 if (code ==
"" || code ==
"none" || code ==
"through") {
2312 }
else if (code ==
"left" || code ==
"sharp_left") {
2314 }
else if (code ==
"right" || code ==
"sharp_right") {
2316 }
else if (code ==
"slight_left") {
2318 }
else if (code ==
"slight_right") {
2320 }
else if (code ==
"reverse") {
2322 }
else if (code ==
"merge_to_left" || code ==
"merge_to_right") {
2326 turnCodes.push_back(turnCode);
2344 if (!myCurrentEdge->myHighWayType.empty() && singleTypeID !=
"railway.highspeed") {
2345 if (myCurrentEdge->myHighWayType ==
"railway.highspeed") {
2350 std::vector<std::string> types =
StringTokenizer(myCurrentEdge->myHighWayType,
2352 types.push_back(singleTypeID);
2355 myCurrentEdge->myHighWayType = singleTypeID;
2362 if (mySpeedMap.find(value) != mySpeedMap.end()) {
2363 return mySpeedMap[value];
2366 if (value.size() > 3 && value[2] ==
':') {
2367 if (value.substr(3, 4) ==
"zone") {
2368 value = value.substr(7);
2370 value = value.substr(3);
2376 WRITE_WARNING(
"Value of key '" + key +
"' is not numeric ('" + value +
"') in edge '" +
2377 toString(myCurrentEdge->id) +
"'.");
2388 for (
const std::string& val : values) {
2391 }
else if (val ==
"not_left") {
2393 }
else if (val ==
"not_right") {
2396 result = result << 2;
2399 result = result >> 2;
2401 if (values.size() > 1) {
2414 if (tokens.size() != 2) {
2418 if (where ==
"left_of") {
2420 }
else if (where ==
"right_of") {
2422 }
else if (where ==
"middle_of") {
2434 if (laneIndex <= 0) {
2446 std::vector<bool>& designated = forward ? myCurrentEdge->myDesignatedLaneForward : myCurrentEdge->myDesignatedLaneBackward;
2447 std::vector<SVCPermissions>& allowed = forward ? myCurrentEdge->myAllowedLaneForward : myCurrentEdge->myAllowedLaneBackward;
2448 std::vector<SVCPermissions>& disallowed = forward ? myCurrentEdge->myDisallowedLaneForward : myCurrentEdge->myDisallowedLaneBackward;
2449 designated.resize(
MAX2(designated.size(), values.size()),
false);
2453 for (
const std::string& val : values) {
2454 if (val ==
"yes" || val ==
"permissive") {
2456 }
else if (val ==
"lane" || val ==
"designated") {
2458 designated[i] =
true;
2459 }
else if (val ==
"no") {
2460 disallowed[i] |= svc;
2462 WRITE_WARNINGF(
TL(
"Unknown lane use specifier '%' ignored for way '%'"), val, myCurrentEdge->id);
2471 if (element ==
SUMO_TAG_WAY && myCurrentEdge !=
nullptr) {
2472 if (myCurrentEdge->myCurrentIsRoad) {
2473 const auto insertionIt = myEdgeMap.lower_bound(myCurrentEdge->id);
2474 if (insertionIt == myEdgeMap.end() || insertionIt->first != myCurrentEdge->id) {
2476 myEdgeMap.emplace_hint(insertionIt, myCurrentEdge->id, myCurrentEdge);
2478 delete myCurrentEdge;
2480 }
else if (myCurrentEdge->myExtraTags.count(
"platform") != 0) {
2481 const auto insertionIt = myPlatformShapesMap.lower_bound(myCurrentEdge->id);
2482 if (insertionIt == myPlatformShapesMap.end() || insertionIt->first != myCurrentEdge->id) {
2484 myPlatformShapesMap.emplace_hint(insertionIt, myCurrentEdge->id, myCurrentEdge);
2486 delete myCurrentEdge;
2489 delete myCurrentEdge;
2491 myCurrentEdge =
nullptr;
2500 const std::map<long long int, NIOSMNode*>& osmNodes,
2501 const std::map<long long int, Edge*>& osmEdges,
NBPTStopCont* nbptStopCont,
2502 const std::map<long long int, Edge*>& platformShapes,
2507 myOSMEdges(osmEdges),
2509 myNBPTStopCont(nbptStopCont),
2510 myNBPTLineCont(nbptLineCont),
2522 myIsRestriction =
false;
2529 myRestrictionType = RestrictionType::UNKNOWN;
2530 myPlatforms.clear();
2532 myPlatformStops.clear();
2534 myIsStopArea =
false;
2537 myRouteColor.setValid(
false);
2545 myCurrentRelation = attrs.
get<
long long int>(
SUMO_ATTR_ID,
nullptr, ok);
2547 if (action ==
"delete" || !ok) {
2553 myNightService =
"";
2562 const long long int ref = attrs.
get<
long long int>(
SUMO_ATTR_REF,
nullptr, ok);
2563 if (role ==
"via") {
2566 if (memberType ==
"way" && checkEdgeRef(ref)) {
2568 }
else if (memberType ==
"node") {
2575 }
else if (role ==
"from" && checkEdgeRef(ref)) {
2577 }
else if (role ==
"to" && checkEdgeRef(ref)) {
2581 myStops.push_back(ref);
2585 if (memberType ==
"way") {
2586 const std::map<long long int, NIImporter_OpenStreetMap::Edge*>::const_iterator& wayIt =
myPlatformShapes.find(ref);
2589 platform.
isWay =
true;
2591 myPlatforms.push_back(platform);
2593 }
else if (memberType ==
"node") {
2595 myStops.push_back(ref);
2596 myPlatformStops.insert(ref);
2598 platform.
isWay =
false;
2600 myPlatforms.push_back(platform);
2603 }
else if (role ==
"station") {
2605 }
else if (role.empty()) {
2607 if (memberType ==
"way") {
2608 myWays.push_back(ref);
2609 }
else if (memberType ==
"node") {
2611 if (it !=
myOSMNodes.end() && it->second->hasParameter(
"railway:ref")) {
2614 myStops.push_back(ref);
2625 if (key ==
"type" || key ==
"restriction") {
2627 if (key ==
"type" && value ==
"restriction") {
2628 myIsRestriction =
true;
2631 if (key ==
"type" && value ==
"route") {
2635 if (key ==
"restriction") {
2638 if (value.substr(0, 5) ==
"only_") {
2639 myRestrictionType = RestrictionType::ONLY;
2640 }
else if (value.substr(0, 3) ==
"no_") {
2641 myRestrictionType = RestrictionType::NO;
2647 }
else if (key ==
"except") {
2651 myRestrictionException |=
SVC_BUS;
2652 }
else if (v ==
"bicycle") {
2654 }
else if (v ==
"hgv") {
2656 }
else if (v ==
"motorcar") {
2658 }
else if (v ==
"emergency") {
2662 }
else if (key ==
"public_transport") {
2664 if (value ==
"stop_area") {
2665 myIsStopArea =
true;
2667 }
else if (key ==
"route") {
2669 if (value ==
"train" || value ==
"subway" || value ==
"light_rail" || value ==
"monorail" || value ==
"tram" || value ==
"bus"
2670 || value ==
"trolleybus" || value ==
"aerialway" || value ==
"ferry" || value ==
"share_taxi" || value ==
"minibus") {
2671 myPTRouteType = value;
2674 }
else if (key ==
"name") {
2676 }
else if (key ==
"colour") {
2681 WRITE_WARNINGF(
TL(
"Invalid color value '%' in relation %"), value, myCurrentRelation);
2683 }
else if (key ==
"ref") {
2685 }
else if (key ==
"interval" || key ==
"headway") {
2687 }
else if (key ==
"by_night") {
2696 if (myOSMEdges.find(ref) != myOSMEdges.end()) {
2707 if (myIsRestriction) {
2710 if (myRestrictionType == RestrictionType::UNKNOWN) {
2726 if (ok && !applyRestriction()) {
2729 }
else if (myIsStopArea) {
2730 for (
long long ref : myStops) {
2731 myStopAreas[ref] = myCurrentRelation;
2740 std::shared_ptr<NBPTStop> ptStop = myNBPTStopCont->get(
toString(n->
id));
2741 if (ptStop ==
nullptr) {
2748 if (myPlatform.isWay) {
2752 WRITE_WARNINGF(
TL(
"Platform '%' in relation: '%' is given as polygon, which currently is not supported."), myPlatform.ref, myCurrentRelation);
2767 WRITE_ERRORF(
"Unable to project coordinates for node '%'.", pNode->
id);
2770 p.push_back(pNodePos);
2772 if (p.size() == 0) {
2773 WRITE_WARNINGF(
TL(
"Referenced platform: '%' in relation: '%' is corrupt. Probably OSM file is incomplete."),
2778 ptStop->addPlatformCand(platform);
2789 WRITE_ERRORF(
"Unable to project coordinates for node '%'.", pNode->
id);
2791 NBPTPlatform platform(platformPos, myOptionsCont.getFloat(
"osm.stop-output.length"));
2792 ptStop->addPlatformCand(platform);
2796 ptStop->setIsMultipleStopPositions(myStops.size() > 1, myCurrentRelation);
2798 const auto& nodeIt =
myOSMNodes.find(myStation);
2801 if (station !=
nullptr) {
2809 }
else if (myPTRouteType !=
"" && myIsRoute) {
2810 NBPTLine* ptLine =
new NBPTLine(
toString(myCurrentRelation), myName, myPTRouteType, myRef, myInterval, myNightService,
2812 int consecutiveGap =
false;
2813 int missingBefore = 0;
2814 int missingAfter = 0;
2815 for (
long long ref : myStops) {
2827 if (consecutiveGap > 1) {
2828 WRITE_WARNINGF(
TL(
"PT line '%' in relation % has a gap of % stops, only keeping first part."), myName, myCurrentRelation, consecutiveGap);
2829 missingAfter = (int)myStops.size() - missingBefore - (int)ptLine->
getStops().size();
2835 const NIOSMNode*
const n = nodeIt->second;
2836 std::shared_ptr<NBPTStop> ptStop = myNBPTStopCont->get(
toString(n->
id));
2837 if (ptStop ==
nullptr) {
2841 WRITE_ERRORF(
"Unable to project coordinates for node '%'.", n->
id);
2845 myNBPTStopCont->insert(ptStop);
2846 if (myStopAreas.count(n->
id)) {
2847 ptStop->setIsMultipleStopPositions(
false, myStopAreas[n->
id]);
2849 if (myPlatformStops.count(n->
id) > 0) {
2850 ptStop->setIsPlatform();
2855 for (
long long& myWay : myWays) {
2856 auto entr = myOSMEdges.find(myWay);
2857 if (entr != myOSMEdges.end()) {
2858 Edge* edge = entr->second;
2864 ptLine->
setNumOfStops((
int)myStops.size(), missingBefore, missingAfter);
2866 WRITE_WARNINGF(
TL(
"PT line in relation % with no stops ignored. Probably OSM file is incomplete."), myCurrentRelation);
2871 if (!myNBPTLineCont->insert(ptLine)) {
2886 if (viaNode ==
nullptr) {
2892 if (from ==
nullptr) {
2896 if (to ==
nullptr) {
2900 if (myRestrictionType == RestrictionType::ONLY) {
2927 WRITE_WARNINGF(
TL(
"direction of restriction relation could not be determined%"),
"");
2935 const std::vector<NBEdge*>& candidates)
const {
2936 const std::string prefix =
toString(wayRef);
2937 const std::string backPrefix =
"-" + prefix;
2938 NBEdge* result =
nullptr;
2940 for (
auto candidate : candidates) {
2941 if ((candidate->getID().substr(0, prefix.size()) == prefix) ||
2942 (candidate->getID().substr(0, backPrefix.size()) == backPrefix)) {
2948 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
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
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_TAG_BUS_STOP
A bus stop.
@ SUMO_TAG_TRAIN_STOP
A train stop (alias for bus stop)
@ 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.
bool wasInformed() const
Returns the information whether any messages were added.
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
void setRoutingType(const std::string &routingType)
set the routingType for this edge
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.
bool hasIncoming(const NBEdge *const e) const
Returns whether the given edge ends at this node.
NBNode::Crossing * addCrossing(EdgeVector edges, double width, bool priority, int tlIndex=-1, int tlIndex2=-1, const PositionVector &customShape=PositionVector::EMPTY, bool fromSumoNet=false, const Parameterised *params=nullptr)
add a pedestrian crossing to this node
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)
bool checkCrossingDuplicated(EdgeVector edges)
return true if there already exist a crossing with the same edges as the input
const Position & getPosition() const
const EdgeVector & getEdges() const
Returns all edges which participate in this node (Edges that start or end 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.
int myPlacementLane
1-based lane index for placement specification
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.
int myRailDirection
Information about the direction(s) of railway usage.
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.
PlacementType myPlacement
placement of the OSM way geometry relative to lanes
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)
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.
bool interpretPlacement(const std::string &value, NIImporter_OpenStreetMap::PlacementType &placement, int &laneIndex) const
double interpretSpeed(const std::string &key, std::string value)
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.
~NodesHandler() override
Destructor.
int getDuplicateNodes() const
void myStartElement(int element, const SUMOSAXAttributes &attrs) override
Called on the opening of a tag;.
NodesHandler(std::map< long long int, NIOSMNode * > &toFill, std::set< NIOSMNode *, CompareNodes > &uniqueNodes, const OptionsCont &cont)
Constructor.
void myEndElement(int element) override
Called when a closing tag occurs.
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.
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;.
~RelationHandler() override
Destructor.
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.
bool checkEdgeRef(long long int ref) const
check whether a referenced way has a corresponding edge
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
Importer for networks stored in OpenStreetMap format.
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
int myPlacementSkippedNonExplicitOneWay
number of placement skips due to non-explicit oneway
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
int myPlacementSkippedAuxOppositeDirection
number of placement skips due to generated opposite-direction auxiliary edges
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)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
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.
void move2side(double amount, double maxExtension=100)
move position vector to side using certain amount
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.
SAX-handler base for SUMO-files.
static StringBijection< TrafficLightType > TrafficLightTypes
traffic light types
T get(const std::string &str) const
get key
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 bool isBool(const std::string &sData)
check if the given value can be converted to bool
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.
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.
bool tlsControlled
Whether this is a tls controlled junction.
double ptStopLength
The length of the pt stop.
bool ptStopPosition
Whether this is a public transport stop position.
std::string name
The name of the node.
bool railwayCrossing
Whether this is a railway crossing.
double ele
The elevation of this node.
bool railwayBufferStop
Whether this is a railway buffer stop.
const double lon
The longitude the node is located at.
const double lat
The latitude the node is located at.
bool railwaySignal
Whether this is a railway (main) signal.
WayType myRailDirection
Information about the direction(s) of railway usage.