Need a great circle calculation

Hey all

I need a great circle calculation for vbscript.
I just got finished with determining a "nearest store locator" thanks to some help here but I am not smart enough to figure out all the "great circle"  info out there...

I have 4 coordinates

Originating Lat/Long
and
Destination Lat/Long

I need to know how to calculate the distace between those two points.

I have read about the Great Circle computation method.. but just can't wrap my head around it and I can't seem to tailor the web examples I have found into a useable VBscript.
anyone got anything?

LVL 1
gormlyAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

brother7Commented:
I found this page which gives formulas for calculating Great Circle, using both radians and degrees.
http://www.meridianworlddata.com/HTML3/great-circle-distance-3.asp

From that page:

Great Circle Distance Formula using radians:
3963.0 * arccos[sin(lat1) *  sin(lat2) + cos(lat1) * cos(lat2) * cos(lon2 - lon1)]

Great Circle Distance Formula using decimal degrees:
3963.0 * arccos[sin(lat1/57.2958) * sin(lat2/57.2958) + cos(lat1/57.2958) * cos(lat2/57.2958) *  cos(lon2/57.2958 -lon1/57.2958)]
OR
r * acos[sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon2 - lon1)]

Where r is the radius of the earth in whatever units you desire.
r=3437.74677 (statute miles)
r=6378.7 (kilometers)
r=3963.0 (normal miles)


Since there's no arccos function in VB, you'll have to use the arctan (Atn, in VB) version, as described on the page.

Assume long/lat is in radians and the result GD is in normal miles.  In VBScript, try this:

<SCRIPT LANGUAGE="VBScript">
<!--
Dim lon1, lat1, lon2, lat2, x, GD

x = sin(lat1) *  sin(lat2) + cos(lat1) * cos(lat2) * cos(lon2 - lon1)
GD = 3963.0 * atn(sqrt(1-x^2))/x)
-->
</SCRIPT>

Hope that helps.
0
gormlyAuthor Commented:
I am getting some screwy numbers


(my variable names)

Origin: +41.144496 (tLong) -073.343261  (tLat)
Destination: +41.571496 (tLong2) -73.044035  (tLat2)

my code is:

x = sin(tLat) *  sin(tLat2) + cos(tLat) * cos(tLat2) * cos(tLong2- tLong)
GD = 3963.0 * atn(sqr(1-x^2))/x

which translates to:

x = sin(-73.044035) *  sin(-073.343261) + cos(-73.044035) * cos(-073.343261) * cos(41.571496  - 41.144496)
GD = 3963.0 * atn(sqr(1-x^2))/x

I get:
1544.11124783767  Not hardly since it is about 40 miles away.
What am I doing wrong here?

(had to change to sqr cause sqrt isn't valid in vbscript)

I already tried something like that before with similar results.. maybe my values aren't correct?
Whats a Radian?
0
gormlyAuthor Commented:
I spent some time on that page and I tried this as well:

x = 69.1 * (tlat2 - tlat)
y = 69.1 * (tlong2 - tlong) * cos(tlat/57.3)
GD = sqr(x * x + y * y)

and STILL get the wacky numbers.

This is frustrating.
I am missing something , I know it.

I have tried MANY variations on what the page is describing and cannot get this to be accurate.
0
Cloud Class® Course: C++ 11 Fundamentals

This course will introduce you to C++ 11 and teach you about syntax fundamentals.

brother7Commented:
It looks like your original data is given in degrees, not radians.  The algorithm I gave applies if the data is in radians.  There's a different formula to use if the data is in degrees.

A quick tutorial on degrees and radians...
If you travel the circumference of a circle, you travel 360 degree.  This is also equal to 2 * PI radians.
To convert from degrees to radians, you multiply by (2 * PI) / 360 or PI / 180 , which approximately equals 1 / 57.2958.
In other words, to convert from degrees to radians, you divide by 57.2958.

Example:
41 degrees = 41/57.2958 radians = 0.7156 radians

Lemme try using the algorithm for degrees on your data and I'll let you know what I come up with.
0
gormlyAuthor Commented:
cool cause this is driving me nuts..

I have tried everything (I am not a math guy as you can tell)

also I will up the points for the extra effort, I am REALLY glad I am a member here.
0
brother7Commented:
Since I'm using VB.NET now, I tried coding the algorithm using your initial data.  The result I got was 22.389071 mi or 36.036631 km.  Does that look correct?  VB.NET is similar to VBScript, so you should be able to understand it.  I've attached my code below.

--- Code Start ---

   Sub Main()
      Const DegToRad As Double = 57.29578
      Dim tLong, tLat, tLong2, tLat2, x, GD As Double

      tLong = 41.144496
      tLat = -73.343261
      tLong2 = 41.571496
      tLat2 = -73.044035

      x = (Math.Sin(tLat / DegToRad) * Math.Sin(tLat2 / DegToRad)) + _
      (Math.Cos(tLat / DegToRad) * Math.Cos(tLat2 / DegToRad) * Math.Cos(tLong2 / DegToRad - tLong / DegToRad))

      GD = 3963.0 * Math.Atan(Math.Sqrt(1 - x ^ 2) / x)

      Console.WriteLine(GD)

   End Sub ' Main

--- Code End ---
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
brother7Commented:
Just for kicks, I did the same calculations for the 2 approximation formulas given at the top of the webpage.  The results were:

1st approximation = 30.654209 mi
2nd approximation = 22.339349 mi
true Great Distance = 22.389071 mi

In addition, I plugged your numbers into an online Great Circle calculator, found at http://www.gb3pi.org.uk/great.html
and it said 22.4 mi.
0
gormlyAuthor Commented:
Looks pretty close to me
I took the milage and compared it to a map search at mapquest and it looks right
(obviously it is "off" due to driving distances and not "as the crow flies")

Thanks so much!

I ended up using:
    DegToRad = 57.29578
      Dim x, GD

      x = (Sin(tLat / DegToRad) * Sin(tLat2 / DegToRad)) +(Cos(tLat / DegToRad) * Cos(tLat2 / DegToRad) * Cos(tLong2 / DegToRad - tLong / DegToRad))
      GD = 3963.0 * atn(Sqr(1 - x ^ 2) / x)

fantastic, thank you so much for saving me time...
No on to find the latest Zip Code database with Lat/Lon for free!!
I got one at the census from 1999 but it is outdated.

Thanks much!
points are doubled

although still not what this was worth (a lot) , sorry gotta be prudent, I have a lot of questions :>  
0
brother7Commented:
Thanks for the points :)

I've got WAY too much time on my hands... did a little surfing and came up with this:
http://www.cfdynamics.com/zipbase/
http://www.kchost.net/media/  (look at ZipCodes.mdb)

Enjoy!
0
brother7Commented:
0
gormlyAuthor Commented:
WOW!  Cool  thanks.

and to think, some companies want to charge big bucks for this!
bassttards!

thanks for the extra effort, you should be bottled and sold on the open market in a late night infomercial as..

"The Ultimate Time saver!"

act now.. limited time offer.. operators standing by.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
ASP

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.