Newsgroup: it.comp.appl.access
Titolo: Trovate routines VB per il calcolo della distanza/rotta fra due due punti di coordinate.

In rete, cedute liberamente dall'autore, ho trovato delle routines per il 
calcolo della distanza e della rotta. Spero possano essere utili anche ad 
altri di voi.
Allo scopo di poterle utilizzare, volevo chiedere un aiuto.
Secondo voi che conoscete il VBA e sicuramente il VB, possono essere 
utilizzate in Access o devono essere modificate?
Se sono da modificare, potete aiutarmi ? Grazie
Domanda [OT]: come devo passare alla routine le coordinate 
Latitudine/Longitudine dei due punti, cioč come devo fargliele leggere dai 
campi tabella/query e come.
Scusate la mia ignoranza.
Tante Grazie, Bruno
--------
Public Sub Ortho(ByVal Lg1 As Single, ByVal Lt1 As Single _
    , ByVal Lg2 As Single, ByVal Lt2 As Single _
    , Radiale As Single, Distanza As Single)
'
'   Calcola la Radiale e la Distanza del punto di coordinate (Lg2, Lt2)
'   rispetto al punto con coordinate (Lg1, Lt1) su di un arco di
'   cerchio massimo (linea ortodromica).
'   Le coordinate Lg1, Lt1, Lg2, Lt2 devono essere in radianti.
'   La Distanza e' in Nautical Miles [nm].
'   La Radiale in Gradi Decimali [Grd].
'
    Dim D As Single, A As Single
'
    D = (Sin((Lt1 - Lt2) / 2!)) ^ 2 _
    + Cos(Lt1) * Cos(Lt2) * (Sin((Lg1 - Lg2) / 2!)) ^ 2
    D = 2! * Asin(Sqr(D))
'
    If D > 0! Then
        A = Acos((Sin(Lt2) - Sin(Lt1) * Cos(D)) / (Sin(D) * Cos(Lt1)))
    Else
        A = 0!
    End If
    If Sin(Lg2 - Lg1) < 0! Then A = 2! * CSng(PI) - A
'
    Radiale = (RadToGrd(A) - Declinazione + 360!) Mod 360!
'
    Distanza = R_TERRA * D
'
'
'
End Sub
Public Sub CONV(ByVal Lg1 As Single, ByVal Lt1 As Single _
    , ByVal Lg2 As Single, ByVal Lt2 As Single _
    , Velocita As Long, Rotta As Single _
    , Distanza As Single, Tempo As Single)
'
'   Calcola la Rotta e la Distanza per raggiungere il punto di
'   coordinate (Lg2,Lt2) partendo dal punto con coordinate (Lg1,Lt1).
'   Calcola anche il Tempo necessario usando la Velocita' data.
'   Le coordinate Lg1, Lt1, Lg2, Lt2 devono essere in radianti.
'   La Velocita e' in Nodi [kts]. Se = 0 viene usata e ritornata
'   la velocita' di crociera.
'   La Rotta! in Gradi Decimali [Grd].
'   La Distanza! in Nautical Miles [nm].
'   Il Tempo! in Minuti [mn].
'
    Dim x As Single, y As Single, Angolo As Single
'
    x = (Lg2 - Lg1) * Cos((Lt1 + Lt2) / 2!)
    y = Lt2 - Lt1
    If y = 0! Then y = 0.000001
'
    Angolo = Atn(x / y)
    If y < 0! Then Angolo = Angolo + CSng(PI)
    Rotta = (RadToGrd(Angolo) - Declinazione + 360!) Mod 360!
'
    Distanza = R_TERRA * Sqr(x * x + y * y)
'
    If Velocita = 0 Then Velocita = VelCrociera
    Tempo = 60! * Distanza / CSng(Velocita)
