Browse Source

Added delta location to determine the distance moved, pluss bugs

Joachim M. Giæver 7 years ago
parent
commit
349346b68e
1 changed files with 34 additions and 7 deletions
  1. 34 7
      gps/gps.py

+ 34 - 7
gps/gps.py

@@ -2,6 +2,7 @@ try:
     import machine
     import time
     import struct
+    import math
 except:
     pass
 
@@ -77,7 +78,12 @@ class Position(Value):
         '''
         Returns a new position with the subtracted value
         '''
-        return Position(self.value() - other.value())
+        u = self.unit()
+
+        if self.unit() != other.unit():
+            u += "/" + other.unit()
+
+        return Position(self.value() - other.value(), u, self.time())
 
 class Speed(Value):
     '''
@@ -306,37 +312,37 @@ class Location(object):
         '''
         Returns the longitude.
         '''
-        return self.__lat.value() if self.__lat is not None else False
+        return self.__lat if self.__lat is not None else False
 
     def latitude(self):
         '''
         Returns the latitude
         '''
-        return self.__long.value() if self.__long is not None else False
+        return self.__long if self.__long is not None else False
 
     def altitude(self):
         '''
         Returns the altitude
         '''
-        return self.__alt.value() if self.__alt is not None else False
+        return self.__alt if self.__alt is not None else False
 
     def height(self):
         '''
         Returns the height
         '''
-        return self.__height.value() if self.__height is not None else False
+        return self.__height if self.__height is not None else False
 
     def speed(self):
         '''
         Returns the speed
         '''
-        return self.__speed.value() if self.__speed is not None else False
+        return self.__speed if self.__speed is not None else False
 
     def course(self):
         '''
         Returns the course
         '''
-        return self.__course.value() if self.__course is not None else False
+        return self.__course if self.__course is not None else False
 
     def satellites(self):
         '''
@@ -350,6 +356,27 @@ class Location(object):
         '''
         return self.__hdop if self.__hdop is not None else False
 
+    def delta(self, other):
+        '''
+        Checks the delta between this location and other location.
+        Returns float with distance in meters
+        '''
+        earth_r = 6371000.0
+
+        # radians
+        lat1r = self.latitude().rad()
+        lat2r = other.latitude().rad()
+
+        # delta-radians
+        latdr = lat2r - lat1r
+        longdr = (other.longitude() - self.longitude()).rad()
+
+        a1 = (math.sin(latdr / 2) * math.sin(latdr / 2))
+        a2 = (math.cos(lat1r) * math.cos(lat2r))
+        a3 = (math.sin(longdr / 2) * math.sin(longdr / 2))
+        a = a1 + a2 * a3
+        return earth_r * (2 * math.atan2(math.sqrt(a), math.sqrt(1-a)))
+
 
 class Data(object):
     '''