13,044,766 members (45,071 online)
alternative version

#### Stats

316.5K views
105 bookmarked
Posted 16 Dec 2005

# Distance between locations using latitude and longitude

, 16 Dec 2005
 Rate this:
Calculate the distance between two locations given their latitude and longitude.

## Introduction

This code drop is part of a Smash and Grab series. I'll bet there are a lot of other programmers out there that would like to make code available to others, but just don't want to spend hours required to create a full-blown "CodeProject" article. This is an attempt to see if I can make some useful code available to other programmers, and do it in 10 minutes. I encourage others to contribute to "Smash and Grab".

The basic rules are:

• It should be a C# class, which solves a simple problem.
• Don't waste the reader's time with GUI stuff and "`OnClick`" methods.
• If at all possible, make it a console app with a "`Main()`" that illustrates its functionality.

The point of this series is to present usable pre-canned classes or techniques which solve a real world problem without going into too much detail about how it works. I mean, who really cares about how `System.Collections.ArrayList` works, you just use it.

Please fully comment the code so that the person who really cares (and has the time) will be able to understand the underlying algorithm.

## Using the code

I wanted a .NET class which would tell me the distance between two locations. There were all sorts of bits of code out on the net which attempted to do this in JavaScript but the programmers obviously could not separate the algorithm from the GUI. This is my humble attempt at a pure non-GUI class which will calculate the distance between two locations.

```using System;
using System.Text;

public class CDistanceBetweenLocations
{
public static double Calc(double Lat1,
double Long1, double Lat2, double Long2)
{
/*
The Haversine formula according to Dr. Math.
http://mathforum.org/library/drmath/view/51879.html

dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
c = 2 * atan2(sqrt(a), sqrt(1-a))
d = R * c

Where
* dlon is the change in longitude
* dlat is the change in latitude
* c is the great circle distance in Radians.
* R is the radius of a spherical Earth.
* The locations of the two points in
spherical coordinates (longitude and
latitude) are lon1,lat1 and lon2, lat2.
*/
double dDistance = Double.MinValue;
double dLat1InRad = Lat1 * (Math.PI / 180.0);
double dLong1InRad = Long1 * (Math.PI / 180.0);
double dLat2InRad = Lat2 * (Math.PI / 180.0);
double dLong2InRad = Long2 * (Math.PI / 180.0);

// Intermediate result a.
double a = Math.Pow(Math.Sin(dLatitude / 2.0), 2.0) +
Math.Pow(Math.Sin(dLongitude / 2.0), 2.0);

// Intermediate result c (great circle distance in Radians).
double c = 2.0 * Math.Asin(Math.Sqrt(a));

// Distance.
// const Double kEarthRadiusMiles = 3956.0;
const Double kEarthRadiusKms = 6376.5;
dDistance = kEarthRadiusKms * c;

return dDistance;
}

public static double Calc(string NS1, double Lat1, double Lat1Min,
string EW1, double Long1, double Long1Min, string NS2,
double Lat2, double Lat2Min, string EW2,
double Long2, double Long2Min)
{
double NS1Sign = NS1.ToUpper() == "N" ? 1.0 : -1.0;
double EW1Sign = EW1.ToUpper() == "E" ? 1.0 : -1.0;
double NS2Sign = NS2.ToUpper() == "N" ? 1.0 : -1.0;
double EW2Sign = EW2.ToUpper() == "E" ? 1.0 : -1.0;
return (Calc(
(Lat1 + (Lat1Min / 60)) * NS1Sign,
(Long1 + (Long1Min / 60)) * EW1Sign,
(Lat2 + (Lat2Min / 60)) * NS2Sign,
(Long2 + (Long2Min / 60)) * EW2Sign
));
}

public static void Main(string[] args)
{
if (args.Length < 12)
{
System.Console.WriteLine("usage: DistanceBetweenLocations" +
" N 43 35.500 W 80 27.800 N 43 35.925 W 80 28.318");
return;
}
System.Console.WriteLine(Calc(
args[0],
System.Double.Parse(args[1]),
System.Double.Parse(args[2]),
args[3],
System.Double.Parse(args[4]),
System.Double.Parse(args[5]),
args[6],
System.Double.Parse(args[7]),
System.Double.Parse(args[8]),
args[9],
System.Double.Parse(args[10]),
System.Double.Parse(args[11])));

}

}```

