diff --git a/src/ol/interaction/draw.js b/src/ol/interaction/draw.js index 38030c194d..6e596eaa64 100644 --- a/src/ol/interaction/draw.js +++ b/src/ol/interaction/draw.js @@ -168,7 +168,12 @@ ol.interaction.Draw = function(options) { var geometry = opt_geometry; if (geometry) { if (mode === ol.interaction.Draw.Mode_.POLYGON) { - geometry.setCoordinates([coordinates[0].concat([coordinates[0][0]])]); + if (coordinates[0].length) { + // Add a closing coordinate to match the first + geometry.setCoordinates([coordinates[0].concat([coordinates[0][0]])]); + } else { + geometry.setCoordinates([]); + } } else { geometry.setCoordinates(coordinates); } diff --git a/test/spec/ol/interaction/draw.test.js b/test/spec/ol/interaction/draw.test.js index 19856aa878..f47aaa9dea 100644 --- a/test/spec/ol/interaction/draw.test.js +++ b/test/spec/ol/interaction/draw.test.js @@ -585,6 +585,29 @@ describe('ol.interaction.Draw', function() { expect(source.getFeatures()).to.have.length(0); }); + it('will tolerate removeLastPoint being called when no coordinates', function() { + + // first point + simulateEvent('pointermove', 10, 20); + simulateEvent('pointerdown', 10, 20); + simulateEvent('pointerup', 10, 20); + + // second point + simulateEvent('pointermove', 40, 30); + simulateEvent('pointerdown', 40, 30); + simulateEvent('pointerup', 40, 30); + + simulateEvent('pointermove', 100, 100); + + expect(function() { + draw.removeLastPoint(); + draw.removeLastPoint(); + draw.removeLastPoint(); + }).to.not.throwException(); + + }); + + it('draws polygon with clicks, finishing on last point', function() { // first point simulateEvent('pointermove', 10, 20);