2015-05-21 16 views
8

Desidero eseguire il ciclo tramite un file gpx e calcolare l'ascesa e la discesa totali. Ho una funzione che può calcolare la differenza di elevazione tra due serie di punti lat lunghi e ho impostato simplexml per leggere il ciclo & attraverso i punti trkseg del file gpx.PHP Looping attraverso una GPX per calcolare l'ascesa/discesa totale di una traccia

Il problema è che questo non è accurato (in realtà non è accurato in quanto è reale).

Queste due linee si tradurrà in diversi salita e discesa, in quanto è nella vita reale:

$total_ascent += ($val - $last_elevation); 
$total_descent += ($val - $last_elevation); 

C'è qualcuno che sa, come calcolare più accurata la salita e la discesa totale di un brano?

Questo è il mio attuale frammento di codice per calcolarlo ($track_elevations è un array con aumenti di tutta la pista):

if (!empty($track_elevations)) { 
     $total_ascent = $total_descent = 0 
     $lowest_elevation = $highest_elevation = $last_elevation = null; 

     foreach ($track_elevations as &$val) { 
      if (!is_null($last_elevation)) { 
       if ($last_elevation < $val) { 
        $total_ascent += ($val - $last_elevation); 
       } 
       elseif ($last_elevation > $val) { 
        $total_descent += ($last_elevation - $val); 
       } 
      } 

      if (is_null($lowest_elevation) or $lowest_elevation > $val) { 
       $lowest_elevation = $val; 
      } 

      if (is_null($highest_elevation) or $highest_elevation < $val) { 
       $highest_elevation = $val; 
      } 

      $last_elevation = $val; 
     } 
    } 

Esempio di $track_elevations array:

$track_elevations = array(
    327.46, 
    328.27, 
    329.32, 
    330.11, 
    329.46, 
    329.39, 
    329.68, 
    331.04, 
    333.23, 
    333.46, 
    332.97, 
    332.88, 
    332.99, 
    332.75, 
    332.74, 
    334.01, 
    333.62 
) 

In vero, ho stava andando in bicicletta sulla strada piana. Ma il mio frammento di codice calcolerà, sono salito e sceso a pochi metri. Forse dovrei aggiungere c'è qualche limitazione di precisione tra le due elevazioni di fila ...

Quello che voglio ottenere:

cercherò di spiegare più meglio - quando mi giro f.e. 20 km su strada piana (quasi senza salita e discesa), l'ascesa e la discesa totali dovrebbero essere vicino a 0. Ma quando somma $track_elevations (come nel mio snippet di codice), otterrò in $total_ascent e $total_descent f.e. 500 metri ... E 'a causa di tra ogni elemento dell'array in $track_elevations la differenza è di un paio di centimetri, ma sto ancora viaggiando sulla strada pianeggiante ... E nella somma totale si raccoglierà ad un gran numero di metri ... Spero ora è più chiaro.

+0

puoi fornire alcuni valori di esempio per l'array 'track_elevations'? – Stephen

+0

@Stephen aggiornato. – Legionar

+0

