Chapter 7 Exercise 20

20. Create a function to compute the great circle route (shortest) distance between two geographic locations.

This function has been embedded in the module code for a while. Modules: Misc, Function: GeogDistance The formula is relatively complex, but available on the Internet

Function GeogDistance(lat1 As Variant, lon1 As Variant, lat2 As
Variant, lon2 As Variant) As Single
    On Error GoTo ERR_GDistance
' Computes great circle route distance between any two geographic points.
' Latitude and Longitude are passed in degrees (West is negative and South is negative).
' Distance is based on average radius of the earth (about 1/10 % difference).
   Dim t1 As Double
   Const Pi = 3.14159265358979
   Const DEGTORAD = 57.29577951 � 180/PI
   Const MILESDEG = 69.04958853 � Average (statutory) miles per degree
      ' 69.1638889 for equator; 68.93177881 for polar
   If (IsNull(lat1) Or IsNull(lon1) Or IsNull(lat2) Or IsNull(lon2)) Then
      GeogDistance = 30000  ' missing data, so return a big number
      Exit Function
   End If
   t1 = sIn(lat1 / DEGTORAD) * sIn(lat2 / DEGTORAD) + Cos(lat1 / DEGTORAD) * Cos(lat2 / DEGTORAD) * Cos((lon1 - lon2) / DEGTORAD)
   ' VBA does not have Acos, so use Atn instead: Acos = Pi/2 - Atn(x / sqrt(1 - x*x) )
   ' Note that VBA help has the formula wrong!
   GeogDistance = MILESDEG * DEGTORAD * (Pi / 2 - Atn(t1 / Sqr(1 - t1 * t1)))
EXIT_GDistance:
   Exit Function
ERR_GDistance:
   If (t1 < 0) Then
      GeogDistance = 180 * MILESDEG * DEGTORAD
   Else
      GeogDistance = 0
   End If
   Resume EXIT_GDistance
End Function