Formula per calcolare distanza tra 2 punti

  • Orbea lancia la nuova Rise, la sua ebike leggera che ha fatto discutere tantissimo i nostri lettori. Io e Stefano abbiamo avuto modo di provarla in anteprima a Terlago, da oggi la potete toccare con mano al Bike Festival di Riva del Garda.
    Iscriviti al canale se non l'hai ancora fatto (clicca qui).


Marchetto75

Biker popularis
21/4/07
58
0
0
Veneto
Visita sito
Vorrei inserire in un programmino la funzione che permette di calcolare la distanza in metri tra 2 punti di cui conosco latitudine e longitudine.
Ho trovato delle formule su Internet, e dall'esempio di un utente sembra funzionare, pero se metto i valori di 2 punti gpx con distanza che dovrebbe essere circa di 10 metri (cosi ho impostato l'intervallo di salvataggio del mi navigatorei) mi restituisce dei valori sballati.

Ora metto il codice che ritendo sia comprensibile anche a chi non comprende il linguaggio.
:= sta per =

abs (Returns the absolute value of Number)

* sta per moltiplicazione
/ divisione

acos(Number) Returns the arccosine (the number whose cosine is Number) in radians

Sin(Number) | Cos(Number) | Tan(Number) : Returns the trigonometric sine|cosine|tangent

Ecco il codice con tanto di formula, per chi mastica trigonometria, puoò essere corretta


Codice:
decLatA := 45.439621852710843
decLonA := 12.045671353116632
decLatB := 45.439646244049072
decLonB := 12.045650482177734
                  
pi := 3.1415927    
r := 6372.795477598          
                            
radLatA := pi * decLatA / 180
radLonA := pi * decLonA / 180
radLatB := pi * decLatA / 180
radLonB := pi * decLonB / 180
                            

phi := abs(radLonA - radLonB)                                                                                      
                                                                                                                  
p := acos( (sin(radLatA) * sin(radLatB)) + (cos(radLatA) * cos(radLatB) * cos(phi)) )


                
distanza := p * r * 1000

http://www.megaupload.com/?d=OGX3AU14
 

Marchetto75

Biker popularis
21/4/07
58
0
0
Veneto
Visita sito
ho provato a cercare info su autohotkey, ma non mi sembra di vedere argomentaziioni sulle variabili a doppia precisione. Non mi sono mai preoccupato di dichiararle.
Leggendo in giro, sembra ci siano formule adatte a calcolare distanze lontane, altre per quelle vicine

http://www.vialattea.net/esperti/php/risposta.php?num=9366

magari da questi siti si puo ricavare la soluzione.
http://en.wikipedia.org/wiki/Great-circle_distance
http://www.movable-type.co.uk/scripts/latlong.html
il codice e stato copiato da qui
http://www.spadamar.com/2007/12/cal...ica-tra-due-punti-della-superficie-terrestre/
Purtroppo i risultati mi sembrano diversi.

Forse conosco chi mi potrebbe aiutare, come minimo direi che bisogna conoscere un po di simbologia matematica per poterlo tradurre
 

ramolaccio

Biker tremendus
26/4/06
1.171
0
0
Canavese -TO-
Visita sito
Il programma che utilizzi è nato principalmente per altri scopi. Se vuoi fare calcoli del genere devi obbligatoriamente avere la precisione doppia.
Visto che comunque ti cimenti in programmazione suggerisco di scaricare ad esempio Visual Basic Express, che è gratuito (lo trovi sul sito della Microsoft).
Ha limitazioni che sono trascurabili per chi programma principalmente per se stesso.
 

Waldos

Biker ciceronis
12/6/08
1.563
0
0
Forlì
Visita sito
ho provato a cercare info su autohotkey, ma non mi sembra di vedere argomentaziioni sulle variabili a doppia precisione. Non mi sono mai preoccupato di dichiararle.
Leggendo in giro, sembra ci siano formule adatte a calcolare distanze lontane, altre per quelle vicine

[url]http://www.vialattea.net/esperti/php/risposta.php?num=9366[/URL]

magari da questi siti si puo ricavare la soluzione.
[url]http://en.wikipedia.org/wiki/Great-circle_distance[/URL]
[url]http://www.movable-type.co.uk/scripts/latlong.html[/URL]
il codice e stato copiato da qui
[url]http://www.spadamar.com/2007/12/calcolo-della-distanza-geodetica-tra-due-punti-della-superficie-terrestre/[/URL]
Purtroppo i risultati mi sembrano diversi.

