Ejemplo n.º 1
0
	def _find_movement_end(self, points):
		i=len(points)-1
		while i > 0:
			p1 = json.loads(repr(self.tcx_data[i-1]))
			p2 = json.loads(repr(self.tcx_data[i]))
			time1 = dt.datetime.strptime(p1["time"], "%Y-%m-%dT%H:%M:%S.%fZ")
			time2 = dt.datetime.strptime(p2["time"], "%Y-%m-%dT%H:%M:%S.%fZ")
			time = (time2 - time1).total_seconds()
			latitude1 = None if "latitudedegrees" not in p1 else float(p1["latitudedegrees"])
			longitude1 = None if "longitudedegrees" not in p1 else float(p1["longitudedegrees"])
			latitude2 = None if "latitudedegrees" not in p2 else float(p2["latitudedegrees"])
			longitude2 = None if "longitudedegrees" not in p2 else float(p2["longitudedegrees"])
			
			if latitude1 is None and longitude1 is None: # invalid point 1
				latitude1 = 0.0 if latitude2 is None else latitude2
				longitude1 = 0.0 if longitude2 is None else longitude2
			if latitude2 is None and longitude2 is None: # invalid point 2
				latitude2 = 0.0 if latitude1 is None else latitude1
				longitude2 = 0.0 if longitude1 is None else longitude1

			dist = geo_distance((latitude1, longitude1),(latitude2, longitude2)).m
			if time>0:
				speed = dist/time
				if speed > SPEED_NO_MOVEMENT_LIMIT_M_PER_S:
					break
			i-=1

		return i			
Ejemplo n.º 2
0
    def compute_distance(self, station_id_1, station_id_2):
        lat_1 = self.stops_info[station_id_1]['stop_lat']
        lon_1 = self.stops_info[station_id_1]['stop_lon']
        lat_2 = self.stops_info[station_id_2]['stop_lat']
        lon_2 = self.stops_info[station_id_2]['stop_lon']

        distance = geo_distance((lat_1, lon_1), (lat_2, lon_2)).m
        return distance
Ejemplo n.º 3
0
 def station_distances(self, lat, lon):
     distances = []
     index = []
     for station in self.station_metadata.itertuples():
         index.append(station.Index)
         distance = geo_distance([lat,lon], [station.latitude, station.longitude]).km
         distances.append(distance)
     distances = pd.Series(distances, index=index)
     return distances
Ejemplo n.º 4
0
 def update_distance(self):
     self.distance = geo_distance(self.coordinate,
                                  self.owner.coordinate).feet
     if self.nearby:
         if self.distance > self.geo_fence:
             self.nearby = False
             self.delegate.bag_did_move_away(self)
     else:
         if self.distance < self.geo_fence:
             self.nearby = True
             self.delegate.bag_did_come_near(self)
 def _compute_matrix(target, vectors):
     result = []
     for t in target:
         res = []
         for v in vectors:
             d = geo_distance(t, v).kilometers
             res.append(d)
         result.append(res)
     if not result:
         return numpy.empty((0, 2), dtype=numpy.float32)
     return numpy.array(result, dtype=numpy.float32)
Ejemplo n.º 6
0
 def _find_movement_start(self, points):
     i = 1
     while i < len(points):
         p1 = points[i - 1]
         p2 = points[i]
         dist = geo_distance((p1.latitude, p1.longitude),
                             (p2.latitude, p2.longitude)).m
         time = (p2.time - p1.time).total_seconds()
         if time > 0:
             speed = dist / time
             if speed > SPEED_NO_MOVEMENT_LIMIT_M_PER_S:
                 break
         i += 1
     return i - 1
Ejemplo n.º 7
0
 def _find_movement_end(self, points):
     i = len(points) - 1
     while i > 0:
         p1 = self.fit_data[i - 1]
         p2 = self.fit_data[i]
         time = (p2["time"] - p1["time"]).total_seconds()
         dist = geo_distance((p1["latitude"], p1["longitude"]),
                             (p2["latitude"], p2["longitude"])).m
         if time > 0:
             speed = dist / time
             if speed > SPEED_NO_MOVEMENT_LIMIT_M_PER_S:
                 break
         i -= 1
     return i
