Newsgroup: it.comp.appl.access
Titolo: calcolo distanza

Qualcuno si è cimentato con il calcolo della distanza tra due punti con dati 
da gps, latitudine e longitudine ?
In una tabella contenente in un campo la latitudine e nell'altro la 
longitudine dovrei calcolare la distanza tra ciascun punto-record tramite 
query.
grazie 

 dati da gps, latitudine e longitudine ?
Ma tu ti rendi conto di cosa stai parlando?
No?
Guarda un pň?
http://www.greentarget.com/articolo.asp?cui=-2001908436&CodPubblicazione=92&VisBanner=null
oppure
http://host.uniroma3.it/docenti/carlucci/Tesine/Gps/ricevere.htm
o ancora
http://www.cieloeterra.it/articoli.sorti/sorti.html


 wrote in 
message news:db53h0$as5$1...@domitilla.aioe.org...

Se le coordinate sono poche o lo si fa a "mano" o con excel :
http://tinyurl.com/6wnnx
http://tinyurl.com/8egd9
http://tinyurl.com/8kty2
viceversa...
grazie



In questi calcoli sono implicate formule abbastanza complesse con l'utilizzo 
di seno, coseno, arcoseno, PGreco.
Credo che una volta trovata la formula matematica, ti convenga usare Excel 
nella sua automazione con Access. Certo puoi riscrivere tutto in Access ma 
se lo fà già Excel?...
Ciao, Carlo 

 Qualcuno si č cimentato con il calcolo della distanza tra due punti con

Vai sul Sito Comune (link qui sotto) e nella Sezione Modules leggi la FAQ
intitolata "5.23 Raccolta di sub e funzioni utili".
Scarica il database di esempio allegato alla FAQ e seleziona la Categoria
intitolata "Latitude/Longitude"; nella lista dei topic trovi anche quello
intitolato "Function GreatArcDistance" che fa riferimento ad una funzione
che serve a calcolare la piů corta distanza tra due punti dell terra di cui
si conoscono la latitudine e la longitudine.
Comunque riporto qui di seguito la funzione che dovrebbe fare ciň che ti
serve:
Function GreatArcDistance(Lat1 As Double, Lon1 As Double, _
    Lat2 As Double, Lon2 As Double, Radius As Double) As Double
'
' Calculates the Great Arc (shortest) distance
'       between 2 locations on the globe.
'
' Uses functions from Trigonometry
'
Dim X1 As Double, Y1 As Double, Z1 As Double
Dim X2 As Double, Y2 As Double, Z2 As Double
Dim CosX As Double, ChordLen As Double
  LatLongToXYZ Lat1, Lon1, Radius, X1, Y1, Z1
  LatLongToXYZ Lat2, Lon2, Radius, X2, Y2, Z2
  ChordLen = Sqr((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2) + (Z1 - Z2) *
(Z1 - Z2))
  CosX = 1 - ChordLen * ChordLen / (2 * Radius * Radius)
  Debug.Print X1, Y1, Z1
  Debug.Print X2, Y2, Z2
  Debug.Print ChordLen, CosX
  If CosX = 1 Or CosX = -1 Then
    GreatArcDistance = 0
  Else
    GreatArcDistance = Sqr(1 - CosX * CosX) * Radius * PI() / 2
  End If
End Function
-- 
Roberto
-----------------------------------------------------
il Sito Comune di it.comp.appl.access
http://www.sitocomune.com
----------------------------------------------------

 ha scritto nel 
messaggio news:s_qBe.15928$QV1.2...@twister2.libero.it...

Ciao Roberto
vorrei sbagliarmi ma mi sembra che Marco abbia bisogno di conoscere la 
differenza tra due valori di Lat e Lon. espressi, immagino in Km.
Non so se la funzione proposta ottenga questo risultato. Nelle mie prove ho 
trovato molta differenza con il risultato di questo link:
http://216.147.18.102/dist/index
Ciao, Carlo 

 Ciao, Carlo


 ha scritto nel messaggio
