Include multipolygon members in complete()

(closes #3613)
This commit is contained in:
Bryan Housel
2019-05-08 00:49:33 -04:00
parent 79149ffad2
commit b0d5f0dd48
2 changed files with 30 additions and 2 deletions

View File

@@ -1,7 +1,7 @@
import deepEqual from 'fast-deep-equal';
import { geoVecEqual } from '../geo';
import { utilArrayDifference } from '../util';
import { utilArrayDifference, utilArrayUnion } from '../util';
/*
@@ -173,6 +173,8 @@ export function coreDifference(base, head) {
};
// returns complete set of entities that require a redraw
// (optionally within given `extent`)
_diff.complete = function complete(extent) {
var result = {};
var id, change;
@@ -183,6 +185,7 @@ export function coreDifference(base, head) {
var h = change.head;
var b = change.base;
var entity = h || b;
var i;
if (extent &&
(!h || !h.intersects(extent, head)) &&
@@ -194,7 +197,7 @@ export function coreDifference(base, head) {
if (entity.type === 'way') {
var nh = h ? h.nodes : [];
var nb = b ? b.nodes : [];
var diff, i;
var diff;
diff = utilArrayDifference(nh, nb);
for (i = 0; i < diff.length; i++) {
@@ -207,6 +210,15 @@ export function coreDifference(base, head) {
}
}
if (entity.type === 'relation' && entity.isMultipolygon()) {
var mh = h ? h.members.map(function(m) { return m.id; }) : [];
var mb = b ? b.members.map(function(m) { return m.id; }) : [];
var ids = utilArrayUnion(mh, mb);
for (i = 0; i < ids.length; i++) {
result[ids[i]] = head.hasEntity(ids[i]);
}
}
addParents(head.parentWays(entity), result);
addParents(head.parentRelations(entity), result);
}

View File

@@ -382,6 +382,22 @@ describe('iD.coreDifference', function () {
expect(diff.complete().n2).to.equal(n2);
});
it('includes multipolygon members', function () {
var w1 = iD.osmWay({id: 'w1'});
var w2 = iD.osmWay({id: 'w2'});
var r1 = iD.osmRelation({
id: 'r',
tags: { type: 'multipolygon' },
members: [{role: 'outer', id: 'w1', type: 'way'}, {role: '', id: 'w2', type: 'way'}]
});
var r2 = r1.updateMember({role: 'inner', id: 'w2', type: 'way'}, 1);
var base = iD.coreGraph([w1, w2, r1]);
var head = base.replace(r2);
var diff = iD.coreDifference(base, head);
expect(diff.complete().w2).to.equal(w2);
});
it('includes parent ways of modified nodes', function () {
var n1 = iD.osmNode({id: 'n'});
var n2 = n1.move([1, 2]);