Ejemplo n.º 8
0
def find_closest_city(lat, long, acceptable_distance=15, model_type='current'):
    ''' 
    find a the city data for "type" (current or predict) that's 
    "distance" kilometers away from
    existing city in db if it exists
    return city id of closest city within acceptable_distance
    '''
    if model_type == 'current':
        queryset = InternationalCurrent.objects.all()
    else:
        queryset = GlobalPredict.objects.all()

    min_distance = acceptable_distance + 1
    origin_coordinates = (lat, long)
    city_id = None
    # find min distance
    for city in queryset:
        distance = geo_distance(origin_coordinates,
                                (city.latitude, city.longitude))
        if distance < min_distance:
            min_distance = distance
            city_id = city.city_id
    return city_id
Ejemplo n.º 9
0
    def _process_track_points(self, points):
        track_data = list()
        split_data = list()
        summary = None
        cumulative_duration = 0.0
        cumulative_distance = 0.0
        cumulative_elevation_gain = 0.0
        start_dist_current_split = 0
        start_dur_current_split = 0
        start_ele_current_split = 0

        for idx in range(len(points)):
            if idx == 0:
                track_data.append(
                    WorkoutDataPoint(points[idx].latitude,
                                     points[idx].longitude,
                                     points[idx].elevation, points[idx].time,
                                     0, 0, 0))
                start_ele_current_split = track_data[0].elevation
            else:
                point = points[idx]
                previous_point = points[idx - 1]
                # duration
                time_diff = round(
                    (point.time - previous_point.time).total_seconds(), 1)
                cumulative_duration += time_diff
                # distance
                elevation_diff = floor(point.elevation -
                                       previous_point.elevation)
                distance_diff_2d = geo_distance(
                    (previous_point.latitude, previous_point.longitude),
                    (point.latitude, point.longitude)).m
                cumulative_distance += sqrt(distance_diff_2d**2 +
                                            (elevation_diff)**2)
                # speed & elevation gain, slightly averaged
                avg_speed_kmh = 0
                if idx > 4:
                    previous_point5 = points[idx - 5]
                    speed_elevation_diff = floor(point.elevation -
                                                 previous_point5.elevation)
                    speed_time_diff = round(
                        (point.time - previous_point5.time).total_seconds(), 1)
                    speed_dist_diff_2d = geo_distance(
                        (previous_point5.latitude, previous_point5.longitude),
                        (point.latitude, point.longitude)).m
                    speed_dist_diff_3d = sqrt(speed_dist_diff_2d**2 +
                                              (speed_elevation_diff)**2)
                    if (speed_elevation_diff /
                            5) > ELEVATION_GAIN_IGNORE_LIMIT_M:
                        cumulative_elevation_gain += (speed_elevation_diff / 5)
                    if speed_time_diff > 0:
                        avg_speed_kmh = 3.6 * speed_dist_diff_3d / speed_time_diff
                # add record
                track_data.append(
                    WorkoutDataPoint(point.latitude, point.longitude,
                                     point.elevation, point.time,
                                     cumulative_duration, cumulative_distance,
                                     avg_speed_kmh))
                # splits
                if cumulative_distance - start_dist_current_split >= SPLIT_DISTANCE_M or idx == (
                        len(points) - 1):
                    split_point = objcopy(track_data[-1])
                    split_point.distance -= start_dist_current_split
                    split_point.duration -= start_dur_current_split
                    split_point.elevation -= start_ele_current_split
                    if split_point.duration > 0:
                        split_point.average_speed = 3.6 * split_point.distance / split_point.duration
                    else:
                        split_point.average_speed = 0.0
                    split_data.append(split_point)
                    start_dist_current_split = cumulative_distance
                    start_dur_current_split = cumulative_duration
                    start_ele_current_split = track_data[-1].elevation

                # hack to set speed for first records
                if idx == 5:
                    track_data[0].average_speed = track_data[5].average_speed
                    track_data[1].average_speed = track_data[5].average_speed
                    track_data[2].average_speed = track_data[5].average_speed
                    track_data[3].average_speed = track_data[5].average_speed
                    track_data[4].average_speed = track_data[5].average_speed
        # summary
        if len(track_data) > 0:
            # summary contains: start lat./long., total elevation gain, total duration, total distance, avg speed
            first_point = points[0]
            last_track_data = track_data[-1]
            total_avg_speed_kmh = 3.6 * last_track_data.distance / last_track_data.duration
            summary = WorkoutDataPoint(
                first_point.latitude, first_point.longitude,
                cumulative_elevation_gain, first_point.time,
                last_track_data.duration, last_track_data.distance,
                total_avg_speed_kmh)

        return track_data, split_data, summary