Forse conosco chi mi potrebbe aiutare, come minimo direi che bisogna conoscere un po di simbologia matematica per poterlo tradurre

ho usato spesso le formule di movable type e mi sono sempre trovato bene, non conosco autohotkey, ma penso anch'io che la doppia precisione sia necessaria (io uso C#)
 

Lonewolf

Biker superioris
Confermo che è necessario usare calcoli in doppia precisione.
Considera che 0,00001 (5 cifra dopo la virgola) nei valori di coordinate geografiche espresse in gradi (ovvero circa 1 centomillesimo di grado) corrisponde a poco più di 1 metro.
Se usi numeri in singola precisione le approssimazioni nei calcoli introducono errori di svariati metri, la stessa conversione da gradi a radianti usando solo 7 cifre significative per il pigreco introduce errori.

La formula che hai usato la puoi provare facilmente in excel (che calcola in doppia precisione) usando la funzione RAD per convertire da gradi a radianti, i valori di distanza vengono piuttosto giusti.
 

Marchetto75

Biker popularis
21/4/07
58
0
0
Veneto
Visita sito
Intanto rignrazio tutti per le esaurienti risposte, inizialmente pensavo di non riceverne, invece mi ritrovo circondato da ciclisti programmatori. :-)

Il problema della doppia precisione credo di averlo rissolto, lavoro con una quindicina di decimali, magari sono sufficienti. Il risultato e in linea con quello restituito da un foglio di calcolo.

Il programma somma la distanza dei vari punti, purtroppo non ottengo un valore corretto. Anche mettendo come distanza fissa tra i punti, 10 metri, il valore risultato non e corretto. Diciamo che su 15 Km ho uno scarto di 1 Km circa.
Probabilmente i programmi specifici usano un'altra formua.

Questa e il programma con il sorgente
http://www.megaupload.com/?d=4KU6TIQD

Ho scoperto tcxconverter. Molto simpatico per la possibilita di salvare i grafici. Non trovo il dislivello in salita e in discesa, c'è questo dato?
 

frder

Biker tremendus
7/11/06
1.266
33
0
Rimini
Visita sito
Il programma somma la distanza dei vari punti, purtroppo non ottengo un valore corretto. Anche mettendo come distanza fissa tra i punti, 10 metri, il valore risultato non e corretto. Diciamo che su 15 Km ho uno scarto di 1 Km circa.
Probabilmente i programmi specifici usano un'altra formua.
Io non sono un programmatore, ma mi diverto con exel.

Ho inserito in un foglio tutti i punti del percorso altissimo.gpx che è nel file che hai linkato nel post precedente.

Ho usato le formule del tuo primo post ed ho ottenuto la distanza totale di 13.073 mt. Ho caricato il file su Basecamp ed Oziexplorer e la distanza data in entrambi i casi è di 13.080 mt.

Quindi direi che le formule vanno bene e sono le stesse che usano sia Basecamp che Oziexplorer.

francesco
 

Marchetto75

Biker popularis
21/4/07
58
0
0
Veneto
Visita sito
mi lasci di stucco, mi sembra di capire che c'è un bel grosso errore nel mio programma, a me da 13010 se ipotizzo una distanza di 10 m tra i punti e 11516 con la formula. In altri tracciati invece mi avvicino piu con la formula. Eppure la formula l'ho provta sul un foglio elettronico singolarmente per calcolare la distanza di 2 punti. mi sembrava che il risultato fosse uguale a quella di autohotkey. Avro da divertirmi prossimamente.

Di trigonometria non capisco nulla, ho provato a convertire la formula http://www.movable-type.co.uk/scripts/latlong.html
Ma mi restituisce un valore sballato.
precisamente con i dati
decLatA := 45.439621852710843
decLonA := 12.045671353116632
decLatB := 45.439646244049072
decLonB := 12.045650482177734

formula in esame 3,1629 metri
formula provata 20015,086 non so cosa
Ho provtaoa metterla sul foglio elettronico e mi da lo stesso risultato
Ti allego programma e foglio esportato in excel se la cosa ti incuriosisce