Probabilmente ho frainteso la domanda, ma sembra che tu abbia risalito e disceso di un paio di metri (in base all'array fornito). Cosa vuoi calcolare esattamente? – Ynhockey

risposta

1

Il problema è che se si calcola $lastHeight - $track_elevations[$i] per ascentet si ottengono valori inferiori a 0 e questo è il motivo per cui si ottengono alte differenze tra $total_asc e $total_desc.

<?php 
$track_elevations = array(
    327.46, 
    328.27, 
    329.32, 
    330.11, 
    329.46, 
    329.39, 
    329.68, 
    331.04, 
    333.23, 
    333.46, 
    332.97, 
    332.88, 
    332.99, 
    332.75, 
    332.74, 
    334.01, 
    333.62 
); 

$lastHeight = $track_elevations[0]; 
$total_ascent = 0; 
$total_descent = 0; 
for ($i=1;$i<count($track_elevations);$i++) { 
    if ($track_elevations[$i] > $lastHeight) { 
     $total_ascent += -1 * ($lastHeight - $track_elevations[$i]); 
    } 
    else { 
     $total_descent += ($lastHeight - $track_elevations[$i]); 
    } 
    $lastHeight = $track_elevations[$i]; 
} 
echo $total_ascent ."\n"; 
echo $total_descent . "\n\n--\n"; 
echo $total_ascent - $total_descent . "\n"; 

-

$ php -f gpx.php 
8.1 
1.94 

-- 
6.16 

- manuale calcola i valori:

Ascent: 
0.81 
1.05 
0.79 
0.29 
1.36 
2.19 
0.23 
0.11 
1.27 
--- 
8.1 

Descent: 
0.65 
0.07 
0.49 
0.09 
0.24 
0.01 
0.39 
--- 
1.94  
+0

Il mio snippet di codice non otterrà mai valori inferiori a 0 ... Quando ascendi - 'if ($ last_elevation <$ val) {', di questo '$ total_ascent + = ($ val - $ last_elevation);' sarà maggiore di 0; quando stai scendendo - 'elseif ($ last_elevation> $ val) {', che questo '$ total_descent + = ($ last_elevation - $ val);' sarà maggiore di 0. Also btw: Sto usando la funzione 'abs' a la fine della mia funzione calc. Ma questo non risolverà il problema, che è diverso come nella vita reale ... – Legionar

+0

Quando ho eseguito il tuo codice con i tuoi dati di esempio ottengo '$ total_descent = -1.94'. Ho calcolato i dati di esempio con la mano e l'ho aggiunto alla mia risposta. – take

+0

Sì, lo so. Ma questo non è il problema: la differenza tra '$ total_ascent' e' $ total_descent'. AD1: Sto usando 'abs()', quindi sarà maggiore di 0. AD2: nel mio esempio ci sono solo poche elevazioni, normalmente ci sono circa 1000 elevazioni, e la salita e la discesa totali sono circa 500 metri. Ma come ho detto, stavo andando in bicicletta per 20 chilometri sulla strada piana, quindi l'ascesa e la discesa totali dovrebbero essere solo di qualche metro (ad esempio 5-10, non 500). Questo è il vero problema della mia domanda ... E in questo paio di elevazioni che ho fornito, di sicuro non sono salito a 9,1 m, ma forse solo a 50 cm ... – Legionar

1

Sei sicuro che questo è "flat"? flat? Puoi fornire un set di dati completo? Inoltre non penso che questo sia un problema di precisione da PHP. I punti dati hanno solo una precisione di due cifre. Forse il sensore sta arrotondando?

+0

Non è il problema in PHP. Il sensore lo sta arrotondando in qualche modo strano. È ancora tra 328 - 334 m, ma la strada era piatta. Sto solo chiedendo, se dovessi usare qualche precetto, di non contare piccoli cambiamenti di elevazione ... – Legionar

1

Anche se si percorre una strada perfettamente piana, i dati di quota raccolti dal GPS andranno sempre su e giù un po '. Il GPS non è molto preciso con l'altitudine, anche in condizioni perfette.

Se si utilizza l'ingresso GPS grezzo per calcolare la quantità totale di salite/discese, questi piccoli errori si sommano rapidamente con ogni singolo punto e danno risultati completamente irrealistici.

Esistono diverse opzioni per ottenere risultati migliori, ma sono tutti più o meno complessi: È possibile "livellare" la curva di elevazione con algoritmi appropriati. È possibile scartare i dati di altitudine GPS e sostituirli con dati di altitudine pre-registrati per tutte le coordinate a terra (denominati dati SRTM).
È possibile utilizzare i dati SRTM e combinarlo in modo intelligente con i propri dati GPS.

In ogni caso, ottenere valori di altitudine adeguati è un argomento difficile. Potresti provare il modo semplice di non contare le differenze al di sotto dei 10m o alcune di esse, ma molto probabilmente non porterà a buoni risultati.