Ejemplo n.º 10
0
    def get_track_data(self):
        if self.get_num_of_tracks() > 0:
            track_data = list()
            split_data = list()
            summary = None
            cumulative_duration = 0.0
            cumulative_distance = 0.0
            cumulative_elevation_gain = 0.0
            cumulative_heart_bpm = 0.0
            heart_rate_points = 0
            start_dist_current_split = 0
            start_dur_current_split = 0
            start_ele_current_split = 0

            for idx in range(len(self.fit_data)):
                if idx == 0:
                    point = self.fit_data[idx]
                    if point['heart_rate'] > 0:
                        cumulative_heart_bpm += point['heart_rate']
                        heart_rate_points += 1
                    track_data.append(
                        WorkoutDataPoint(point["latitude"], point["longitude"],
                                         point["elevation"], point["time"], 0,
                                         0, 0, point['heart_rate']))
                    start_ele_current_split = point["elevation"]
                else:
                    point = self.fit_data[idx]
                    previous_point = self.fit_data[idx - 1]
                    # duration
                    time_diff = round((point['time'] -
                                       previous_point['time']).total_seconds(),
                                      1)
                    cumulative_duration += time_diff
                    # distance
                    elevation_diff = floor(point['elevation'] -
                                           previous_point['elevation'])
                    distance_diff_2d = geo_distance(
                        (previous_point['latitude'],
                         previous_point['longitude']),
                        (point['latitude'], point['longitude'])).m
                    cumulative_distance += sqrt(distance_diff_2d**2 +
                                                (elevation_diff)**2)
                    # heart rate
                    if point['heart_rate'] > 0:
                        cumulative_heart_bpm += point['heart_rate']
                        heart_rate_points += 1
                    # speed & elevation gain, slightly averaged
                    avg_speed_kmh = 0
                    if idx > 4:
                        previous_point5 = self.fit_data[idx - 5]
                        speed_elevation_diff = floor(
                            point['elevation'] - previous_point5['elevation'])
                        speed_time_diff = round(
                            (point['time'] -
                             previous_point5['time']).total_seconds(), 1)
                        speed_dist_diff_2d = geo_distance(
                            (previous_point5['latitude'],
                             previous_point5['longitude']),
                            (point['latitude'], point['longitude'])).m
                        speed_dist_diff_3d = sqrt(speed_dist_diff_2d**2 +
                                                  (speed_elevation_diff)**2)
                        if (speed_elevation_diff /
                                5) > ELEVATION_GAIN_IGNORE_LIMIT_M:
                            cumulative_elevation_gain += (
                                speed_elevation_diff / 5)
                        if speed_time_diff > 0:
                            avg_speed_kmh = 3.6 * speed_dist_diff_3d / speed_time_diff
                    # add record
                    track_data.append(
                        WorkoutDataPoint(point["latitude"], point["longitude"],
                                         point["elevation"], point["time"],
                                         cumulative_duration,
                                         cumulative_distance, avg_speed_kmh,
                                         point['heart_rate']))
                    # splits
                    if cumulative_distance - start_dist_current_split >= SPLIT_DISTANCE_M or idx == (
                            len(self.fit_data) - 1):
                        split_point = objcopy(track_data[-1])
                        split_point.distance -= start_dist_current_split
                        split_point.duration -= start_dur_current_split
                        split_point.elevation -= start_ele_current_split
                        if split_point.duration > 0:
                            split_point.average_speed = 3.6 * split_point.distance / split_point.duration
                        else:
                            split_point.average_speed = 0.0
                        split_data.append(split_point)
                        start_dist_current_split = cumulative_distance
                        start_dur_current_split = cumulative_duration
                        start_ele_current_split = track_data[-1].elevation
                    # hack to set speed for first records
                    if idx == 5:
                        track_data[0].average_speed = track_data[
                            5].average_speed
                        track_data[1].average_speed = track_data[
                            5].average_speed
                        track_data[2].average_speed = track_data[
                            5].average_speed
                        track_data[3].average_speed = track_data[
                            5].average_speed
                        track_data[4].average_speed = track_data[
                            5].average_speed

            # summary
            if len(track_data) > 0:
                # summary contains: start lat./long., total elevation gain, total duration, total distance, avg speed
                first_point = track_data[0]
                last_point = track_data[-1]
                total_avg_speed_kmh = 3.6 * last_point.distance / last_point.duration
                avg_heart_rate = 0
                if heart_rate_points > 0:
                    avg_heart_rate = cumulative_heart_bpm / heart_rate_points
                summary = WorkoutDataPoint(
                    first_point.latitude, first_point.longitude,
                    cumulative_elevation_gain, first_point.time,
                    last_point.duration, last_point.distance,
                    total_avg_speed_kmh, avg_heart_rate)

            return track_data, split_data, summary

        else:  # no tracks
            return None, None, None
