changeset 677:3605af94d1ee

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
author Thomas Junk <thomas.junk@intevation.de>
date Wed, 19 Sep 2018 16:37:03 +0200
parents bd215c4325ce
children 899116318d58 89b497d0ee0f
files client/src/application/lib/geo.js client/tests/unit/geo/geo.spec.js
diffstat 2 files changed, 19 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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 };
 };
--- 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);