Codice:
decLatA := 45.439621852710843
decLonA := 12.045671353116632
decLatB := 45.439646244049072
decLonB := 12.045650482177734

pi := 3.1415926535897932384626433832795

r :=  6371

radLatA := rad(decLatA)
radLonA := rad( decLonA)
radLatB := rad(decLatB)
radLonB := rad(decLonB)

dLat = pi * (decLatB-decLatA) / 180
dLon = pi * (decLonB-decLonA) / 180
lat1 = radLatA
lat2 = radLatB 


a := sin(dLat/2) * sin(dLat/2) +  cos(lat1) * cos(lat2) * sin(dLon/2) * sin(dLon/2)
 c := 2 * atan2(sqrt(a), sqrt(1-a)) ; 
risultato := r * c 


messo il codice per estrapoalre la formula non funzionante, ho tagliato varie cose tra cui  la funzione per calcolare atan2
http://www.megaupload.com/?d=OGX3AU14

Trovato l'errore, una cavolata enorme.
Versione funzionante. Ora la distanza è perfetta

per ogni calcolo, al raggio della terra ci sommo l'altezza del rilevamento diviso 1000, valore trascurabile ma che si avvicina sempre piu a quello di basecamp

http://www.megaupload.com/?d=Y95XNLKB
 

Marchetto75

Biker popularis
21/4/07
58
0
0
Veneto
Visita sito
http://www.megaupload.com/?d=54BFX2OX

Istruzioni

File impostazionidislivello.INI che si genera al primo lancio del file exe

[generali]
distanzacquisizionepuntoinmetri=10 ; si mette il valore di acquisizione punti impostato dsu navigatore, non serve a nulla se calcoladistanzapunti e a 1
calcoladistanzapunti=1 ; calcola la distanza mediante formula
tolleranza=0.47 ; intervallo in metri dentro il quale non viene considerato il dislivello tra i punti
intervalloanalisi=5 ; con 2 si disabilita la funzione, cengono scartati i valori uguali dentro l'intervallo
raggioterra=6372.795477598 ; potrebbe essere 6371, il risultato non cambia di molto
scegliere tra SphericalLawofCosines o haversine
algoritmodistanza=SphericalLawofCosines ; formula applicata per calcolare la distanza

Il filtro per regolare il dislivello si basa sulle voci intervalloanalisi e tolleranza
l'algoritmo usato nei programmi normali e quello discusso nei post precedenti, l'ho indicato con il nome SphericalLawofCosines , pero non so se il nome sia giusto, comunque questa formula funziona.
haversine, altra formula per calcolare la distanza, non sono sicuro d'averla scritta nel modo corretto, ma i risultati sono simili alla formual testata, quindi potrebbe essere giusta. Alla formula ho aggiunto un /100000 sperando di aver convertito il valore in metri

Codice:
	 pi := 3.1415926535897932384626433832795
	 r := 6372.795477598

	 radLatA := pi * decLatA / 180
	 radLonA := pi * decLonA / 180
	 radLatB := pi * decLatB / 180
	 radLonB := pi * decLonB / 180
	                             
	 
	dLat = rad(decLatB-decLatA)
	dLon = rad(decLonB-decLonA)
	

	a :=  ( (sin(nDLat/2)**2) + cos(decLatA1) * cos(decLatB) * (sin(nDLon/2)**2) )
	
	 c := 2 * atan2(sqrt(a), sqrt(1-a)) ; 
         distanzacquisizionepuntoinmetri := r * c / 100000


atan2(x,y) { ; 4-quadrant atan in degrees 
   a := x = 0 ? (y = 0 ? 0 : y > 0 ? 90 : 270) : atan(y/x)*57.2957795130823209 ; 180/pi 
   b:= x < 0 ? 180 + a : a < 0 ? 360 + a : a 
   Return b
   ;Return b * 3.1415926535897932384626433832795 /180
   }

nel linguaggio usato **2 eleva al quadrato il valore

Risultati prendendo il tracciato http://api.viglink.com/api/click?fo... sentiero E5&jsonp=vglnk_jsonp_13154057858371

con intervalloanalisi=5
tolleranza=0.1
con formula SphericalLawofCosines

dislivellopassivoteorico -2567
dislivelloattivoteorico 2559
dislivellopassivoreale -2492
dislivelloattivoreale 2468
quotamassima 1845
quotaminima 227
Distanza Percorso teorico 60536
Distanza Percorso Reale 60907

il dislivello teorico e data dalla somma dei dislivelli di ciascun punto senza filtri
il dislivello reale e data dalla somma dei dislivelli di ciascun punto con filtri
Distanza Percorso teorico e data dalla somma delle distanze dei punti sul piano, valore che in pianura e corretto.
Distanza Percorso Reale, Somma delle ipotenuse dei triangoli aventi come cateti la distanza su piano e l'altezza.

Con formula haversine (salvo errori nel scrivere la formula)

Distanza Percorso teorico 53854
Distanza Percorso Reale 54250

Una bella differenza con la fomula normalmente usata. Bisognerebbe verificare quale sia piu precisa.

tracciato http://itinerari.mtb-forum.it/tours/track/4854/type:gpx

dislivellopassivoteorico -5332
dislivelloattivoteorico 5331
dislivellopassivoreale -5150
dislivelloattivoreale 5141
quotamassima 2214
quotaminima 234
Distanza Percorso teorico 109843
Distanza Percorso Reale 110698

Con harvesine
Distanza Percorso teorico 104293
Distanza Percorso Reale 105180

(comunque siete dei mostri)
 

Piff91

Biker extra
23/10/08
712
17
0
Laives (BZ)
Visita sito
ragazzi anche io ho problemi per calcolare la distanza. Praticamente per una piccola distanza mi viene fuori un valore di 3,... da moltiplicare per il raggio della terra e quindi mi vengono migliaia e migliaia di km quando sarebbero 10 15 m.
Potete aiutarmi?
 

frder

Biker tremendus
7/11/06
1.266
33
0
Rimini
Visita sito
Prova ad usare la formula del primo post


decLatA := 45.439621852710843
decLonA := 12.045671353116632
decLatB := 45.439646244049072
decLonB := 12.045650482177734

pi := 3.1415927
r := 6372.795477598

radLatA := pi * decLatA / 180
radLonA := pi * decLonA / 180
radLatB := pi * decLatA / 180
radLonB := pi * decLonB / 180

phi := abs(radLonA - radLonB)

p := acos( (sin(radLatA) * sin(radLatB)) + (cos(radLatA) * cos(radLatB) * cos(phi)) )

distanza := p * r * 1000


francesco
 

bicistop

Biker superis
22/3/14
367
1
0
Visita sito
se metto i valori di 2 punti gpx con distanza che dovrebbe essere circa di 10 metri (cosi ho impostato l'intervallo di salvataggio del mi navigatorei) mi restituisce dei valori sballati.

http://www.megaupload.com/?d=OGX3AU14
forse ho scoperto la spiegazione
CON GPX, ho registrato due tracce
Una con metodo di registrazione 10mt
Una con metodo di registrazione 20mt
Allora dovremmo registrare tutti i punti con distanze sempre uguali a 10mt, oppure 20mt come nel secondo caso, giusto ?
Sbagliato !
Questo perchè nelle tracce, il valore del tempo non può essere inferiore ad un secondo.
Quindi, se registriamo il punto X, e dopo 10mt non è passato ancora nemmeno un secondo, non potrà registrare il punto X+1, con lo stesso tempo del punto X. Registrerà il punto X+1 dopo un secondo dal punto X, quindi a più di 10metri di distanza dal punto X.
Ecco perchè, su GPX Editor, le distanza tra un punto all'altro non sono quasi mai uguali a 10mt o 20mt, ma saranno MINIMO di 10mt o 20mt.
Impostando 10mt, registrerà i punti con distanze dai 10mt in su.
Impostando 20mt, registrerà i punti con distanze dai 20mt in su.
DA QUELLO CHE HO CAPITO IO, SEGUENDO LA LOGICA.
 

frder

Biker tremendus
7/11/06
1.266
33
0
Rimini
Visita sito
Il tuo ragionamento e corretto, e' ovvio che la distanza selezionata nel metodo di registrazione e' da intendersi "distanza minima", ma non c'entra niente con l'argomento di questa discussione , che tratta delle formule per calcolare la distanza fra 2 punti, a prescindere che sia 10, 20, 30 metri.

Francesco
 

Classifica mensile dislivello positivo