Location.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System;
  2. namespace InABox.Core
  3. {
  4. public class UnitOfLength
  5. {
  6. public static UnitOfLength Kilometers = new UnitOfLength(1.609344);
  7. public static UnitOfLength NauticalMiles = new UnitOfLength(0.8684);
  8. public static UnitOfLength Miles = new UnitOfLength(1);
  9. private readonly double _fromMilesFactor;
  10. private UnitOfLength(double fromMilesFactor)
  11. {
  12. _fromMilesFactor = fromMilesFactor;
  13. }
  14. public double ConvertFromMiles(double input)
  15. {
  16. return input * _fromMilesFactor;
  17. }
  18. }
  19. public class Location : BaseObject, IEnclosedEntity
  20. {
  21. [DoubleEditor(Editable = Editable.Hidden, Visible = Visible.Optional)]
  22. public double Longitude { get; set; }
  23. [DoubleEditor(Editable = Editable.Hidden, Visible = Visible.Optional)]
  24. public double Latitude { get; set; }
  25. [DoubleEditor(Editable = Editable.Hidden, Visible = Visible.Optional)]
  26. public DateTime Timestamp { get; set; }
  27. [TextBoxEditor(Editable = Editable.Hidden, Visible = Visible.Optional)]
  28. public string Address { get; set; }
  29. public double DistanceTo(Location location, UnitOfLength unitOfLength)
  30. {
  31. var baseRad = Math.PI * Latitude / 180;
  32. var targetRad = Math.PI * location.Latitude / 180;
  33. var theta = Longitude - location.Longitude;
  34. var thetaRad = Math.PI * theta / 180;
  35. var dist =
  36. Math.Sin(baseRad) * Math.Sin(targetRad) + Math.Cos(baseRad) *
  37. Math.Cos(targetRad) * Math.Cos(thetaRad);
  38. dist = Math.Acos(dist);
  39. dist = dist * 180 / Math.PI;
  40. dist = dist * 60 * 1.1515;
  41. return unitOfLength.ConvertFromMiles(dist);
  42. }
  43. }
  44. }