add psv, hov, hgv , bicycle lanes

This commit is contained in:
Kushan Joshi
2016-08-21 02:34:47 +05:30
parent 856f6618d9
commit 9f76267152
2 changed files with 114 additions and 49 deletions
+72 -43
View File
@@ -103,25 +103,6 @@ _.extend(Way.prototype, {
lanes: function() {
function parsePipeString(key, n) {
var str = tags[key];
if (!str) return;
var array = str.split('|')
.filter(function(s, i) {
return i < n;
})
.map(function(s) {
if (s === '') s = 'none';
return s.split(';');
});
while (array.length < n) {
array.push(['none']);
}
return array;
}
function parseTurnLanes(key, n){
var validValues = [
'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
@@ -170,6 +151,12 @@ _.extend(Way.prototype, {
return parsedArray;
}
function parseVehicleLanes(key, n) {
var str = tags[key];
if (!str) return;
var parsedArray
}
function parseLaneDirections() {
var forward = parseInt(tags['lanes:forward']);
var backward = parseInt(tags['lanes:backward']);
@@ -208,19 +195,32 @@ _.extend(Way.prototype, {
};
}
// smartly fills the undefined array.key elements with values
function smartFill(array, key, values) {
if (!array) return;
// keeps track of elements filled with 'value'
var counter = 0;
array.forEach(function(o) {
if (!o || counter === values.length) return;
function parseMiscLanes(key) {
var validValues = [
'yes', 'no', 'designated'
];
var str = tags[key];
if (!str) return;
var parsedArray = str.split('|')
.map(function (s) {
if (s === '') s = 'no';
return validValues.indexOf(s) === -1 ? 'unknown': s;
});
return parsedArray;
}
if (o[key] === undefined) {
o[key] = values[counter];
counter++;
}
});
function parsebicycleWay(key) {
var validValues = [
'yes', 'no', 'designated', 'lane'
];
var str = tags[key];
if (!str) return;
var parsedArray = str.split('|')
.map(function (s) {
if (s === '') s = 'no';
return validValues.indexOf(s) === -1 ? 'unknown': s;
});
return parsedArray;
}
function getLaneCount() {
@@ -245,11 +245,7 @@ _.extend(Way.prototype, {
var tags = this.tags;
var oneway = this.isOneWay();
var laneCount = getLaneCount();
var lanesArray = [];
for (var i = 0; i < laneCount; i++) {
lanesArray.push({ index: i});
}
var maxspeed = parseMaxspeed();
var laneDirections = parseLaneDirections();
var forward = laneDirections.forward;
@@ -257,15 +253,45 @@ _.extend(Way.prototype, {
var bothways = laneDirections.bothways;
// parse the piped string 'x|y|z' format
var turnLanes = parseTurnLanes('turn:lanes', laneCount);
var turnLanesForward = parseTurnLanes('turn:lanes:forward', forward);
var turnLanesBackward = parseTurnLanes('turn:lanes:backward', backward);
var turnLanes = {};
turnLanes.unspecified = parseTurnLanes('turn:lanes', laneCount);
turnLanes.forward = parseTurnLanes('turn:lanes:forward', forward);
turnLanes.backward = parseTurnLanes('turn:lanes:backward', backward);
var maxspeed = parseMaxspeed();
var maxspeedLanes = parseMaxspeedLanes('maxspeed:lanes', laneCount);
var maxspeedLanesForward = parseMaxspeedLanes('maxspeed:lanes:forward', forward);
var maxspeedLanesBackward = parseMaxspeedLanes('maxspeed:lanes:backward', backward);
var maxspeedLanes = {};
maxspeedLanes.unspecified = parseMaxspeedLanes('maxspeed:lanes', laneCount);
maxspeedLanes.forward = parseMaxspeedLanes('maxspeed:lanes:forward', forward);
maxspeedLanes.backward = parseMaxspeedLanes('maxspeed:lanes:backward', backward);
var psvLanes = {};
psvLanes.unspecified = parseMiscLanes('psv:lanes');
psvLanes.forward = parseMiscLanes('psv:lanes:forward');
psvLanes.backward = parseMiscLanes('psv:lanes:backward');
var busLanes = {};
busLanes.unspecified = parseMiscLanes('bus:lanes');
busLanes.forward = parseMiscLanes('bus:lanes:forward');
busLanes.backward = parseMiscLanes('bus:lanes:backward');
var taxiLanes = {};
taxiLanes.unspecified = parseMiscLanes('taxi:lanes');
taxiLanes.forward = parseMiscLanes('taxi:lanes:forward');
taxiLanes.backward = parseMiscLanes('taxi:lanes:backward');
var hovLanes = {};
hovLanes.unspecified = parseMiscLanes('hov:lanes');
hovLanes.forward = parseMiscLanes('hov:lanes:forward');
hovLanes.backward = parseMiscLanes('hov:lanes:backward');
var hgvLanes = {};
hgvLanes.unspecified = parseMiscLanes('hgv:lanes');
hgvLanes.forward = parseMiscLanes('hgv:lanes:forward');
hgvLanes.backward = parseMiscLanes('hgv:lanes:backward');
var bicyclewayLanes = {};
bicyclewayLanes.unspecified = parsebicycleWay('bicycleway:lanes');
bicyclewayLanes.forward = parsebicycleWay('bicycleway:lanes:forward');
bicyclewayLanes.backward = parsebicycleWay('bicycleway:lanes:backward');
// fill each undefined lanesArray's direction element with 'forward/bothways/backward'.
smartFill(lanesArray, 'direction', _.fill(Array(forward), 'forward'));
@@ -308,6 +334,9 @@ _.extend(Way.prototype, {
maxspeedLanes: maxspeedLanes,
maxspeedLanesForward: maxspeedLanesForward,
maxspeedLanesBackward: maxspeedLanesBackward,
vehicleLanes: vehicleLanes,
vehicleLanesForward: vehicleLanesForward,
vehicleLanesBackward: vehicleLanesBackward
},
lanes: lanesArray
};
+42 -6
View File
@@ -554,7 +554,7 @@ describe('iD.Way', function() {
});
});
describe('iD.Lanes', function() {
describe.only('iD.Lanes', function() {
describe('default lane tags', function() {
@@ -956,7 +956,7 @@ describe('iD.Way', function() {
bothways: 0
});
});
});
describe('lanes array', function() {
@@ -1107,23 +1107,59 @@ describe('iD.Way', function() {
]);
});
it('fills with [\'none\'] when given turn:lanes are less than lanes count', function() {
it('returns unknown for every invalid value in turn:lanes', function() {
var metadata = iD.Way({
tags: {
highway: 'tertiary',
lanes: 3,
oneway: 'yes',
'turn:lanes': '||straight;NO_LEFT',
}
}).lanes().metadata;
expect(metadata.turnLanes)
.to.deep.equal([
['none'], ['none'], ['unknown', 'unknown']
]);
});
it('returns unknown for every invalid value in turn:lanes:forward & turn:lanes:backward', function() {
var metadata = iD.Way({
tags: {
highway: 'residential',
lanes: 5,
'lanes:forward': 1,
'lanes:both_ways': 1,
'turn:lanes:forward': 'sligh_left',
'turn:lanes:backward': 'none|through|though;slight_right',
}
}).lanes().metadata;
expect(metadata.turnLanesForward)
.to.deep.equal([
['unknown']
]);
expect(metadata.turnLanesBackward)
.to.deep.equal([
['none'], ['through'], ['unknown', 'slight_right']
]);
});
it('fills with [\'unknown\'] when given turn:lanes are less than lanes count', function() {
var metadata = iD.Way({
tags: {
highway: 'tertiary',
lanes: 5,
oneway: 'yes',
'turn:lanes': 'slight_left',
'turn:lanes': 'slight_left|',
}
}).lanes().metadata;
expect(metadata.turnLanes)
.to.deep.equal([
['slight_left'], ['unknown'], ['unknown'], ['unknown'], ['unknown']
['slight_left'], ['none'], ['unknown'], ['unknown'], ['unknown']
]);
});
it('fills with [\'none\'] when given turn:lanes:forward are less than lanes forward count', function() {
it('fills with [\'unknown\'] when given turn:lanes:forward are less than lanes forward count', function() {
var metadata = iD.Way({
tags: {
highway: 'tertiary',