1. Quello che hai trovato, e' un sistema per mappare le coordinate geografiche su un sistema catesiano ECEF. Non ti conviene, se cominci a guardare ecef e poi devi tornare al wgs84 non ne esci piu' vivo 
2. Il metodo basato sull'emisenoverso (harvesine) e' poco preciso.
3. E' sbagliato calcolare in miglia e poi convertire in km - diventa ancora meno preciso per via degli arrotondamenti.
4. In alternativa a harvesine, l'ideale e' di usare la formula di Vincenty. Ma e' abbastanza difficile per principianti, potresti incorrere in problemi che non saresti in grado di risovere. Quindi ti posto una mia vecchia funzione basata sulla legge sferica dei coseni - e' abbastanza precisa per la maggiorparte dei compiti normali (margine di errore intorno a 0.01%) - e restituisce il risultato in km.
Codice PHP:
function geo_dist($lat1,$long1,$lat2,$long2){
list($lat1,$long1,$lat2,$long2) = array_map("deg2rad",func_get_args());
return acos(sin($lat1)*sin($lat2) + cos($lat1)*cos($lat2)*cos($long2-$long1))*6378.137;
}
6378.137 e' il raggio nel sistema wgs84, che e' considerato il modello piu' esatto applicabile globalmente.
5. Se vuoi un valore ancora piu' preciso (ma sempre senza usare Vicenty) - devi tenere in considerazione che la terra non e' perfettamente sferica, quindi a latitudini diverse, il raggio sara' diverso. Quindi al posto del valore fisso 6378.137 puoi usare il risultato di questa funzione che restituisce il raggio medio tra due latitudini:
Codice PHP:
function get_radius($lat1,$lat2){
list($lat1,$lat2) = array_map("deg2rad",func_get_args());
$r_eq = 6378.137;//raggio equatoriale
$r_pl = 6356.7523;//raggio polare
return $r_eq + ($r_pl - $r_eq) * ($lat1 + $lat2)/M_PI;
}
6. Nota: mai confondere l'altezza al livello del mare con l'altezza al livello dell'elisse di riferimento (controllare a che altezza si riferisce il dispositivo gps).
7. Per calcolare la distanza, tenendo conto dell'altezza, se la distanza tra i 2 punti e' abbastanza piccola in modo da ignorare la curvatura terrestre (come nel caso della funivia) basta semplicemente immaginare un triangolo retto con il primo cateto = distanza, il secondo = differenza tra le elevazioni, e l'angolo = 90.
Applicando semplicemente il teorema di pitagora risali alla distanza dell'ipotenusa (che e' quella che serve a te, ed e' questa):
Codice PHP:
$distanza = hypot($distanza_geo,abs($altezza_p1-$altezza_p2));
8. Per calcolare la distanza, tenendo conto sia dell'altezza che della curvatura terrestre, devi mmaginare un triangolo isoscele, con la punta il centro del cerchio (terra), e le altre 2 sono i nostri punti geografici ad altezza 0. Conoscendo la lunghezza dell'arco, puoi calcolare l'angolo tra i due lati (angolo centrale), e con quest'ultimo calcolare il terzo lato, che e' la distanza che ci interessa, che e' la corda che prenderemo come valore per l'ipotenusa del triangolo di cui ho parlato al punto sopra. E poi basta fare la stessa cosa come sopra.
La mia funzione e' questa:
Codice PHP:
function geo_dist_alt($dist,$alt1,$alt2){
$central_angle = deg2rad((180*$dist)/(M_PI*6378.137)); //dedotto dalla formula arco= (angolo / 180 gradi) * pi * r
//e' una formula per calcolare l'arco in una circonferenza, ma il margine di errore viene abbassato se si usa il raggio calcolato in base alla latitudine
$chord = 2*6378.137*sin($central_angle/2);//teorema dei coseni
return hypot($chord,abs($alt1-$alt2));
}
- ma ha veramente senso di usarla solo se si tratta di centinaia di km, tanto dislivello, e serve tanta precisione.