news:frnBe.157569$75.67...@news4.tin.it...

Scusami, ma mi ero dimenticato di indicarti che nel modulo in cui memorizzi
la funzione GreatArcDistance devi memorizzare anche la seguente sub:
Sub LatLongToXYZ(Lat As Double, Lon As Double, Radius As Double, x As
Double, y As Double, z As Double)
'
' Converts Latitude, Longitude, Radius to 3d-Cartesian coordinates
'
' Assumes:
'   X axis runs through 270 (-X) and 90 (+X) Latitude
'   Y axis runs North (+Y) to South (-Y)
'   Z axis runs through 0 (-Z) and 180 (+Z) Latitude
'
  y = Radius * Sin(Deg2Rad(Lat))
  x = Radius * Sin(Deg2Rad(Lon)) * Cos(Deg2Rad(Lat))
  z = -Radius * Cos(Deg2Rad(Lon)) * Cos(Deg2Rad(Lat))
End Sub
la seguente funzione:
Function PI() As Double
  PI = Atn(1) * 4
End Function
e la seguente funzione:
Function Deg2Rad(x As Double) As Double
' Degrees to radians
  Deg2Rad = x / 180 * PI()
End Function


 ha scritto nel
messaggio news:KWrBe.159214$75.68...@news4.tin.it...
[SUPERCUT]
Bisogna memorizzare in un modulo anche la seguente funzione:
Function Deg2Rad(x As Double) As Double
' Degrees to radians
  Deg2Rad = x / 180 * PI()



esatto

Anche se è un assurdo in matematica, ma queste misure variano di molto a 
seconda delle formule che si usano.
Poi c'è da considerare se si assume la terra come una sfera con raggio 6 371 
000,707m o un elissoide con raggio
 6 378 137,000 m.
Comunque sembra anche a me che quella formula non si molto esatta.
I dati che ho a disposizione sono in formato gradi decimali es 46,662860 
12,603020 e la distanza è preferibile venga espressa in metri. Ora chiedo 
comunque l'aiuto dell'esperto/i....
Ho trovato questo codice che ho rimaneggiato per quelle che sono le mie 
conoscenze e sembra fornire dati attendibili:
Public Function calcoli(a1 As Double, b1 As Double, a2 As Double, b2 As 
Double, De As String, Mi As String) As Double
On Error GoTo Err_Calc
If a1 = a2 And b1 = b2 Then
calcoli = 0
Exit Function
End If
Dim x As Double
Dim negX As Double
Dim r As Single
Dim radMult As Double
Dim dblPi As Double
If De = "d" Then
dblPi = 3.14159269358979
radMult = dblPi / 180
a1 = a1 * radMult
b1 = b1 * radMult
a2 = a2 * radMult
b2 = b2 * radMult
End If
If Mi = "M" Then
  r = 3963.1
Else
  r = 6378137
End If
x = ((Cos(a1) * Cos(a2) * Cos(b1) * Cos(b2)) + (Cos(a1) * Sin(b1) * Cos(a2) 
* Sin(b2)) + (Sin(a1) * Sin(a2)))
negX = x * -1
x = Atn(negX / (Sqr((negX * x) + 1))) + 2 * Atn(1)
calcoli = x * r
Exit_Calc:
  Exit Function
Err_Calc:
  MsgBox Err.Number & " - " & Err.Description
  Resume Exit_Calc
