# HG changeset patch # User Thomas Junk # Date 1537367823 -7200 # Node ID 3605af94d1ee293457a6a6c2016d381b06f29449 # Parent bd215c4325ce6cc2d422926fd2b00d487942c2f8 fix: prepare profile calculation algorithm fixed The x-value of a point is determined according to its reference point * in case of the first segment, it is the first element of the line string * in case of consecutive segments it is the last point of the previous segment diff -r bd215c4325ce -r 3605af94d1ee client/src/application/lib/geo.js --- a/client/src/application/lib/geo.js Wed Sep 19 16:09:09 2018 +0200 +++ b/client/src/application/lib/geo.js Wed Sep 19 16:37:03 2018 +0200 @@ -61,6 +61,11 @@ * c) calculating the total length of the given profile * d) transposes the datapoints given to the first point of the first section * + * The calculation of total equals the sum of partial distances between points + * The x-value of a point is determined according to its reference point + * in case of the first segment, it is the first element of the line string + * in case of consecutive segments it is the last point of the previous segment + * * @param {object} feature */ const transform = feature => { @@ -73,8 +78,9 @@ for (let section of sections) { let sectionCoordinates = []; let previousPoint = generatePoint(section[0]); + let currentPoint = null; for (let coords of section) { - const currentPoint = generatePoint(coords); + currentPoint = generatePoint(coords); let x = distanceBetween(firstPoint, currentPoint); let y = coords[2]; sectionCoordinates.push({ @@ -87,6 +93,7 @@ if (y > maxAlt) maxAlt = y; } coordinates.push(sectionCoordinates); + firstPoint = currentPoint; } return { coordinates, totalLength, minAlt, maxAlt }; }; diff -r bd215c4325ce -r 3605af94d1ee client/tests/unit/geo/geo.spec.js --- a/client/tests/unit/geo/geo.spec.js Wed Sep 19 16:09:09 2018 +0200 +++ b/client/tests/unit/geo/geo.spec.js Wed Sep 19 16:37:03 2018 +0200 @@ -330,9 +330,20 @@ o = o.concat(y); return o; }, []); + const growing = values => { + let first = values[0].x; + for (let v of values) { + if (first > v.x) return false; + } + return true; + }; const minAlt = Math.min(...alts); const maxAlt = Math.max(...alts); expect(result.points.length).toBe(3); + expect(growing(result.points[0])).toBe(true); + expect(growing(result.points[1])).toBe(true); + expect(growing([...result.points[0], ...result.points[1]])).toBe(true); + expect(growing([...result.points[1], ...result.points[2]])).toBe(false); // because of corrupt testdata expect(result.totalLength).toBe(160.06814078495722); expect(result.minAlt).toBe(minAlt); expect(result.maxAlt).toBe(maxAlt);