From bf251dce150e6376a5768241d99044799fd654fb Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 17 Jan 2013 17:20:22 -0800 Subject: [PATCH] Handle incomplete relations --- js/id/graph/relation.js | 14 ++++++++------ test/spec/graph/relation.js | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/js/id/graph/relation.js b/js/id/graph/relation.js index 490b98ac7..7d8a9aa89 100644 --- a/js/id/graph/relation.js +++ b/js/id/graph/relation.js @@ -4,11 +4,13 @@ iD.Relation = iD.Entity.extend({ extent: function(resolver) { return resolver.transient(this, 'extent', function() { - var extent = iD.geo.Extent(); - for (var i = 0, l = this.members.length; i < l; i++) { - extent = extent.extend(resolver.entity(this.members[i].id).extent(resolver)); - } - return extent; + return this.members.reduce(function (extent, member) { + if (member = resolver.entity(member.id)) { + return extent.extend(member.extent(resolver)) + } else { + return extent; + } + }, iD.geo.Extent()); }); }, @@ -28,7 +30,7 @@ iD.Relation = iD.Entity.extend({ // multipolygon: function(resolver) { var members = this.members - .filter(function (m) { return m.type === 'way'; }) + .filter(function (m) { return m.type === 'way' && resolver.entity(m.id); }) .map(function (m) { return { role: m.role || 'outer', id: m.id, nodes: resolver.fetch(m.id).nodes }; }); function join(ways) { diff --git a/test/spec/graph/relation.js b/test/spec/graph/relation.js index 7395521c0..8880fc98c 100644 --- a/test/spec/graph/relation.js +++ b/test/spec/graph/relation.js @@ -44,6 +44,15 @@ describe('iD.Relation', function () { expect(r.extent(graph)).to.eql([[0, 0], [5, 10]]) }); + + it("returns the known extent of incomplete relations", function () { + var a = iD.Node({loc: [0, 0]}), + b = iD.Node({loc: [5, 10]}), + r = iD.Relation({members: [{id: a.id}, {id: b.id}]}), + graph = iD.Graph([a, r]); + + expect(r.extent(graph)).to.eql([[0, 0], [0, 0]]) + }); }); describe("#multipolygon", function () { @@ -239,5 +248,17 @@ describe('iD.Relation', function () { expect(r.multipolygon(graph)).to.eql([[[a, b, c, a], [d, e, f, d]], [[g, h, i, g]]]); }); + + specify("incomplete relation", function () { + var a = iD.Node(), + b = iD.Node(), + c = iD.Node(), + w1 = iD.Way({nodes: [a.id, b.id, c.id]}), + w2 = iD.Way(), + r = iD.Relation({members: [{id: w2.id, type: 'way'}, {id: w1.id, type: 'way'}]}), + g = iD.Graph([a, b, c, w1, r]); + + expect(r.multipolygon(g)).to.eql([[[a, b, c]]]); + }); }); });