From bf95149e9cd6aac2abfb97269ecc209b3b202088 Mon Sep 17 00:00:00 2001 From: Dmitry Shirokov Date: Mon, 5 Jan 2026 11:00:51 +1100 Subject: [PATCH] fix: precision for 3d points --- src/dataset/mapshaper-layer-utils.mjs | 5 ++++- src/geom/mapshaper-rounding.mjs | 6 ++++-- test/geojson-test.mjs | 14 +++++++++++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/dataset/mapshaper-layer-utils.mjs b/src/dataset/mapshaper-layer-utils.mjs index 24b2b6e7f..817cd2b1d 100644 --- a/src/dataset/mapshaper-layer-utils.mjs +++ b/src/dataset/mapshaper-layer-utils.mjs @@ -86,9 +86,12 @@ export function deleteFeatureById(lyr, i) { export function transformPointsInLayer(lyr, f) { if (layerHasPoints(lyr)) { forEachPoint(lyr.shapes, function(p) { - var p2 = f(p[0], p[1]); + var p2 = f(p[0], p[1], p[2]); p[0] = p2[0]; p[1] = p2[1]; + if (p[2] !== undefined) { + p[2] = p2[2]; + } }); } } diff --git a/src/geom/mapshaper-rounding.mjs b/src/geom/mapshaper-rounding.mjs index 1f96f5b51..eca257d84 100644 --- a/src/geom/mapshaper-rounding.mjs +++ b/src/geom/mapshaper-rounding.mjs @@ -100,8 +100,10 @@ export const fround = Math.fround || fround2; export function setCoordinatePrecision(dataset, precision, fixGeom) { var round = getRoundingFunction(precision); var repairArcs = dataset.arcs && fixGeom ? getRepairFunction(dataset.arcs) : null; - transformPoints(dataset, function(x, y) { - return [round(x), round(y)]; + transformPoints(dataset, function(x, y, z) { + return (z !== undefined) + ? [round(x), round(y), round(z)] + : [round(x), round(y)]; }); if (repairArcs) { repairArcs(dataset.arcs); diff --git a/test/geojson-test.mjs b/test/geojson-test.mjs index 40c5e7ca9..cdb93a14f 100644 --- a/test/geojson-test.mjs +++ b/test/geojson-test.mjs @@ -425,7 +425,19 @@ describe('mapshaper-geojson.js', function () { var output = await api.applyCommands(cmd, {'point.json': input}); var json = JSON.parse(output['point.json']) var coords = json.geometries[0].coordinates; - assert.deepEqual(coords, [[4,4],[0.123457,-9.876543]]); + assert.deepEqual(coords, [[4, 4],[0.123457, -9.876543]]); + }); + + it('set coordinate precision to 6 decimals - with 3d points', async function() { + var input = { + type: 'MultiPoint', + coordinates: [[4.000000000000001, 3.999999999999, 5.0000000000001], [0.123456789,-9.87654321, 0.5678901234]] + }; + var cmd = '-i point.json -o precision=0.000001'; + var output = await api.applyCommands(cmd, {'point.json': input}); + var json = JSON.parse(output['point.json']) + var coords = json.geometries[0].coordinates; + assert.deepStrictEqual(coords, [[4, 4, 5],[0.123457, -9.876543, 0.56789]]); }); });