Récupérer lat / lon premier waypoint fichier GPX
Posté : 28 déc. 2022, 09:44
Bonjour,
J'utilise du code PHP pour compiler les données d'un fichier GPX (trace GPS) et en extraire la distance, le dénivelé cumulé, les altitudes max et mini.
J'aimerais en complément en extraire les coordonnées du premier waypoint, soit "lat" et "lon" du premier "<trkpt>" (c'est à dire du point de départ).
Un fichier GPX à cette structure :
Si quelqu'un peut m'éclairer, merci d'avance !
J'utilise du code PHP pour compiler les données d'un fichier GPX (trace GPS) et en extraire la distance, le dénivelé cumulé, les altitudes max et mini.
Code : Tout sélectionner
<?php
// return wkt, 'distance', 'd_plus', 'd_moins', 'denivele'
function parseGpx($gpxString){
function distance($lat1, $lon1, $lat2, $lon2, $alt1, $alt2) //calcul en km entre 2 points GPS
{
$r = 6366;
$lat1 = deg2rad($lat1);
$lat2 = deg2rad($lat2);
$lon1 = deg2rad($lon1);
$lon2 = deg2rad($lon2);
$alt1 = $alt1/1000;
$alt2 = $alt2/1000;
$dp= 2 * asin(sqrt(pow (sin(($lat1-$lat2)/2) , 2) + cos($lat1)*cos($lat2)* pow( sin(($lon1-$lon2)/2) , 2)));
$d = $dp * $r;
$h = sqrt(pow($d,2)+pow($alt2-$alt1,2));
return $h;
}
$gpx = simplexml_load_string($gpxString);
$coords_gpx = $gpx->trk->trkseg->trkpt; //=> liste des points du track //
$array_pre_wkt = array(); // tableau vide qu'on va remplir avec : lng , lat (format de coordonnée du wkt)
$distance = 0;
$d_plus = 0;
$d_moins = 0;
$z_min = null;
$z_max = null;
for ($i = 0; $i< count($coords_gpx); $i++){
$pt = $coords_gpx[$i];
$alt = (float) $pt->ele;
if ($z_max < $alt || is_null($z_max)){
$z_max = $alt;
}
if ($z_min > $alt || is_null($z_min)){
$z_min = $alt;
}
if ($i > 0){
$pt_prec = $coords_gpx[$i - 1];
$lat1 = (float) $pt_prec['lat'];
$lon1 = (float) $pt_prec['lon'];
$alt1 = (float) $pt_prec->ele;
$lat2 = (float) $pt['lat'];
$lon2 = (float) $pt['lon'];
$alt2 = (float) $pt->ele;
$distance = $distance + distance($lat1, $lon1, $lat2, $lon2, $alt1, $alt2);
//d+ et d-
if ($alt1 < $alt2){
$d_plus = $d_plus + ($alt2 - $alt1);
}
else {
$d_moins = $d_moins + ($alt2 - $alt1);
}
}
$lon = (string) $pt['lon'];
$lat = (string) $pt['lat'];
$ele = (string) $pt->ele; //elevation que nous n'utilisons pas
$coords_wkt = $lon . ' ' . $lat;
array_push($array_pre_wkt, $coords_wkt);
}
$denivele = ((float)$coords_gpx[count($coords_gpx)-1]->ele ) - ((float)$coords_gpx[0]->ele );
$wkt_str = 'LINESTRING(' . implode(',',$array_pre_wkt) . ')'; //// le WKT à pousser dans la base
$obj = (object) array(
//'wkt' => $wkt_str,
'distance' => $distance,
'd_plus' => $d_plus,
'd_moins' => $d_moins,
//'denivele'=>$denivele,
'z_min' => $z_min,
'z_max' => $z_max,
);
return $obj;
}
?>
Un fichier GPX à cette structure :
Code : Tout sélectionner
<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns:xsi=...>
<metadata>
<name>dinan</name>
<author>
<name>gpx.studio</name>
<link href="https://gpx.studio"></link>
</author>
</metadata>
<trk>
<name>Pointe de Dinan</name>
<type>Cycling</type>
<trkseg>
<trkpt lat="48.233537" lon="-4.564412">
<ele>35.3</ele>
<time>2017-07-22T08:36:29.000Z</time>
</trkpt>
<trkpt lat="48.23352" lon="-4.564543">
<ele>35.9</ele>
<time>2017-07-22T08:36:38.000Z</time>
</trkpt>
<trkpt lat="48.233537" lon="-4.564763">
<ele>36.9</ele>
<time>2017-07-22T08:36:53.000Z</time>
</trkpt>
<trkpt lat="48.233527" lon="-4.564909">
<ele>37.7</ele>
<time>2017-07-22T08:37:03.000Z</time>
</trkpt>