Reverse cardinal directions for relation member roles

This commit is contained in:
Martijn van Exel
2013-11-21 10:58:29 -07:00
committed by John Firebaugh
parent 6c3a3190fd
commit c43d915625
2 changed files with 39 additions and 4 deletions

View File

@@ -14,6 +14,8 @@
Relation members:
role=forward ⟺ role=backward
role=north ⟺ role=south
role=east ⟺ role=west
In addition, numeric-valued `incline` tags are negated.
@@ -29,9 +31,18 @@
*/
iD.actions.Reverse = function(wayId) {
var replacements = [
[/:right$/, ':left'], [/:left$/, ':right'],
[/:forward$/, ':backward'], [/:backward$/, ':forward']
], numeric = /^([+\-]?)(?=[\d.])/;
[/:right$/, ':left'], [/:left$/, ':right'],
[/:forward$/, ':backward'], [/:backward$/, ':forward']
],
numeric = /^([+\-]?)(?=[\d.])/,
roleReversals = {
forward: 'backward',
backward: 'forward',
north: 'south',
south: 'north',
east: 'west',
west: 'east'
};
function reverseKey(key) {
for (var i = 0; i < replacements.length; ++i) {
@@ -64,7 +75,7 @@ iD.actions.Reverse = function(wayId) {
graph.parentRelations(way).forEach(function(relation) {
relation.members.forEach(function(member, index) {
if (member.id === way.id && (role = {forward: 'backward', backward: 'forward'}[member.role])) {
if (member.id === way.id && (role = roleReversals[member.role])) {
relation = relation.updateMember({role: role}, index);
graph = graph.replace(relation);
}

View File

@@ -114,4 +114,28 @@ describe("iD.actions.Reverse", function () {
graph = iD.actions.Reverse(way.id)(graph);
expect(graph.entity(relation.id).members[0].role).to.eql('forward');
});
it("transforms role=north ⟺ role=south in member relations", function () {
var way = iD.Way({tags: {highway: 'residential'}}),
relation = iD.Relation({members: [{type: 'way', id: way.id, role: 'north'}]}),
graph = iD.Graph([way, relation]);
graph = iD.actions.Reverse(way.id)(graph);
expect(graph.entity(relation.id).members[0].role).to.eql('south');
graph = iD.actions.Reverse(way.id)(graph);
expect(graph.entity(relation.id).members[0].role).to.eql('north');
});
it("transforms role=east ⟺ role=west in member relations", function () {
var way = iD.Way({tags: {highway: 'residential'}}),
relation = iD.Relation({members: [{type: 'way', id: way.id, role: 'east'}]}),
graph = iD.Graph([way, relation]);
graph = iD.actions.Reverse(way.id)(graph);
expect(graph.entity(relation.id).members[0].role).to.eql('west');
graph = iD.actions.Reverse(way.id)(graph);
expect(graph.entity(relation.id).members[0].role).to.eql('east');
});
});