par
chaosad2 » 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.
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;
}
?>
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 :
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>
Si quelqu'un peut m'éclairer, merci d'avance !
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.
[code]
<?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;
}
?>
[/code]
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 :
[code]<?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>[/code]
Si quelqu'un peut m'éclairer, merci d'avance !