Here is an MS-SQL user defined function. I never really understood why this math functionality was in SQL Server until now! You can use this function in a query statement to find the nearest Tim Horton's!!!

```CREATE FUNCTION [dbo].[DistanceBetween] (@Lat1 as real,
@Long1 as real, @Lat2 as real, @Long2 as real)
RETURNS real
AS
BEGIN

DECLARE @dLat1InRad as float(53);
SET @dLat1InRad = @Lat1 * (PI()/180.0);
DECLARE @dLong1InRad as float(53);
SET @dLong1InRad = @Long1 * (PI()/180.0);
DECLARE @dLat2InRad as float(53);
SET @dLat2InRad = @Lat2 * (PI()/180.0);
DECLARE @dLong2InRad as float(53);
SET @dLong2InRad = @Long2 * (PI()/180.0);

DECLARE @dLongitude as float(53);
DECLARE @dLatitude as float(53);
/* Intermediate result a. */
DECLARE @a as float(53);
SET @a = SQUARE (SIN (@dLatitude / 2.0)) + COS (@dLat1InRad)
* SQUARE(SIN (@dLongitude / 2.0));
/* Intermediate result c (great circle distance in Radians). */
DECLARE @c as real;
SET @c = 2.0 * ATN2 (SQRT (@a), SQRT (1.0 - @a));
DECLARE @kEarthRadius as real;
/* SET kEarthRadius = 3956.0 miles */
SET @kEarthRadius = 6376.5;        /* kms */

DECLARE @dDistance as real;
SET @dDistance = @kEarthRadius * @c;
return (@dDistance);
END```

OK, this first one took me longer than 10 minutes, but the next one won't.

## About the Author

 Software Developer (Senior) Canada
No Biography provided

 Pro

