diff --git a/src/ol/format/feature.js b/src/ol/format/feature.js index d4d88c131f..5887dcc106 100644 --- a/src/ol/format/feature.js +++ b/src/ol/format/feature.js @@ -183,14 +183,14 @@ ol.format.Feature.transformWithOptions = function( // FIXME this is necessary because ol.format.GML treats extents // as geometries transformed = ol.proj.transformExtent( - write ? geometry.slice() : geometry, - write ? featureProjection : dataProjection, - write ? dataProjection : featureProjection); + geometry, + dataProjection, + featureProjection); } } else { transformed = geometry; } - if (write && opt_options && opt_options.decimals) { + if (write && opt_options && opt_options.decimals !== undefined) { var power = Math.pow(10, opt_options.decimals); // if decimals option on write, round each coordinate appropriately /** @@ -203,11 +203,10 @@ ol.format.Feature.transformWithOptions = function( } return coordinates; }; - if (Array.isArray(transformed)) { - transform(transformed); - } else { - transformed.applyTransform(transform); + if (transformed === geometry) { + transformed = transformed.clone(); } + transformed.applyTransform(transform); } return transformed; }; diff --git a/test/spec/ol/format/geojson.test.js b/test/spec/ol/format/geojson.test.js index f291c2ef5f..a6b20bc652 100644 --- a/test/spec/ol/format/geojson.test.js +++ b/test/spec/ol/format/geojson.test.js @@ -826,6 +826,20 @@ describe('ol.format.GeoJSON', function() { }); expect(format.readGeometry(geojson).getCoordinates()).to.eql( [[42.123457, 38.987654], [43, 39]]); + expect(linestring.getCoordinates()).to.eql( + [[42.123456789, 38.987654321], [43, 39]]); + }); + + it('rounds a linestring with decimals option = 0', function() { + var linestring = new ol.geom.LineString([[42.123456789, 38.987654321], + [43, 39]]); + var geojson = format.writeGeometry(linestring, { + decimals: 0 + }); + expect(format.readGeometry(geojson).getCoordinates()).to.eql( + [[42, 39], [43, 39]]); + expect(linestring.getCoordinates()).to.eql( + [[42.123456789, 38.987654321], [43, 39]]); }); });