Merge pull request #373 from lonvia/access-control
Extended access tag configuration
This commit is contained in:
commit
ac1925d4b9
@ -148,12 +148,9 @@ public:
|
||||
std::string junction( w.keyVals.Find("junction") );
|
||||
std::string route( w.keyVals.Find("route") );
|
||||
int maxspeed( parseMaxspeed(w.keyVals.Find("maxspeed")) );
|
||||
std::string access( w.keyVals.Find("access") );
|
||||
std::string accessTag( w.keyVals.Find(settings.accessTag) );
|
||||
std::string man_made( w.keyVals.Find("man_made") );
|
||||
std::string barrier( w.keyVals.Find("barrier") );
|
||||
std::string oneway( w.keyVals.Find("oneway"));
|
||||
std::string onewayClass( w.keyVals.Find("oneway:"+settings.accessTag));
|
||||
std::string cycleway( w.keyVals.Find("cycleway"));
|
||||
std::string duration ( w.keyVals.Find("duration"));
|
||||
std::string service (w.keyVals.Find("service"));
|
||||
@ -191,8 +188,28 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
//determine the access value
|
||||
std::string access;
|
||||
std::string onewayClass;
|
||||
std::string accessTag;
|
||||
BOOST_FOREACH(std::string & s, settings.accessTags) {
|
||||
access = std::string(w.keyVals.Find(s));
|
||||
if(0 < access.size()) {
|
||||
accessTag = s;
|
||||
onewayClass = std::string(w.keyVals.Find("oneway:"+access));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(0 < access.size()) {
|
||||
// handle ways with default access = no
|
||||
if(settings.accessForbiddenDefault.find(access) != settings.accessForbiddenDefault.end()) {
|
||||
access = std::string("no");
|
||||
}
|
||||
}
|
||||
|
||||
//Is the highway tag listed as usable way?
|
||||
if(("track" == highway && ("yes" == access || "yes" == accessTag)) || ("track" != highway && (0 < settings[highway] || "yes" == accessTag || "designated" == accessTag) )) {
|
||||
if(0 < settings[highway] || "yes" == access || "designated" == access) {
|
||||
if(!w.isDurationSet) {
|
||||
if(0 < settings[highway]) {
|
||||
if(0 < maxspeed)
|
||||
@ -217,7 +234,7 @@ public:
|
||||
//Okay, do we have access to that way?
|
||||
if(0 < access.size()) { //fastest way to check for non-empty string
|
||||
//If access is forbidden, we don't want to route there.
|
||||
if(access == "no" || access == "agricultural" || access == "forestry" || access == "delivery") { //Todo: this is still hard coded
|
||||
if(settings.accessForbiddenKeys.find(access) != settings.accessForbiddenKeys.end()) {
|
||||
w.access = false;
|
||||
}
|
||||
if(settings.accessRestrictionKeys.find(access) != settings.accessRestrictionKeys.end()) {
|
||||
@ -231,7 +248,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
if("no" == accessTag) {
|
||||
if("no" == access) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -244,7 +261,7 @@ public:
|
||||
w.direction = _Way::opposite;
|
||||
} else if( oneway == "no" || oneway == "0" || oneway == "false" ) {
|
||||
w.direction = _Way::bidirectional;
|
||||
} else if( settings.accessTag == "bicycle" && (cycleway == "opposite" || cycleway == "opposite_track" || cycleway == "opposite_lane") ) {
|
||||
} else if( accessTag == "bicycle" && (cycleway == "opposite" || cycleway == "opposite_track" || cycleway == "opposite_lane") ) {
|
||||
w.direction = _Way::bidirectional;
|
||||
} else if( oneway == "-1") {
|
||||
w.direction = _Way::opposite;
|
||||
|
@ -270,7 +270,7 @@ struct CmpWayByID : public std::binary_function<_WayIDStartAndEndEdge, _WayIDSta
|
||||
};
|
||||
|
||||
struct Settings {
|
||||
Settings() : obeyBollards(true), obeyOneways(true), useRestrictions(true), ignoreAreas(false), accessTag("motorcar"), defaultSpeed(30), takeMinimumOfSpeeds(false), excludeFromGrid("ferry") {}
|
||||
Settings() : obeyBollards(true), obeyOneways(true), useRestrictions(true), ignoreAreas(false), defaultSpeed(30), takeMinimumOfSpeeds(false), excludeFromGrid("ferry") {}
|
||||
StringToIntPairMap speedProfile;
|
||||
int operator[](const std::string & param) const {
|
||||
if(speedProfile.find(param) == speedProfile.end())
|
||||
@ -294,12 +294,14 @@ struct Settings {
|
||||
bool obeyOneways;
|
||||
bool useRestrictions;
|
||||
bool ignoreAreas;
|
||||
std::string accessTag;
|
||||
std::vector<std::string> accessTags;
|
||||
int defaultSpeed;
|
||||
bool takeMinimumOfSpeeds;
|
||||
std::string excludeFromGrid;
|
||||
boost::unordered_map<std::string, bool> accessRestrictedService;
|
||||
boost::unordered_map<std::string, bool> accessRestrictionKeys;
|
||||
boost::unordered_map<std::string, bool> accessForbiddenKeys;
|
||||
boost::unordered_map<std::string, bool> accessForbiddenDefault;
|
||||
};
|
||||
|
||||
struct Cmp : public std::binary_function<NodeID, NodeID, bool> {
|
||||
|
@ -137,8 +137,10 @@ int main (int argc, char *argv[]) {
|
||||
} else if(name == "useRestrictions") {
|
||||
if(value == "no")
|
||||
settings.useRestrictions = false;
|
||||
} else if(name == "accessTag") {
|
||||
settings.accessTag = value;
|
||||
} else if(name == "accessTags") {
|
||||
std::vector<std::string> tokens;
|
||||
stringSplit(value, ',', tokens);
|
||||
settings.accessTags = tokens;
|
||||
} else if(name == "excludeFromGrid") {
|
||||
settings.excludeFromGrid = value;
|
||||
} else if(name == "defaultSpeed") {
|
||||
@ -166,6 +168,24 @@ int main (int argc, char *argv[]) {
|
||||
INFO("adding " << s << " to accessRestrictionKeys");
|
||||
settings.accessRestrictionKeys.insert(std::make_pair(s, true));
|
||||
}
|
||||
} else if( name == "accessForbiddenKeys") {
|
||||
//split value at commas
|
||||
std::vector<std::string> tokens;
|
||||
stringSplit(value, ',', tokens);
|
||||
//put each value into map
|
||||
BOOST_FOREACH(std::string & s, tokens) {
|
||||
INFO("adding " << s << " to accessForbiddenKeys");
|
||||
settings.accessForbiddenKeys.insert(std::make_pair(s, true));
|
||||
}
|
||||
} else if( name == "accessForbiddenDefault") {
|
||||
//split value at commas
|
||||
std::vector<std::string> tokens;
|
||||
stringSplit(value, ',', tokens);
|
||||
//put each value into map
|
||||
BOOST_FOREACH(std::string & s, tokens) {
|
||||
INFO("adding " << s << " to accessForbiddenDefault");
|
||||
settings.accessForbiddenDefault.insert(std::make_pair(s, true));
|
||||
}
|
||||
}
|
||||
settings.speedProfile[name] = std::make_pair(std::atoi(value.c_str()), settings.speedProfile.size() );
|
||||
}
|
||||
|
@ -20,7 +20,7 @@
|
||||
obeyOneways = yes
|
||||
useRestrictions = yes
|
||||
ignoreAreas = yes
|
||||
accessTag = motorcar
|
||||
accessTags = motorcar,motor_vehicle,vehicle,access
|
||||
excludeFromGrid = ferry
|
||||
defaultSpeed = 50
|
||||
trafficSignalPenalty = 5
|
||||
@ -28,6 +28,8 @@
|
||||
uturnPenalty = 20
|
||||
accessRestrictedService = parking_aisle
|
||||
accessRestrictionKeys = destination,private,delivery
|
||||
accessForbiddenKeys = no,private,agricultural,forestery
|
||||
accessForbiddenDefault = track
|
||||
[bike]
|
||||
trunk = 16
|
||||
trunk_link = 16
|
||||
@ -48,10 +50,12 @@
|
||||
pier = 5
|
||||
obeyOneways = yes
|
||||
useRestrictions = no
|
||||
accessTag = bicycle
|
||||
accessTags = bicycle,vehicle,access
|
||||
excludeFromGrid = ferry
|
||||
defaultSpeed = 5
|
||||
trafficSignalPenalty = 5
|
||||
obeyBollards = no
|
||||
takeMinimumOfSpeeds = yes
|
||||
uturnPenalty = 20
|
||||
accessRestrictionKeys = destination,private,delivery
|
||||
accessForbiddenKeys = no,private,agricultural,forestery
|
||||
|
@ -1,5 +1,5 @@
|
||||
[bicycle]
|
||||
accessTag = bicycle
|
||||
accessTags = bicycle,vehicle,access
|
||||
defaultSpeed = 17
|
||||
obeyOneways = yes
|
||||
useRestrictions = yes
|
||||
@ -25,4 +25,7 @@
|
||||
ferry = 5
|
||||
|
||||
excludeFromGrid = ferry
|
||||
trafficSignalPenalty = 10
|
||||
trafficSignalPenalty = 10
|
||||
|
||||
accessRestrictionKeys = destination,private,delivery
|
||||
accessForbiddenKeys = no,private,agricultural,forestery
|
||||
|
@ -1,5 +1,5 @@
|
||||
[car]
|
||||
accessTag = motorcar
|
||||
accessTag = motorcar,motor_vehicle,vehicle,access
|
||||
defaultSpeed = 50
|
||||
obeyOneways = yes
|
||||
useRestrictions = yes
|
||||
@ -21,3 +21,6 @@
|
||||
service = 20
|
||||
living_street = 10
|
||||
|
||||
accessRestrictionKeys = destination,private,delivery
|
||||
accessForbiddenKeys = no,private,agricultural,forestery
|
||||
accessForbiddenDefault = track
|
||||
|
@ -1,5 +1,5 @@
|
||||
[ebike]
|
||||
accessTag = bicycle
|
||||
accessTags = bicycle,vehicle,access
|
||||
obeyOneways = yes
|
||||
defaultSpeed = 25
|
||||
useRestrictions = no
|
||||
@ -24,3 +24,6 @@ footway = 5
|
||||
ferry = 5
|
||||
|
||||
excludeFromGrid = ferry
|
||||
|
||||
accessRestrictionKeys = destination,private,delivery
|
||||
accessForbiddenKeys = no,private,agricultural,forestery
|
||||
|
@ -1,5 +1,5 @@
|
||||
[foot]
|
||||
accessTag = foot
|
||||
accessTags = foot,access
|
||||
defaultSpeed = 5
|
||||
obeyOneways = no
|
||||
useRestrictions = no
|
||||
@ -26,3 +26,6 @@
|
||||
ferry = 5
|
||||
|
||||
excludeFromGrid = ferry
|
||||
|
||||
accessRestrictionKeys = destination,private,delivery
|
||||
accessForbiddenKeys = no,private,agricultural,forestery
|
||||
|
Loading…
Reference in New Issue
Block a user