## Comments and Discussions

 First PrevNext
 My vote of 5 Bernard Chayer27-Jun-13 5:47 Bernard Chayer 27-Jun-13 5:47
 Distance between two locations using Latittude and longitude s pullareddy21-May-13 2:37 s pullareddy 21-May-13 2:37
 Thanks for this article nguyenlx9018-May-13 3:46 nguyenlx90 18-May-13 3:46
 My vote of 4 941066242219-Oct-12 20:44 9410662422 19-Oct-12 20:44
 question about the other way around omrivm12-Aug-11 5:30 omrivm 12-Aug-11 5:30
 question fithri1-Aug-11 16:50 fithri 1-Aug-11 16:50
 Re: question Gary Dryden2-Aug-11 3:46 Gary Dryden 2-Aug-11 3:46
 Question? Richardg327-Jul-11 21:24 Richardg3 27-Jul-11 21:24
 Re: Question? Gary Dryden28-Jul-11 2:58 Gary Dryden 28-Jul-11 2:58
 Simpler Trig ziopino7015-Apr-10 22:08 ziopino70 15-Apr-10 22:08
 Distance Calculator for Postgre The Swatchster6-Apr-10 6:08 The Swatchster 6-Apr-10 6:08
 Find one bug ! kingdomkao13-Jan-09 14:51 kingdomkao 13-Jan-09 14:51
 Re: Find one bug ! Member 21446195-Apr-09 5:22 Member 2144619 5-Apr-09 5:22
 Thanks Gary buttercatz13-Aug-08 6:50 buttercatz 13-Aug-08 6:50
 Thanks! Edithzor29-Jul-08 12:28 Edithzor 29-Jul-08 12:28
 Direction from one location from other using latitudes and longitudes Member 392548028-Mar-08 1:05 Member 3925480 28-Mar-08 1:05
 No nonsense - straight, working code LarsenLP7-Sep-07 0:15 LarsenLP 7-Sep-07 0:15
 Miles or Kilometers? deanj30-Jul-07 9:10 deanj 30-Jul-07 9:10
 Re: Miles or Kilometers? Gary Dryden30-Jul-07 12:33 Gary Dryden 30-Jul-07 12:33
 Finding lat and long for address sides_dale14-Mar-06 15:14 sides_dale 14-Mar-06 15:14
 Re: Finding lat and long for address Gary Dryden15-Mar-06 2:25 Gary Dryden 15-Mar-06 2:25
 You PLAGIARIZED Dr. Math's formula! Bill SerGio, The Infomercial King17-Dec-05 0:43 Bill SerGio, The Infomercial King 17-Dec-05 0:43
 A serious note about this Bill SerGio, The Infomercial King17-Dec-05 0:04 Bill SerGio, The Infomercial King 17-Dec-05 0:04
 From Bill SerGio Bill SerGio, The Infomercial King16-Dec-05 23:49 Bill SerGio, The Infomercial King 16-Dec-05 23:49
 Unit testing Marc Clifton16-Dec-05 8:40 Marc Clifton 16-Dec-05 8:40
 Re: Unit testing - C++ versus C# .NET Bill SerGio, The Infomercial King17-Dec-05 1:13 Bill SerGio, The Infomercial King 17-Dec-05 1:13
 Not as good as my article Bill SerGio, The Infomercial King16-Dec-05 5:31 Bill SerGio, The Infomercial King 16-Dec-05 5:31
 Re: Not as good as my article Harkos16-Dec-05 10:06 Harkos 16-Dec-05 10:06
 From Bill SerGio Bill SerGio, The Infomercial King17-Dec-05 1:01 Bill SerGio, The Infomercial King 17-Dec-05 1:01
 Re: From Bill SerGio Simon Capewell22-Dec-05 5:39 Simon Capewell 22-Dec-05 5:39
 Re: Not as good as my article jtstogner16-Dec-05 15:20 jtstogner 16-Dec-05 15:20
 Re: Not as good as my article Gary Dryden16-Dec-05 15:34 Gary Dryden 16-Dec-05 15:34
 Re: Not as good as my article jtstogner16-Dec-05 18:50 jtstogner 16-Dec-05 18:50
 Re: Not as good as my article Bill SerGio, The Infomercial King16-Dec-05 23:38 Bill SerGio, The Infomercial King 16-Dec-05 23:38
 Re: Not as good as my article jtstogner17-Dec-05 3:01 jtstogner 17-Dec-05 3:01
 Re: Not as good as my article Bill SerGio, The Infomercial King17-Dec-05 3:14 Bill SerGio, The Infomercial King 17-Dec-05 3:14
 Re: Not as good as my article jtstogner17-Dec-05 3:23 jtstogner 17-Dec-05 3:23
 pathetic. Was: Re: Not as good as my article frugalmail18-Dec-05 7:33 frugalmail 18-Dec-05 7:33
 Re: pathetic. Was: Re: Not as good as my article jtstogner18-Dec-05 9:29 jtstogner 18-Dec-05 9:29
 Your English is So BAD! Bill SerGio, The Infomercial King17-Dec-05 3:49 Bill SerGio, The Infomercial King 17-Dec-05 3:49
 Re: Your English is So BAD! Rick van Woudenberg15-Jul-07 23:03 Rick van Woudenberg 15-Jul-07 23:03
 Re: Your English is So BAD! Dave1975199527-Sep-07 7:07 Dave19751995 27-Sep-07 7:07
 Re: Your English is So BAD! megavolt1215-Aug-07 22:41 megavolt12 15-Aug-07 22:41
 Amercans don't support you tvproducer316-Aug-07 0:15 tvproducer3 16-Aug-07 0:15
 Re: Amercans don't support you Dave1975199527-Sep-07 7:18 Dave19751995 27-Sep-07 7:18
 Re: Not as good as my article Bill SerGio, The Infomercial King17-Dec-05 1:05 Bill SerGio, The Infomercial King 17-Dec-05 1:05
 You PLAGIARIZED Dr. Math's formula! Bill SerGio, The Infomercial King17-Dec-05 0:41 Bill SerGio, The Infomercial King 17-Dec-05 0:41
 Re: Not as good as my article Bill SerGio, The Infomercial King16-Dec-05 23:34 Bill SerGio, The Infomercial King 16-Dec-05 23:34
 Re: Not as good as my article Simon Capewell22-Dec-05 3:56 Simon Capewell 22-Dec-05 3:56
 Re: Not as good as my article Bill SerGio, The Infomercial King22-Dec-05 4:45 Bill SerGio, The Infomercial King 22-Dec-05 4:45
 Last Visit: 31-Dec-99 18:00     Last Update: 21-Jul-17 21:22 Refresh 12 Next »

General    News    Suggestion    Question    Bug    Answer    Joke    Praise    Rant    Admin

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.