__init__.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import math
  2. class Location:
  3. EARTH_RADIUS_METRES = 6.371e6
  4. def __init__(self, latitude, longitude, altitude):
  5. self.latitude = latitude
  6. self.longitude = longitude
  7. self.altitude = altitude
  8. @property
  9. def latitude_radian(self):
  10. return math.radians(self.latitude)
  11. @property
  12. def longitude_radian(self):
  13. return math.radians(self.longitude)
  14. @staticmethod
  15. def haversine(angle_rad):
  16. # http://mathworld.wolfram.com/Haversine.html
  17. return math.sin(angle_rad / 2) ** 2
  18. @staticmethod
  19. def haversine_inv(hav):
  20. # return math.atan2(math.sqrt(hav), math.sqrt(1-hav)) * 2
  21. return math.asin(math.sqrt(hav)) * 2
  22. @staticmethod
  23. def haversine_distance_metres(a, b):
  24. # https://en.wikipedia.org/wiki/Haversine_formula
  25. hav = Location.haversine(b.latitude_radian - a.latitude_radian) \
  26. + math.cos(a.latitude_radian) * math.cos(b.latitude_radian) \
  27. * Location.haversine(b.longitude_radian - a.longitude_radian)
  28. return Location.haversine_inv(hav) * Location.EARTH_RADIUS_METRES