Repository: GeotrekCE/Geotrek-admin

Issue:
Altitude and profile calculation
On a souvent échangé sur ce sujet et des choses ont été faites mais nous venons de constater à nouveau un calcul assez décalé de la réalite. 

En effet la randonnée LA CABANE DU PRE D'ANTONI (http://rando.ecrins-parcnational.fr/fr/la-cabane-du-pre-dantoni) affiche un dénivelé positif de 870 mêtres.
Pourtant elle part de 1471m et culmine à 1855m soit une différence de 384m.

Et ce dénivelé correspond bien plus à la réalité.

Est-ce l'effet "dent de scie" aussi répercuté dans le profil, qui entraîne ce cumule de mini-dénivelés positifs ?

![profile](https://cloud.githubusercontent.com/assets/4418840/7861910/1fe02ea6-0553-11e5-9a57-aea685a51d36.jpg)

Discuté ici - https://github.com/makinacorpus/Geotrek/issues/776 et normalement réglé avec https://github.com/makinacorpus/Geotrek/issues/840



Discussion:
Ce qui avait été fait lissait les artéfacts entre deux points seulement. Ici comme l'itinéraire est bien long, il faudrait sûrement lisser sur des segments plus longs.. Pour simplifier on pourrait aussi appliquer une interpolation sur la liste complete des altitudes au moment de calculer la valeur de dénivelée http://fr.wikipedia.org/wiki/Moyenne_glissante

Oui je pense que cela serait pertinent pour le calcul des dénivelés mais aussi pour le dessin du profil. 
Pour supprimer les "dents de scie" et obtenir quelque chose de plus lissé un peu comme http://la-trace.com/itineraires/vtt/1020/lac-des-9-couleurs

Ça reste à affiner et à lisser. Car cette rando affiche 2030m de dénivelé : http://rando.ecrins-parcnational.fr/fr/les-lacs-de-crupillouse
Alors qu'elle part de 1350 et culmine à 2650, donc plutôt 1300m de dénivelé.


Resolving patch:
diff --git a/geotrek/settings/base.py b/geotrek/settings/base.py
--- a/geotrek/settings/base.py
+++ b/geotrek/settings/base.py
@@ -412,6 +412,8 @@ def gettext_noop(s):
 PATH_MERGE_SNAPPING_DISTANCE = 2  # minimum distance to merge paths
 
 ALTIMETRIC_PROFILE_PRECISION = 25  # Sampling precision in meters
+ALTIMETRIC_PROFILE_AVERAGE = 2  # nb of points for altimetry moving average
+ALTIMETRIC_PROFILE_STEP = 1  # Step min precision for positive / negative altimetry gain
 ALTIMETRIC_PROFILE_BACKGROUND = 'white'
 ALTIMETRIC_PROFILE_COLOR = '#F77E00'
 ALTIMETRIC_PROFILE_HEIGHT = 400


Test patch:
diff --git a/geotrek/altimetry/tests/test_elevation.py b/geotrek/altimetry/tests/test_elevation.py
--- a/geotrek/altimetry/tests/test_elevation.py
+++ b/geotrek/altimetry/tests/test_elevation.py
@@ -25,10 +25,10 @@ def setUp(self):
         self.path = Path.objects.create(geom=LineString((78, 117), (3, 17)))
 
     def test_elevation_path(self):
-        self.assertEqual(self.path.ascent, 19)
-        self.assertEqual(self.path.descent, -1)
-        self.assertEqual(self.path.min_elevation, 4)
-        self.assertEqual(self.path.max_elevation, 23)
+        self.assertEqual(self.path.ascent, 16)
+        self.assertEqual(self.path.descent, 0)
+        self.assertEqual(self.path.min_elevation, 6)
+        self.assertEqual(self.path.max_elevation, 22)
         self.assertEqual(len(self.path.geom_3d.coords), 7)
 
     def test_elevation_profile(self):
@@ -36,18 +36,18 @@ def test_elevation_profile(self):
         self.assertEqual(len(profile), 7)
         self.assertEqual(profile[0][0], 0.0)
         self.assertEqual(profile[-1][0], 125.0)
-        self.assertEqual(profile[0][3], 5.0)
-        self.assertEqual(profile[1][3], 4.0)
-        self.assertEqual(profile[2][3], 7.0)
-        self.assertEqual(profile[3][3], 11.0)
-        self.assertEqual(profile[4][3], 13.0)
-        self.assertEqual(profile[5][3], 16.0)
-        self.assertEqual(profile[6][3], 23.0)
+        self.assertEqual(profile[0][3], 6.0)
+        self.assertEqual(profile[1][3], 8.0)
+        self.assertEqual(profile[2][3], 10.0)
+        self.assertEqual(profile[3][3], 13.0)
+        self.assertEqual(profile[4][3], 18.0)
+        self.assertEqual(profile[5][3], 20.0)
+        self.assertEqual(profile[6][3], 22.0)
 
     def test_elevation_limits(self):
         limits = self.path.get_elevation_limits()
-        self.assertEqual(limits[0], 1104)
-        self.assertEqual(limits[1], -96)
+        self.assertEqual(limits[0], 1106)
+        self.assertEqual(limits[1], -94)
 
     def test_elevation_topology_line(self):
         topo = TopologyFactory.create(no_path=True)
@@ -57,8 +57,8 @@ def test_elevation_topology_line(self):
         topo.get_elevation_profile()
         self.assertEqual(topo.ascent, 7)
         self.assertEqual(topo.descent, 0)
-        self.assertEqual(topo.min_elevation, 5)
-        self.assertEqual(topo.max_elevation, 12)
+        self.assertEqual(topo.min_elevation, 10)
+        self.assertEqual(topo.max_elevation, 17)
         self.assertEqual(len(topo.geom_3d.coords), 5)
 
     def test_elevation_topology_point(self):
@@ -218,7 +218,7 @@ def test_3dlength(self):
         # before smoothing: (1 101 0, 21 101 0, 41 101 0, 61 101 3, 81 101 5, 81 99 15)
         # after smoothing:  (1 101 0, 21 101 0, 41 101 0, 61 101 1, 81 101 3, 81 99  9)
         # length: 20 + 20 + (20 ** 2 + 1) ** .5 + (20 ** 2 + 2 ** 2) ** .5 + (2 ** 2 + 6 ** 2) ** .5
-        self.assertEqual(round(self.path.length, 9), 86.449290957)
+        self.assertEqual(round(self.path.length, 9), 83.127128724)
 
 
 class SamplingTest(TestCase):