Merge pull request #373 from lonvia/access-control

Extended access tag configuration
This commit is contained in:
Project OSRM 2012-08-21 07:34:25 -07:00
commit ac1925d4b9
8 changed files with 73 additions and 18 deletions

View File

@ -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;

View File

@ -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> {

View File

@ -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() );
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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