MartyConnelly
martyconnelly at shaw.ca
Fri Sep 29 20:31:35 CDT 2006
Here is one that supplies an access table on a monthly basis.
http://zipinfo.com/products/z5ll/
To calculate distances using great circle method
between lat long's. Shortest distance on a sphere.
Const PI As Double = 3.14159265358979
Const Circumference As Double = 40123.648 'kilometers
Const MilesPerKilometer As Double = 0.6214
Sub test()
Debug.Print Distance(32.815, -117.135866, 37.79333, -122.554722, True)
End Sub
Public Function Distance( _
ByVal Latitude1 As Double, _
ByVal Longitude1 As Double, _
ByVal Latitude2 As Double, _
ByVal Longitude2 As Double, _
Optional Miles As Boolean) As Double
'courtesy Lyle Fairfield
'assumes we are getting latitude-longitude
'as degrees with fractions expresed as decimals
'if minutes-seconds then use Sexagesimal function to convert
Dim CosArc As Double
Dim Arc As Double
Latitude1 = Radians(Latitude1)
Longitude1 = Radians(Longitude1)
Latitude2 = Radians(Latitude2)
Longitude2 = Radians(Longitude2)
CosArc = (Sin(Latitude1) * Sin(Latitude2)) + _
(Cos(Latitude1) * Cos(Latitude2) * Cos(Longitude1 - Longitude2))
If Abs(CosArc) = 1 Then
Arc = PI
Else
Arc = Atn(-CosArc / Sqr(-CosArc * CosArc + 1)) + 2 * Atn(1)
End If
Distance = Arc / PI / 2 * Circumference
If Miles = True Then Distance = Distance * MilesPerKilometer
Distance = Round(Distance, 2)
End Function
Private Function Radians(ByVal degrees As Double) As Double
Radians = PI * degrees / 180
End Function
Public Function SexagesimalToDecimal(ParamArray Sexagesimals()) As
Double
' send this function degrees, minutes, seconds
' degrees as convenience; degrees will not be changed
Dim z As Long
For z = 0 To UBound(Sexagesimals()) - LBound(Sexagesimals())
SexagesimalToDecimal = SexagesimalToDecimal + Sexagesimals(z)/
60 ^ (z)
Next z
End Function
Sub testsex()
Debug.Print Distance(SexagesimalToDecimal(39, 56, 58),
SexagesimalToDecimal(-75, 9, 21), 35.667, 139.75)
' Philly to Tokyo 10916.89 km
' SanFrancisco to SanDiego 460.99 miles
End Sub
Steve Capistrant wrote:
>Hello all,
>
>Sorry if this has been asked recently and I didn't pay attention. What options exist for programmatically inserting longitude and latitude values on an address record? I was told that Google had some way to return that information from their database, but can't seem to find it (perhaps if I paid for a business account). This is a task I'd do regularly (perhaps twice a month) as data gets uploaded from a local Access db into a website, where the website is coded to calculate distance between addresses.
>
>Ideally, it would be SO cool to due this by connecting to a website and looping through the recordset of an Address table. But another option I suppose is getting occasional downloads of a reference table, and use that as my lookup.
>
>Steve Capistrant
>Symphony Information Services
>scapistrant at symphonyinfo.com
>www.symphonyinfo.com
>
>
>
--
Marty Connelly
Victoria, B.C.
Canada