Skip to content

Instantly share code, notes, and snippets.

@jammin77
Created October 19, 2014 09:10
Show Gist options
  • Save jammin77/033a332542aa24889452 to your computer and use it in GitHub Desktop.
Save jammin77/033a332542aa24889452 to your computer and use it in GitHub Desktop.
Position pos1 = new Position();
pos1.Latitude = 40.7486;
pos1.Longitude = -73.9864;
Position pos2 = new Position();
pos2.Latitude = 24.7486;
pos2.Longitude = -72.9864;
Haversine hv = new Haversine();
double result = hv.Distance(pos1, pos2, DistanceType.Kilometers);
Here is the code for the class:
using System;
namespace HaversineFormula
{
/// <summary>
/// The distance type to return the results in.
/// </summary>
public enum DistanceType { Miles, Kilometers };
/// <summary>
/// Specifies a Latitude / Longitude point.
/// </summary>
public struct Position
{
public double Latitude;
public double Longitude;
}
class Haversine
{
/// <summary>
/// Returns the distance in miles or kilometers of any two
/// latitude / longitude points.
/// </summary>
/// <param name=”pos1″></param>
/// <param name=”pos2″></param>
/// <param name=”type”></param>
/// <returns></returns>
public double Distance(Position pos1, Position pos2,DistanceType type)
{
double R = (type == DistanceType.Miles) ? 3960 : 6371;
double dLat = this.toRadian(pos2.Latitude – pos1.Latitude);
double dLon = this.toRadian(pos2.Longitude – pos1.Longitude);
double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
Math.Cos(this.toRadian(pos1.Latitude)) *Math.Cos(this.toRadian(pos2.Latitude)) *
Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a)));
double d = R * c;
return d;
}
/// <summary>
/// Convert to Radians.
/// </summary>
/// <param name=”val”></param>
/// <returns></returns>
private double toRadian(double val)
{
return (Math.PI / 180) * val;
}
}
}
@CalebVaccaro
Copy link

Awesome script, helped me with an ArcGIS Unity SDK project. Simple as well.

@RMKeene
Copy link

RMKeene commented Jan 24, 2025

An small efficiency tweak is to us the earth diameter (2 times the R in the code above) instead of R and eliminate the 2 * on line 52

So like
double D = InKillometers == DistanceType.Kilometers ? 12742 : 7918; // Earth diameter

and then

double distanceMiles = D * c;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment