Handle incomplete relations

This commit is contained in:
John Firebaugh
2013-01-17 17:20:22 -08:00
parent d40c645170
commit bf251dce15
2 changed files with 29 additions and 6 deletions
+8 -6
View File
@@ -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) {
+21
View File
@@ -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]]]);
});
});
});