End Function
Per il risultato ho usato la query:
SELECT DISTINCTROW tblTest0.a AS a1, tblTest0.b AS b1, tblTest0_1.a AS a2, 
tblTest0_1.b AS b2, calcoli([a1],[b1],[a2],[b2],"d","k") AS Risultato
FROM tblTest0, tblTest0 AS tblTest0_1;
la quale va rimaneggiata perchè fornisce valori duplicati non utili.
grazie
es
  tblTest0 TestID a b
      1 46,662860 12,603020
      2 46,662880 12,602919
      3 46,662962 12,602385
  d a1 b1 a2 b2 Risultato
      46,662860 12,603020 46,662860 12,603020 0
      46,662880 12,602919 46,662860 12,603020 8,03144098926222
      46,662962 12,602385 46,662860 12,603020 49,82349317781
      46,662860 12,603020 46,662880 12,602919 8,03144098926222
      46,662880 12,602919 46,662880 12,602919 0
      46,662962 12,602385 46,662880 12,602919 41,8049305461646
      46,662860 12,603020 46,662962 12,602385 49,82349317781
      46,662880 12,602919 46,662962 12,602385 41,8049305461646
      46,662962 12,602385 46,662962 12,602385 0

 wrote in message 
news:r2uBe.16338$QV1.2...@twister2.libero.it...

Ho già provato in quanto compilando il database dava errore.
Come va costruita la query ?
Ho provato con lo stesso metodo dell'altro post però da troppi risultati.
grazie
PS non mi sembra che comunque fornisca buoni dati. 

 ha scritto nel 
messaggio news:4VtBe.16330$QV1.2...@twister2.libero.it...

 A Radius ho dato 6371 (più o meno non ricordo); il resto delle funzioni 
tutte presenti e funzionanti.
Ciao, Carlo 

 PS non mi sembra che comunque fornisca buoni dati.
Come ho già scritto a Carlo Cosarella, non ho avuto mai la necessità di
usare le funzione e sub che ti ho consigliato e mi sono permesso di
segnalartele solo perché pensavo che chi le ha pubblicate (la Microsoft)
fosse attendibile.
Visto che i risultati giusti li puoi ottenere con Excel, confrantali con
quelli per capire se quelli ottenuti con Access siano o meno attendibili.
Se usi le funzioni da me segnalate prova ad aggiungere al database i
riferimenti alla libreia Microsoft Office (nel data se di esempio allegato
alla FAQ che ti ho indicato viene fatto).
In alternativa potresti aggiungere al tuo database i riferimenti a Microsoft
Excel X.X Object Library (dove X.X è = a 8.0 per Office 97, 9.0 per Office
2000 ecc. ecc.): così facendo puoi usare da Access anche le funzioni di
Excel.


 ha scritto nel
messaggio news:xxvBe.160775$75.68...@news4.tin.it...

Se la latitudine e la longitudine le hai indicate in gradi (la coversione se
la fa da sola la funzione) non saprei cosa dirti; come già detto
precedentemente non ho mai provato quelle funzioni e mi sono permesso di
segnalarle visto che chi le ha pubblicate dovrebbe essere degno di fede, ma
a quanto mi dici sembra non essere così. :(



La tua è stata un'ottima segnalazione...era proprio lì e nessuno se ne era 
accorto.
Hai provato a confrontare i risultati anche presso il link segnalato?
Nello stesso sito e questo lo dico per Marco, c'è la possibilità di 
scaricare tutte le formule usate...almeno così mi pare.
Io non mi ci metto ma a Marco potrebbe interessare e magari farci sapere 
qualcosa.
Ciao, Carlo 

 Ciao, Carlo
-- 


 wrote in message 
news:frnBe.157569$75.67...@news4.tin.it...

In un foglio di Excel:
Lat_1, Long_1
Lat_2, Long_2
sono le corrdinate di due luoghi geografici in gradi decimali
(cioè gradi+minuti/60+secondi/3600), tenendo presente che:
Lat-Nord e Long-Est > 0
Lat-Sud e Long-Ovest < 0
=DEGREES(ACOS(SIN(RADIANS(Lat_1))*SIN(RADIANS(Lat_2))+
(COS(RADIANS(Lat_1))*COS(RADIANS(Lat_2))*
COS(RADIANS(ABS(Long_1-Long_2))))))*60*50/27
La formula dà la lunghezza in Km dell'arco di
circolo massimo che li congiunge (ortodromica).
Bruno