public struct GeoCoordinate {
public GeoCoordinate(double lat, double lon){
public override string ToString() {
return $"Latitude: {Lat}, Longitude: {Lon}";
public static void Main()
GeoCoordinate p1 = new GeoCoordinate(60.188865200000000000000000000, 24.905851100000000000000000000);
GeoCoordinate p2 = new GeoCoordinate(61.0813404016871, 25.0358895057222);
double dist = p1.CalculateDistance(p2);
Console.WriteLine($"Distance: {dist}");
public static class GExtensions {
public static double CalculateDistance(this GeoCoordinate startingCoordinate, GeoCoordinate toCoordinate)
Console.WriteLine($"startingCoordinate: {startingCoordinate}");
Console.WriteLine($"toCoordinate: {toCoordinate}");
const int earthMeanRadius = 6378137;
const double radiansToDegrees = Math.PI / 180;
Console.WriteLine($"Radians to degrees: {radiansToDegrees}");
Console.WriteLine($"Delta latitude: {toCoordinate.Lat - startingCoordinate.Lat}");
Console.WriteLine($"Delta longitude: {toCoordinate.Lon - startingCoordinate.Lon}");
var deltaLatitude = (double)(toCoordinate.Lat - startingCoordinate.Lat) * radiansToDegrees;
var deltaLongitude = (double)(toCoordinate.Lon - startingCoordinate.Lon) * radiansToDegrees;
Console.WriteLine($"deltaLatitude to degrees: {deltaLatitude}");
Console.WriteLine($"deltaLongitude to degrees: {deltaLongitude}");
var startLatitudeDegrees = (double) startingCoordinate.Lat * radiansToDegrees;
var toLatitudeDegrees = (double) toCoordinate.Lat * radiansToDegrees;
Console.WriteLine($"startLatitudeDegrees: {startLatitudeDegrees}");
Console.WriteLine($"toLatitudeDegrees: {toLatitudeDegrees}");
var distanceLatitudeCosine = Math.Cos(startLatitudeDegrees) * Math.Cos(toLatitudeDegrees);
Console.WriteLine($"distanceLatitudeCosine: {distanceLatitudeCosine}");
var haversineLatitude = Math.Pow(Math.Sin(deltaLatitude / 2), 2);
var haversineLongitude = Math.Pow(Math.Sin(deltaLongitude / 2), 2);
Console.WriteLine($"haversineLatitude: {(decimal)haversineLatitude}");
Console.WriteLine($"haversineLongitude: {(decimal)haversineLongitude}");
var appliedFormulae = haversineLatitude + distanceLatitudeCosine * haversineLongitude;
Console.WriteLine($"appliedFormulae: {(decimal)appliedFormulae}");
var c = 2 * Math.Atan2(Math.Sqrt(appliedFormulae), Math.Sqrt(1 - appliedFormulae));
Console.WriteLine($"c: {c}");
var distanceInMeters = earthMeanRadius * c;
Console.WriteLine($"distanceInMeters: {distanceInMeters} meters");
return distanceInMeters / 1000;