PDA

View Full Version : [JAVA]Calcolare distanza coordinate geografiche


erkk84
23-07-2008, 21:26
Salve a tutti, sto cercando di sviluppare una funzione che mi calcoli la distanza tra due punti avendo le loro coordinate gps; ho trovato l'algoritmo qui (quello più complicato, con maggiore precisione) http://en.wikipedia.org/wiki/Great-circle_distance
e ho scritto la seguente classe per il calcolo:

public double distanza(double lat1, double longit1, double lat2, double longit2) {

double distance = 0;

double dist_long = longit2 - longit1;
double dist_lat = lat2 - lat1;

double pezzo1 = Math.cos(lat2)*Math.sin(dist_long);
double pezzo11 = pezzo1*pezzo1;

double pezzo2 = Math.cos(lat1)*Math.sin(lat2)-Math.sin(lat1)*Math.cos(lat2)*Math.cos(dist_long);
double pezzo22 = pezzo2*pezzo2;

double pezzo3 = Math.sin(lat1)*Math.sin(lat2)+Math.cos(lat1)*Math.cos(lat2)*Math.cos(dist_long);

double pezzo4 = Math.atan((Math.sqrt(pezzo11+pezzo22))/pezzo3);

distance = pezzo4*6372;

return distance;
}

public static void main(String [] a){

GPS1 gps = new GPS1();
System.out.println(gps.distanza(46.06716, 11.12331, 46.07033, 11.12462));
System.out.println(gps.distanza(46.06833, 11.12388, 46.06848, 11.12776));
}


la prima mi da una distanza di 20 km circa, la seconda 12 km circa quando invece dovrebbero essere rispettivamente di 366 e 299 metri (presi dal seguente sito http://www.comunedipinasca.it/main.php?section=utility/distanza.php)...
Cosa c'è che non va?

PS: poi questa funzione la dovrò trasferire in una midlet su cellulare ma per farlo non c'è problema, basta solo far funzionare questa..

ciao ciao grazie

altairz
23-07-2008, 21:57
Credo che il problema dipenda da questo (preso dall'esempio nella pagina di wikipedia):


First, convert these coordinates to decimal degrees (Sign × (Deg + (Min + Sec / 60) / 60)) and radians (× π / 180) before you can use them effectively in a formula.

erkk84
23-07-2008, 22:10
ah ecco..sinceramente l'ho guardato ma non preso in considerazione perchè non capisco cosa vuol dire...cioè, non capisco i simboli: cos'è Sign?cos'è x (da una parte sembra una moltiplicazione, dall'altra una variabile)?Date le coordinate nel formato come da codice, qualcuno può aitarmi ad introdurle nel giusto formato?

Grazie mille intanto ciao ciao

altairz
23-07-2008, 22:25
l'esempio di wikipedia considera coordinate del tipo gradi minuti secondi e dice di convertirli prima in gradi decimali e poi in radianti.
Poichè tu utilizzi già coordinate in gradi decimali, devi soltanto convertirli in radianti, cioè moltiplicare per Math.PI e dividere per 180.


public static double radianti(double gradi_dec) {
return gradi_dec * Math.PI / 180;
}

erkk84
23-07-2008, 22:29
Quindi tanto per capirci le coordinate in radianti del primo punto saranno:

lat1 = 46.06716*Math.PI / 180
long1 = 11.12331*Math.PI / 180

e uguale per il secondo punto...dopodichè nei vari sin e cosin metto i valori sopra ottenuti giusto?

grazie ciao ciao

erkk84
23-07-2008, 22:34
perfetto adesso corrisponde tutto..grazie mille ancora ciao ciao

altairz
23-07-2008, 22:35
Quindi tanto per capirci le coordinate in radianti del primo punto saranno:

lat1 = 46.06716*Math.PI / 180
long1 = 11.12331*Math.PI / 180

e uguale per il secondo punto...dopodichè nei vari sin e cosin metto i valori sopra ottenuti giusto?

grazie ciao ciao

esatto :)

xciaoatuttix
24-07-2008, 06:48
scusate se mi intrometto ma questo programma calcola la distanza tra due punti in linea retta?
Come fa un programma ( tipo route 66 ) a calcolare la distanza, ad esempio, tra milano e parigi ( non in linea retta ) ?
conosce la lunghezza di TUTTE le strade del mondo ?

perdonate l'ignoranza :rolleyes:

erkk84
24-07-2008, 09:06
si in teoria lo fa in linea retta...per l'altra domanda lascio la parola a matematici più esperti....ciao

xciaoatuttix
24-07-2008, 09:31
speriamo che qualche matematico esperto risponda che sono curioso :stordita:

wizard1993
24-07-2008, 09:45
speriamo che qualche matematico esperto risponda che sono curioso :stordita:

andandoci molto a intuito
usi l'algoritmo dei cammini minimo, in cui le interesezioni delle strade sono i nodi e le strade sono i cammini fra i vari nodi, ai quali viene assegnato un peso in base a velocità di percorrenza, lunghezza ecc
http://it.wikipedia.org/wiki/Algoritmo_di_Dijkstra

erkk84
24-07-2008, 11:06
Avrei un altro piccolo problemino: io dal gps ricevo i dati sottoforma di gradi minuti e secondi, del tipo ad esempio:

lat = 4604.0453, cioè 46° 4.04' 53"

Esiste una funzione java che fa automaticamente la conversione?sennò, come posso farla )conosco al formula ma non mi viene in mente come tradurla in codice)..

ciao ciao grazie