Bonsoir,

Dans la même idée que mon code parsant un GPX, j'aimerai un coup de main pour améliorer un code assez important pour mon site.

Ce dernier permet de générer un graphique de l'élévation d'une balade selon sa distance.

Pour ce faire, dans un premier temps, une fonction calcul la distance 3d du parcours.

Ensuite, je fais en sorte de créer des paliers de distance afin que l'utilisateur puisse savoir à quel kilomètre il sera à tel altitude. Un graphe est produit alors à l'aide de la librairie open source Artichow

Pour le rendu visuel, je vous invite à regarder la pièce jointe ou par exemple à cette balade.

Cela fonctionne assez bien mais j'aimerais faire en sorte de créer un dernier trait donnant la distance totale. Si les traits des distances pouvaient aussi avoir un espacement assez logique comme : (0 -5 -10-12.5) km ce serait pas mal aussi.

Il faut savoir qu'une balade peut avoir une distance comprise entre 1 et 99999 km !

Le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
<?php
	//-----------------------------------------------------------------------------//
	// Fonction permettant un calcul 3d entre 2 points GPS-------------------------//
	//-----------------------------------------------------------------------------//
 
	function distance($lat1, $lon1, $lat2, $lon2, $alt1, $alt2) 
	{
		//rayon de la terre
		$r = 6366;
		$lat1 = deg2rad($lat1);
		$lat2 = deg2rad($lat2);
		$lon1 = deg2rad($lon1);
		$lon2 = deg2rad($lon2);
 
		//recuperation altitude en km
		$alt1 = $alt1/1000;
		$alt2 = $alt2/1000;
 
		//calcul précis
		$dp= 2 * asin(sqrt(pow (sin(($lat1-$lat2)/2) , 2) + cos($lat1)*cos($lat2)* pow( sin(($lon1-$lon2)/2) , 2)));
 
		//sortie en km
		$d = $dp * $r;
 
		//Pythagore a dit que :
		 $h = sqrt(pow($d,2)+pow($alt2-$alt1,2));
 
		return $h;
	}
 
	//-----------------------------------------------------------------------------//
	//-----------------------------------------------------------------------------//
 
	$id_balade = intval($_GET['id_balade']);
	$id_periple = intval($_GET['voir_periples']);
 
	//on cherche a trouve la distance de montée et la distance de descente et la distance totale en km 
	//on requête la base de données des points gps
	$racine = $_SERVER['DOCUMENT_ROOT'];
	include($racine . '/inclusion/connect_pdo.php');
 
	if(!empty($id_periple))
	{
		$sql_select_data = $bdd->prepare('SELECT lon,lat,ele FROM pts_gpx_periples where id_periple = ?');
		$sql_select_data->execute(array($id_periple));
	}
	else
	{
		$sql_select_data = $bdd->prepare('SELECT lon,lat,ele FROM pts_gpx where id_balade = ?');
		$sql_select_data->execute(array($id_balade));
	}
 
	$i = 0;
	$table =array();
	$table_elevations =array();
	//tant qu'il y a des points à manger
	while ($tab_data = $sql_select_data->fetch())
	{
		array_push($table,$tab_data);
		array_push($table_elevations,ceil($tab_data['ele']));
	}
 
	for ($i=1; $i<count($table);$i++)
	{
			//latitude
			$lat1 = $table[$i-1]['lat'];
			$lat2 = $table[$i]['lat'];
			//longitude
			$lon1 = $table[$i-1]['lon'];	
			$lon2 = $table[$i]['lon'];
			//elevation
			$ele1 = $table[$i-1]['ele'];
			$ele2 = $table[$i]['ele'];
			$distance_total = $distance_total + (round(distance($lat1, $lon1, $lat2, $lon2, $ele1, $ele2), 2));
 
	}
	//Calcul de la distance totale
	//fin calcul distance 3d et calcul distance montée et descente
	//resultat en km arrondi à 2 chiffres après la virgule
	//-------------------------------------------------------------------------------------------------------------------------------------//
 
	// Fonction d'affichage du graphe de l'altitude
	include($racine . '/js/Artichow/LinePlot.class.php'); 
	// En fonction de la distance totale on va créer le nombre de séparateur
 
   // Changer ces valeurs !!!!
	$nb_separateur = 7;
	$distance = $distance_total;
 
	 /*
	 * Les valeurs concernant les altitudes sont retournée par la requête dans le tableau $table_elevation
	 * ce tableau ne contient que des valeurs entières !
	 */
 
	$nb_pts_altitude = count($table_elevations);
 
	$graph = new Graph(600, 300);
 
	//$values = array(1, 8, 3, 2.5, 5, -4.5, -5);
   $values = $table_elevations;
 
 
   $plot = new LinePlot($values);
   //couleur du cadre
   $plot->setBackgroundColor(new Color(240, 240, 240));
   $plot->hideLine(FALSE);
	//couleur de l'interieur de la ligne
   $plot->setFillColor(new Color(30, 147, 66,15));
   $plot->grid->setBackgroundColor(new Color(62, 171, 255, 35));
   $black = new Black(50);
   $plot->grid->setColor($black) ;
	//nb de virgule
   $plot->yAxis->setLabelPrecision(0);
   //etiquette
   $plot->yAxis->title->set("Altitude (m)");
   $plot->yAxis->title->setPadding(0, 15, 0, 0);
 
   //on reduit par 30 le nombre de point pour aller plus vite
   //$plot->reduce(30);
 
   /*
	* On a un nombre de point $nb_pts_altitude, une distance totale $distance
	* et un nombre de séparateur $nb_separateur on va donc chercher la fréquence
	* d'affichage des étiquettes càd le nombre de point séparant chaque etiquette
	*/
 
   $espace_distance = round(($distance / $nb_separateur),1);
   // distance en km entre deux tirets sur le graphe
   $tab_tirets = array(0);
   for($i=1; $i <($nb_separateur+1); $i++) // pour i de 1 à 9 dc 8 tours
   {
		$valeur_tiret = ($i*$espace_distance);
		$valeur_tiret_2 = $valeur_tiret;
		array_push($tab_tirets, $valeur_tiret_2);
		// On rajoute un huitieme, deux huitieme, ... huit huitiemes
   }
 
   // ici on va calculer la distance en km entre deux points !
   $distance_km_points = ($distance_total/($nb_pts_altitude - 1)); // ex: 1/8 : 8points = 1km (totalement fictif)
   // Sachant qu'on a la distance en kilomètre entre deux tirets $espace_distance : ici 3km (24/8)
   // On calcule le nombre de points correspondant :
   $nb_points_entre_tirets = ceil($espace_distance / $distance_km_points);
   // par exemple 3km = 3/ (1/8) = 3*8 = 24 points
   // ce qui veut dire que le point 24 = 2km
   // mais le 1/8 est cité comme exemple pour simplifier !
 
   // On va donc remplir le tableau avec pour l'indice 0 bah 0
   // a l'indice 24 la premiere valeur de $tab_tirets soit un huitieme du parcourt, etc ...
 
   $tab_ordonnees = array();
   $tab_ordonnees[0] = 0;
 
   for ($i=1; $i<($nb_separateur+1);$i++) // pour i allant de 1 à 9 donc 8 tours
   {
		$tab_ordonnees[($i*$nb_points_entre_tirets)] = $tab_tirets[$i];
		// Pour le premier tour $tab_ordonnees[1*24] = $tab_tirets[1]
		// Soit tab_ordonne[24]= un huitieme de la distance
		// rappel $tab_tiret[0] =0 (ligne 110)
   }
 
   //Et donc d'un point de vue de la fréqence d'affichage f= nb_point_entre_tiret
   $plot->xAxis->setLabelText($tab_ordonnees);
   //frequence des point de distance
   $frequence = $nb_points_entre_tirets;
 
  //grid (trait) horzontal vertical
   $plot->grid->setInterval(1,$frequence ); 
 
   $plot->xAxis->setLabelInterval($frequence);
 
	//etiquette
   $plot->xAxis->title->set("Distance (km)");
   $plot->xAxis->title->setPadding(5, 0, 0, 0);
	//vertical horizontale frequence grid
 
	// On ajoute 6 % d'espace en haut de la courbe
	$plot->setSpace(
	  0, /* Gauche */
	  0, /* Droite */
	  5, /* Haut */
	  0 /* Bas */
   );
 
   $graph->add($plot);
   $graph->draw(); ?>
En espérant que quelqu'un sera intéressé par l'optimisation de ce code qui pourrait je pense dépanner quelques personnes rien que pour le calcul en 3d d'une distance .