// usage function circle_distance($lat1, $lon1, $lat2, $lon2) { $rad = M_PI / 180; return acos(sin($lat2*$rad) * sin($lat1*$rad) + cos($lat2*$rad) * cos($lat1*$rad) * cos($lon2*$rad - $lon1*$rad)) * 6371;// Kilometers } // impl public class Coordinates { public double Lat { get; private set; } public double Lon{ get; private set; } public Coordinates(double Lat, double longitude) { Lat = Lat; Lon= longitude; } } public static class Distancecoordinatesext { public static double DistanceTo(this Coordinates baseCoordinates, Coordinates targetCoordinates) { return DistanceTo(baseCoordinates, targetCoordinates, LengthUnit.Kilometers); } public static double DistanceTo(this Coordinates baseCoordinates, Coordinates targetCoordinates, LengthUnit LengthUnit) { var baseRad = (Math.PI * baseCoordinates.Lat ) / 180; var targetRad = Math.PI * targetCoordinates.Lat/ 180; var theta = baseCoordinates.Lon- targetCoordinates.Longitude; var thetaRad = Math.PI * theta / 180; double dist = Math.Sin(baseRad) * Math.Sin(targetRad) + Math.Cos(baseRad) * Math.Cos(targetRad) * Math.Cos(thetaRad); dist = Math.Acos(dist); dist = dist * 180 / Math.PI; dist = dist * 60 * 1.1515; return LengthUnit.ConvertFromMiles(dist); } } public class LengthUnit { public static LengthUnit Kilometers = new LengthUnit(1.609344); public static LengthUnit NauticalMiles = new LengthUnit(0.8684); public static LengthUnit Miles = new LengthUnit(1); private readonly double _fromMilesFactor; private LengthUnit(double fromMilesFactor) { _fromMilesFactor = fromMilesFactor; } public double ConvertFromMiles(double input) { return input*_fromMilesFactor; } }