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(); ?> |
Partager