'
'
'
End Sub
Private Function Acos(ByVal X As Double) As Double
'
'   Calcola l' ArcoCoseno di x con -1 <= x <= 1.
'   Acos e' in radianti.
'
    If 0# < X And X <= 1# Then
        Acos = Atn(Sqr(1# - X * X) / X)
    ElseIf -1# <= X And X < 0# Then
        Acos = PI + Atn(Sqr(1# - X * X) / X)
    ElseIf X = 0# Then
        Acos = PI / 2#
    Else
        Err.Raise 5, "Acos Function", "Argomento illegale per Acos"
    End If
'
'
'
End Function
Public Function Asin(ByVal X As Double) As Double
'
'   Calcola l' ArcoSeno di x con -1 <= x <= 1.
'   Asin e' in radianti.
'
    If Abs(X) < 1# Then
        Asin = Atn(X / Sqr(1# - X * X))
    ElseIf X = 1# Then
        Asin = PI / 2#
    ElseIf X = -1# Then
        Asin = -PI / 2#
    Else
        Err.Raise 5, "Asin Function", "Argomento illegale per Asin"
    End If
'
'
End Function
----------------------------------------

 Tante Grazie, Bruno
In un foglio di Excel (16Kb) ho calcolato con due formule
la distanza ortodromica e la corda.
Ma non la rotta.
Se ti interessa...
Bruno 


Prova a chiedere direttamente all'autore di quelle routine:
http://www.flanguasco.org/Volpian2/Volpian2.html
Ciao, Carlo 

 Bruno
---------
Ciao Bruno, si sono interessato. Per quale scopo sei interessato 
all'ortodromica ?
Se vuoi, il file puoi inviarmelo e sarà molto gradito.
Ciao, Bruno 

 ha scritto nel 
messaggio news:ghl879$8tk$1...@tdi.cu.mi.it...

-----------
Ho scritto all'autore poco fa.
Grazie, Bruno 

 ha scritto nel messaggio 
news:493da942$0$40308$4faf...@reader5.news.tin.it...

--------------
Gentile Bruno Campanini, ti ringrazio infinitamente per il file .xls 
inviatomi e per le spiegazioni e la pazienza avuta.
Saluti, Bruno 

 ha scritto nel 
messaggio news:ghl879$8tk$1...@tdi.cu.mi.it...

--------------
Ho contattato l'autore che è disponibilissimo ad aiutarmi in VB, ma non con 
Access, in quanto non lo conosce.
Si è offerto di scrivere due righe di codice in VB per calcolare Rotta e 
distanza, ma non mi sembra il caso di dirgli di si, anche perchè a me 
interessao le routine che funzionino in Access, "la mia passione".
Certo che se qualcuno che ci capisce riuscisse a modificare o riscrivere le 
routines che ho trascritto nel post "Trovate routines VB per il calcolo 
della distanza/rotta fra due due punti di coordinate", non sarevve niente 
male.
Ciao, Bruno 

 ha scritto nel messaggio 
news:ghs11p$kd3$1...@tdi.cu.mi.it...

Fatti mandare le routine in VB che, il più delle volte, funzionano 
perfettamente anche in VBA così come sono.
Eventualmente le convertiamo.
Quando parli di Access a qualcuno del mondo VB ricorda che devi parlare di 
Visual Basic for Applications (VBA) che è una versione lite di VB.
Ciao, Carlo 

 ha scritto nel 
messaggio news:ght69o$b0e$1...@tdi.cu.mi.it...

--------->
Ciao Carlo, ecco a seguire le 4 routine (le trovi nel mio primo post con
stesso oggetto).
Magari riuscissi nell'intento di farle funzionare. A seguire delle routine
incollo anche la formula per calcolare la rotta e distanza + qualche
coordinata compresa di rotta e distanza che estrapolo da apposito programma
di navigazione della Garmin "MapSource".
Se riesci e hai fame di riuscire nell'intento, allora basta una tabella con
4 campi; il 1° con Latitudine del punto A, il 1° con Lonfitudine del punto
A,  il 3° con Latitudine del punto B, il 4° con Lonfitudine del punto B,
infine passare i dati alle routine per restituirli in un altro campo (facile
a dirlo, però non lo so applicare con VBA). Tieni conto che una routine è
utilizzata (mi sembra) per le "radiali", cioè, in termini semplici,  un
segnale che parte da una radio assistenza aeronautica (VOR) (con riferimento
al NORD) verso una stazione ricevente (aeromobile). Esempio: un'aeromobile
passa ad Ovest (270°) dalla radioassistenza con apparato selezionato su la
relativa frequenza, girando la rosa graduata dello strumento di navigazione
dell'aeromobile, questo risulterà sulla radiale 270°.
Spero di essere stato semplice e chiaro nella spiegazione. Se hai bisogno di
altri chiarimenti o qualche file con le formule, allora basta chiedere.
Spero anche nell'interessamento di altri del News.
Grazie 1000, Bruno
--------




===============================  Formula di calcolo
=============================
NAVIGAZIONE LOSSODROMICA
Sulla sfera terrestre il percorso tra due punti, che taglia i meridiani con
angolo costante, è una linea detta lossodromia.
      L'angolo costante che il percorso forma con i meridiani si dice
     rotta   lossodromica  RV o TC
      La distanza percorsa è detta
     cammino lossodromico m
N.B.  Questa distanza m tra i due punti non è la più breve sulla sfera
La navigazione lossodromica consente di risolvere due problemi:
  a.. le soluzioni possono essere analitiche o grafiche
Il II° problema
      consente di determinare
     la rotta TC e la lunghezza del percorso m
note le coordinate del punto di partenza A e quelle del punto di arrivo B
N.B. Se la distanza tra il punto di partenza e il punto di arrivo non supera
i 350 NM e per latitudini minori di 60° la soluzione dei problemi si può
svolgere in modo approssimato. Tale approssimazione non è più valida nel
caso che i due punti appartengono ad emisferi diversi.
      II° problema lossodromico
Soluzione analitica
      Dati
     coordinate del punto di partenza
     A (?A ?A)
     e coordinate del punto di arrivo
     B (?B ?B)
      si calcolano
     la rotta TC e la lunghezza del percorso m
Si calcolano in primi le differenze di latitudine e di longitudine tra il
punto di arrivo B e quello di partenza A
      ??' = ?B - ?A
     ??' = ?B - ?A
e ricava TC espressa in modo quadratale, con la seguente relazione
      TC = arctan(??' cos ?M / ??'
     con ?M = (?A + ?B) / 2
I nomi  della rotta dipendono dai nomi di ?? e di ??.
Per calcolare la distanza lossodromica m  in NM tra i due punti si usano
m  = ??' / cos TC
Esempio guidato
Risolvere il II° problema lossodromico
      conoscendo
     le coordinate del punto di partenza
     A (15°20' N   178° 25' W)
     e le coordinate del punto di arrivo
     B (18°10' N   177° 45' E )
  a.. Determinare la rotta lossodromia TC e il cammino m
      ??' = ?B - ?A
     ??' = 2°50' N = +170'
      ??' = ?B - ?A
     ??' = 356°10' E = 3°50'W = - 230'
      ?M = (?A + ?B) / 2 = (15°20'+ 18°10')/2
     ?M = 16°45'N
      TC = arctan(??' cos ?M / ??') =arctan((230' / 170) x cos 16°45')
      TC =  N 52° W = 308°
      m = ??' / cos TC = 170' cos 52°
     m = 276 NM
 =========================== Coordinate d'esempio
======================================
Punto A
Aeroporto Elmas: N39° 15' 14"  E009° 03' 39"
Punto B
San Basilio: N39° 32' 15"  E009° 11' 57"
Rotta vera: 21°  e cammino = NM (miglia nautiche) 18.2 (2= decimi di NM)
-------------------------
Punto A
Aeroporto Elmas: N39° 15' 14"  E009° 03' 39"
Punto B
Guamaggiore: N39 34 12 E009 04 22
Rotta vera: 2°  e cammino = NM (miglia nautiche) 19.0
----------------------------------------------------------------------
Punto A
Aeroporto Elmas: N39° 15' 14"  E009° 03' 39"
Punto B
Quartucciu: N39 15 11 E9 10 42
Rotta vera: 91°  e cammino = NM (miglia nautiche) 5.5 (5= decimi di NM)
-------------------------
Punto A
Aeroporto Elmas: N39° 15' 14"  E009° 03' 39"
Punto B
Gonnesa: N39 15 57.0 E8 28 15.5 (5= decimi di decondi ")
Rotta vera: 272°  e cammino = NM (miglia nautiche) 27.5
------------------------

>> interessao le routine che funzionino in Access, "la mia passione".
...
Forse non mi sono spiegato...
Voglio dire che puoi benissimo chiedere all'amico di mandarti le routine in 
VB, anche perchè si potrebbe tentare di renderle compatibili in VBA.
Personalmente saro assente una settimana ...se ne riparla il 23.
Ciao, Carlo