Ejemplo n.º 11
0
	def get_track_data(self):
		if self.get_num_of_tracks() > 0:
			track_data = list()
			split_data = list()
			summary = None
			cumulative_duration = 0.0
			cumulative_distance = 0.0
			cumulative_elevation_gain = 0.0
			cumulative_heart_bpm = 0.0
			heart_rate_points = 0
			start_dist_current_split = 0
			start_dur_current_split = 0
			start_ele_current_split = 0

			for idx in range(len(self.tcx_data)):
				if idx == 0:
					point = json.loads(repr(self.tcx_data[idx]))
					elevation = 0.0 if "altitudemeters" not in point else float(point["altitudemeters"])
					time = dt.datetime.strptime(point["time"], "%Y-%m-%dT%H:%M:%S.%fZ")
					heart_bpm = 0 if "heartratebpm" not in point else int(point["heartratebpm"])
					if heart_bpm > 0:
						cumulative_heart_bpm += heart_bpm
						heart_rate_points += 1
					
					track_data.append(WorkoutDataPoint(
						float(point["latitudedegrees"]),
						float(point["longitudedegrees"]),
						elevation,
						time,
						0, 0, 0,
						heart_bpm))
					start_ele_current_split = round(elevation, None)
				else:
					point = json.loads(repr(self.tcx_data[idx]))
					previous_point = json.loads(repr(self.tcx_data[idx-1]))
					# duration
					time = 	dt.datetime.strptime(point["time"], "%Y-%m-%dT%H:%M:%S.%fZ")
					time_previous = dt.datetime.strptime(previous_point["time"], "%Y-%m-%dT%H:%M:%S.%fZ")		
					time_diff = round((time - time_previous).total_seconds(), 1)
					cumulative_duration += time_diff
					# distance
					elevation = 0.0 if "altitudemeters" not in point else float(point["altitudemeters"])
					elevation_previous = 0.0 if "altitudemeters" not in previous_point else float(previous_point["altitudemeters"])
					elevation_diff = floor(elevation - elevation_previous)
					latitude = float(point["latitudedegrees"])
					longitude = float(point["longitudedegrees"])
					latitude_previous = float(previous_point["latitudedegrees"])
					longitude_previous = float(previous_point["longitudedegrees"])
					distance_diff_2d = geo_distance((latitude_previous, longitude_previous), (latitude, longitude)).m
					cumulative_distance += sqrt(distance_diff_2d**2 + (elevation_diff)**2)
					#heart rate
					heart_bpm = 0 if "heartratebpm" not in point else int(point["heartratebpm"])
					if heart_bpm > 0:
						cumulative_heart_bpm += heart_bpm
						heart_rate_points += 1
					# speed & elevation gain, slightly averaged
					avg_speed_kmh = 0
					if idx > 4:
						previous_point5 = json.loads(repr(self.tcx_data[idx-5]))
						elevation_previous5 = 0.0 if "altitudemeters" not in previous_point5 else float(previous_point5["altitudemeters"])
						latitude_previous5 = float(previous_point5["latitudedegrees"])
						longitude_previous5 = float(previous_point5["longitudedegrees"])
						speed_elevation_diff = floor(elevation - elevation_previous5)
						speed_time_diff = round((time - dt.datetime.strptime(previous_point5["time"], "%Y-%m-%dT%H:%M:%S.%fZ")).total_seconds(), 1)
						speed_dist_diff_2d = geo_distance((latitude_previous5, longitude_previous5), (latitude, longitude)).m
						speed_dist_diff_3d = sqrt(speed_dist_diff_2d**2 + (speed_elevation_diff)**2)
						if (speed_elevation_diff / 5) > ELEVATION_GAIN_IGNORE_LIMIT_M:
							cumulative_elevation_gain += (speed_elevation_diff / 5)
						if speed_time_diff > 0:
							avg_speed_kmh = 3.6 * speed_dist_diff_3d / speed_time_diff

					# add record
					track_data.append(WorkoutDataPoint(
						latitude,
						longitude,
						elevation,
						time,
						cumulative_duration,
						cumulative_distance,
						avg_speed_kmh,
						heart_bpm))
					# splits
					if cumulative_distance-start_dist_current_split >= SPLIT_DISTANCE_M or idx == (len(self.tcx_data)-1):
						split_point = objcopy(track_data[-1])
						split_point.distance -= start_dist_current_split
						split_point.duration -= start_dur_current_split
						split_point.elevation -= start_ele_current_split
						if split_point.duration > 0:
							split_point.average_speed = 3.6 * split_point.distance / split_point.duration
						else:
							split_point.average_speed = 0.0
						split_data.append(split_point)
						start_dist_current_split = cumulative_distance
						start_dur_current_split = cumulative_duration
						start_ele_current_split = track_data[-1].elevation
					# hack to set speed for first records
					if idx == 5:
						track_data[0].average_speed = track_data[5].average_speed
						track_data[1].average_speed = track_data[5].average_speed
						track_data[2].average_speed = track_data[5].average_speed
						track_data[3].average_speed = track_data[5].average_speed
						track_data[4].average_speed = track_data[5].average_speed

			# summary
			if len(track_data) > 0:
				# summary contains: start lat./long., total elevation gain, total duration, total distance, avg speed
				first_point = track_data[0]
				last_point = track_data[-1]
				total_avg_speed_kmh = 3.6 * last_point.distance / last_point.duration
				avg_heart_rate = 0
				if heart_rate_points > 0:
					avg_heart_rate = cumulative_heart_bpm / heart_rate_points
				summary = WorkoutDataPoint(first_point.latitude, first_point.longitude, cumulative_elevation_gain, first_point.time, last_point.duration, last_point.distance, total_avg_speed_kmh, avg_heart_rate)

			return track_data, split_data, summary
		else:
			return None, None, None
Ejemplo n.º 12
0
def earth_coord_2_local_coord(lat, lon):
    x = geo_distance((lat, lon), (lat, LOCAL_COORD_ORIGIN_LONGITUD))
    y = geo_distance((lat, lon), (LOCAL_COORD_ORIGIN_LATITUD, lon))
    return x, y