diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c2e035dc8..c709a75e91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,12 +42,15 @@ _Breaking developer changes, which may affect downstream projects or sites that #### :camera: Street-Level #### :white_check_mark: Validation #### :bug: Bugfixes +* Prevent degenerate ways caused by deleting a corner of a triangle ([#10003], thanks [@k-yle]) #### :earth_asia: Localization #### :hourglass: Performance #### :mortar_board: Walkthrough / Help #### :rocket: Presets #### :hammer: Development +[#10003]: https://github.com/openstreetmap/iD/pull/10003 + # 2.31.0 ##### 2025-Feb-05 diff --git a/modules/osm/way.js b/modules/osm/way.js index 281639d4d0..a8531e1fc1 100644 --- a/modules/osm/way.js +++ b/modules/osm/way.js @@ -242,7 +242,7 @@ Object.assign(osmWay.prototype, { isDegenerate: function() { - return (new Set(this.nodes).size < (this.isArea() ? 3 : 2)); + return (new Set(this.nodes).size < (this.isClosed() ? 3 : 2)); }, diff --git a/test/spec/actions/circularize.js b/test/spec/actions/circularize.js index c6c0f9813e..dbdfde5351 100644 --- a/test/spec/actions/circularize.js +++ b/test/spec/actions/circularize.js @@ -278,10 +278,11 @@ describe('iD.actionCircularize', function () { var graph = iD.coreGraph([ iD.osmNode({id: 'a', loc: [0, 0]}), iD.osmNode({id: 'b', loc: [0, 2]}), - iD.osmWay({id: '-', nodes: ['a', 'b', 'a']}) + iD.osmNode({id: 'c', loc: [2, 0]}), + iD.osmWay({id: '-', nodes: ['a', 'b', 'c', 'a']}) ]); - expect(area('-', graph)).to.eql(0); + expect(area('-', graph)).to.eql(2); graph = iD.actionCircularize('-', projection)(graph); diff --git a/test/spec/osm/way.js b/test/spec/osm/way.js index eb43f9deb4..89dc0bd30b 100644 --- a/test/spec/osm/way.js +++ b/test/spec/osm/way.js @@ -473,6 +473,10 @@ describe('iD.osmWay', function() { expect(iD.osmWay({nodes: ['a', 'b']}).isDegenerate()).to.equal(false); }); + it('returns true for a linear way that doubles back on itself', function () { + expect(iD.osmWay({nodes: ['a', 'b', 'a']}).isDegenerate()).to.equal(true); + }); + it('returns true for an area with zero, one, or two unique nodes', function () { expect(iD.osmWay({tags: {area: 'yes'}, nodes: []}).isDegenerate()).to.equal(true); expect(iD.osmWay({tags: {area: 'yes'}, nodes: ['a', 'a']}).isDegenerate()).to.equal(true);