Location.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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 : EnclosedEntity
  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. public void CopyFrom(Location location)
  44. {
  45. Longitude = location.Longitude;
  46. Latitude = location.Latitude;
  47. Timestamp = location.Timestamp;
  48. Address = location.Address;
  49. }
  50. }
  51. }