def add_distance_bearing(df_task): """ Add columns for bearing and distance (and cumsum) """ df_task['Bearing'] = np.nan df_task['DistanceToGo'] = np.nan for idx in df_task.index[:-1]: (lat1, lon1) = (df_task.loc[idx, 'Lat'], df_task.loc[idx, 'Lon']) (lat2, lon2) = (df_task.loc[idx + 1, 'Lat'], df_task.loc[idx + 1, 'Lon']) df_task.loc[idx, 'Bearing'] = haversine_bearing(lat1, lon1, lat2, lon2) df_task.loc[idx, 'DistanceToGo'] = haversine_distance(lat1, lon1, lat2, lon2) df_task['DistanceToGoSum'] = df_task['DistanceToGo'].shift(1).fillna(0).cumsum() df_task['DistanceToGoSumRev'] = df_task['DistanceToGo'].sum() - df_task['DistanceToGoSum'] return(df_task)
def calculate_data(df_points, m=1, g=9.81): df_points['Lat2'] = df_points['Lat'].shift(1) df_points['Lon2'] = df_points['Lon'].shift(1) df_points['Speed'] = 1000 * df_points.apply(lambda pt: haversine_distance(pt['Lat'], pt['Lon'], pt['Lat2'], pt['Lon2']), axis=1) / df_points['Deltatime'] df_points['Speed'] = df_points['Speed'].fillna(0.0) df_points.drop(['Lat2', 'Lon2'], axis=1, inplace=True) df_points['Ec'] = 0.5 * m * df_points['Speed']**2 # kinetic energy df_points['Ep'] = m * g * df_points['Altitude'] - m * g * df_points['Altitude'].iloc[0] # potential energy df_points['Em'] = df_points['Ec'] + df_points['Ep'] df_points['Vz'] = (df_points['Altitude'] - df_points['Altitude'].shift(1)) / df_points['Deltatime'] df_points['Vz'] = df_points['Vz'].fillna(0.0) df_points['Vz_comp'] = (df_points['Em'] - df_points['Em'].shift(1)) / (df_points['Deltatime'] * m *g) df_points['Vz_comp'] = df_points['Vz_comp'].fillna(0.0) return(df_points)
def add_distance_bearing(df_task): """ Add columns for bearing and distance (and cumsum) """ df_task['Bearing'] = np.nan df_task['DistanceToGo'] = np.nan for idx in df_task.index[:-1]: (lat1, lon1) = (df_task.loc[idx, 'Lat'], df_task.loc[idx, 'Lon']) (lat2, lon2) = (df_task.loc[idx + 1, 'Lat'], df_task.loc[idx + 1, 'Lon']) df_task.loc[idx, 'Bearing'] = haversine_bearing(lat1, lon1, lat2, lon2) df_task.loc[idx, 'DistanceToGo'] = haversine_distance( lat1, lon1, lat2, lon2) df_task['DistanceToGoSum'] = df_task['DistanceToGo'].shift(1).fillna( 0).cumsum() df_task['DistanceToGoSumRev'] = df_task['DistanceToGo'].sum( ) - df_task['DistanceToGoSum'] return (df_task)
def calculate_data(df_points, m=1, g=9.81): df_points['Lat2'] = df_points['Lat'].shift(1) df_points['Lon2'] = df_points['Lon'].shift(1) df_points['Speed'] = 1000 * df_points.apply( lambda pt: haversine_distance(pt['Lat'], pt['Lon'], pt['Lat2'], pt[ 'Lon2']), axis=1) / df_points['Deltatime'] df_points['Speed'] = df_points['Speed'].fillna(0.0) df_points.drop(['Lat2', 'Lon2'], axis=1, inplace=True) df_points['Ec'] = 0.5 * m * df_points['Speed']**2 # kinetic energy df_points['Ep'] = m * g * df_points['Altitude'] - m * g * df_points[ 'Altitude'].iloc[0] # potential energy df_points['Em'] = df_points['Ec'] + df_points['Ep'] df_points['Vz'] = (df_points['Altitude'] - df_points['Altitude'].shift(1)) / df_points['Deltatime'] df_points['Vz'] = df_points['Vz'].fillna(0.0) df_points['Vz_comp'] = (df_points['Em'] - df_points['Em'].shift(1)) / ( df_points['Deltatime'] * m * g) df_points['Vz_comp'] = df_points['Vz_comp'].fillna(0.0) return (df_points)
def main(igc_filename, z_mode, outdir, disp, use_c): basepath = os.path.dirname(__file__) if outdir == '': outdir = os.path.join(basepath, 'out') z_mode = z_mode.lower() assert z_mode in ['baro', 'gps'] print("Reading '%s'" % igc_filename) filename = igc_filename filename_base, filename_ext = os.path.splitext(os.path.basename(filename)) df_all = pd.read_csv(filename, header=None, names=['Data']) df_all['FirstChar'] = df_all['Data'].map(lambda s: s[0]) print(df_all['FirstChar'].value_counts()) df_task = df_all[df_all['FirstChar'] == 'C'].copy() df_points = df_all[df_all['FirstChar'] == 'B'].copy() Npts = len(df_points) df_points.index = np.arange(Npts) #s = 'B1005364607690N00610358EA0000001265' #print(s) #dat = igc_b_line_to_tuple(s) #print(dat) s_tuple = df_points['Data'].map(igc_b_line_to_tuple) m = 100 g = 9.81 first_date = datetime.date.today() # ToFix df_points['Time'] = s_tuple.map(lambda t: t[0]) df_points['TimeSup'] = (df_points['Time'] < df_points['Time'].shift(1)).astype(int).cumsum() df_points['Time'] = df_points['Time'].map( lambda t: datetime.datetime.combine(first_date, t)) df_points['Time'] = df_points[ 'Time'] + df_points['TimeSup'] * datetime.timedelta(days=1) df_points['Deltatime'] = df_points['Time'] - df_points['Time'].shift(1) #df_points['Deltatime'] = df_points['Deltatime'].fillna(np.timedelta64(0, 's')) df_points['Deltatime'] = df_points['Deltatime'] / np.timedelta64(1, 's') print(df_points['Deltatime'].value_counts()) #df_points['Deltatime'] = 10 # seconds df_points['Lat'] = s_tuple.map(lambda t: t[1]) df_points['Lon'] = s_tuple.map(lambda t: t[2]) df_points['Lat2'] = df_points['Lat'].shift(1) df_points['Lon2'] = df_points['Lon'].shift(1) df_points['Speed'] = 1000 * df_points.apply( lambda pt: haversine_distance(pt['Lat'], pt['Lon'], pt['Lat2'], pt[ 'Lon2']), axis=1) / df_points['Deltatime'] df_points['Speed'] = df_points['Speed'].fillna(0.0) df_points['Speed_km/h'] = df_points['Speed'] * 3.6 df_points.drop(['Lat2', 'Lon2'], axis=1, inplace=True) df_points['Ec'] = 0.5 * m * df_points['Speed']**2 # kinetic energy df_points['Z_mode'] = s_tuple.map(lambda t: t[3][0]) df_points['Z_baro'] = s_tuple.map(lambda t: t[3][1]) df_points['Z_gps'] = s_tuple.map(lambda t: t[3][2]) df_points['Altitude'] = df_points["Z_%s" % z_mode] df_points['Vz'] = (df_points['Altitude'] - df_points['Altitude'].shift(1)) / df_points['Deltatime'] df_points['Vz'] = df_points['Vz'].fillna(0.0) df_points['Ep'] = m * g * df_points['Altitude'] - m * g * df_points[ 'Altitude'].loc[0] # potential energy df_points['Em'] = df_points['Ec'] + df_points['Ep'] df_points['Vz_comp'] = (df_points['Em'] - df_points['Em'].shift(1)) / ( df_points['Deltatime'] * m * g) df_points['Vz_comp'] = df_points['Vz_comp'].fillna(0.0) """ Ep = m g z Ec = 1/2 m v^2 Em = Ep + Ec dEm / dt = m g dz/dt + d/dt (1/2 m v^2) VzComp = ( dEm / dt) * 1 / (m * g) = dz/dt + 1/(2*g) * d/dt(v^2) = Vz + VzK with VzK = 1/(2*g) * d/dt(v^2) """ df_points['Name'] = "" df_points.loc[0, "Name"] = "Start" df_points.loc[Npts - 1, "Name"] = "Finish" df_points = df_points.set_index('Time') print("Points:\n%s" % df_points) print("Max speed: %f km/h" % df_points['Speed_km/h'].max()) print("Max Vz: %f" % df_points['Vz'].max()) print("Min Vz: %f" % df_points['Vz'].min()) print("Max Vz_comp: %f" % df_points['Vz_comp'].max()) print("Min Vz_comp: %f" % df_points['Vz_comp'].min()) if len(df_task) == 0 or not use_c: print("No C record - using first and last point") df_task = df_points[df_points['Name'] != ""].copy() df_task = df_task.reset_index() else: df_task['Data'] = df_task['Data'].map(igc_c_line_to_tuple) df_task = df_task[df_task['Data'].notnull()].copy() df_task.index = np.arange(len(df_task)) df_task['Lat'] = df_task['Data'].map(lambda t: t[0]) df_task['Lon'] = df_task['Data'].map(lambda t: t[1]) df_task['Name'] = df_task['Data'].map(lambda t: t[2]) df_task['Altitude'] = 0 print("Task:\n%s" % df_task) points_to_kml_with_yattag(df_points, df_task, outdir, filename_base, disp)
def main(debug, waypoints_filename, output, outdir, disp, lat, lon, dist, dist_unit): basepath = os.path.dirname(__file__) if outdir=='': outdir = os.path.join(basepath, 'out') # Translate path like {Condor} using paths_default d_name = paths_default.copy() d_name['output'] = output waypoints_filename = waypoints_filename.format(**d_name) outdir = outdir.format(**d_name) if not os.path.exists(outdir): print("Create directory %s" % outdir) os.makedirs(outdir) lst_errors = [] filenames = glob.glob(waypoints_filename) N_filenames = len(filenames) print("") print("="*20) print("") for i, filename in enumerate(filenames): try: logging.info("Read file %03d/%03d '%s'" % (i+1, N_filenames, filename)) filename_base, filename_ext = os.path.splitext(os.path.basename(filename)) if debug: assert filename_ext in supported_input_extensions, \ "File extension of '%s' is '%s' but supported extension must be in %s" \ % (filename, filename_ext, supported_input_extensions) cols = ['Name', 'Code', 'Country', 'Latitude', 'Longitude', 'Elevation', 'Waypoint style', 'Runway direction', 'Runway length', 'Airport Frequency', 'Description'] df_waypoints = pd.read_csv(filename, names=cols) df_waypoints = df_waypoints.rename(columns={ 'Latitude': 'Lat', 'Longitude': 'Lon', 'Elevation': 'Altitude', }) #print(df_waypoints) # ToDo: rename columns # ToDo: map columns (at least Lat, Lon) # ToDo: create kml file df_waypoints['Waypoint style'] = df_waypoints['Waypoint style'].map(WaypointStyle) df_waypoints['Lat'] = df_waypoints['Lat'].map(latlon2decimal) df_waypoints['Lon'] = df_waypoints['Lon'].map(latlon2decimal) df_waypoints['Altitude'] = df_waypoints['Altitude'].map(dist2quantity) df_waypoints['Runway length'] = df_waypoints['Runway length'].map(dist2quantity) df_waypoints['Distance'] = df_waypoints.apply(lambda wpt: haversine_distance(lat, lon, wpt['Lat'], wpt['Lon']), axis=1) df_waypoints['Distance'] = df_waypoints['Distance'].map(lambda d: Q_(d, "km")) df_waypoints = df_waypoints.sort(columns=['Distance']) df_waypoints = df_waypoints[df_waypoints['Distance'] <= Q_(dist, dist_unit)] print(df_waypoints) print("Creating KML file (please wait)") task_to_kml_with_yattag(df_waypoints, outdir, filename_base) # Too many markers!!! # Sol: filter with distance from a given point # Sol: Use Google Maps instead # see https://developers.google.com/maps/articles/toomanymarkers except: logging.error(traceback.format_exc()) lst_errors.append(filename) print("") print("="*20) print("") N_error = len(lst_errors) print("Convert %d files - %d errors" % (N_filenames, N_error)) for i, filename_error in enumerate(lst_errors): print(" * %03d / %03d: %s" % (i+1, N_error, filename_error))
def main(debug, waypoints_filename, output, outdir, disp, lat, lon, dist, dist_unit): basepath = os.path.dirname(__file__) if outdir == '': outdir = os.path.join(basepath, 'out') # Translate path like {Condor} using paths_default d_name = paths_default.copy() d_name['output'] = output waypoints_filename = waypoints_filename.format(**d_name) outdir = outdir.format(**d_name) if not os.path.exists(outdir): print("Create directory %s" % outdir) os.makedirs(outdir) lst_errors = [] filenames = glob.glob(waypoints_filename) N_filenames = len(filenames) print("") print("=" * 20) print("") for i, filename in enumerate(filenames): try: logging.info("Read file %03d/%03d '%s'" % (i + 1, N_filenames, filename)) filename_base, filename_ext = os.path.splitext( os.path.basename(filename)) if debug: assert filename_ext in supported_input_extensions, \ "File extension of '%s' is '%s' but supported extension must be in %s" \ % (filename, filename_ext, supported_input_extensions) cols = [ 'Name', 'Code', 'Country', 'Latitude', 'Longitude', 'Elevation', 'Waypoint style', 'Runway direction', 'Runway length', 'Airport Frequency', 'Description' ] df_waypoints = pd.read_csv(filename, names=cols) df_waypoints = df_waypoints.rename(columns={ 'Latitude': 'Lat', 'Longitude': 'Lon', 'Elevation': 'Altitude', }) #print(df_waypoints) # ToDo: rename columns # ToDo: map columns (at least Lat, Lon) # ToDo: create kml file df_waypoints['Waypoint style'] = df_waypoints[ 'Waypoint style'].map(WaypointStyle) df_waypoints['Lat'] = df_waypoints['Lat'].map(latlon2decimal) df_waypoints['Lon'] = df_waypoints['Lon'].map(latlon2decimal) df_waypoints['Altitude'] = df_waypoints['Altitude'].map( dist2quantity) df_waypoints['Runway length'] = df_waypoints['Runway length'].map( dist2quantity) df_waypoints['Distance'] = df_waypoints.apply( lambda wpt: haversine_distance(lat, lon, wpt['Lat'], wpt['Lon'] ), axis=1) df_waypoints['Distance'] = df_waypoints['Distance'].map( lambda d: Q_(d, "km")) df_waypoints = df_waypoints.sort(columns=['Distance']) df_waypoints = df_waypoints[ df_waypoints['Distance'] <= Q_(dist, dist_unit)] print(df_waypoints) print("Creating KML file (please wait)") task_to_kml_with_yattag(df_waypoints, outdir, filename_base) # Too many markers!!! # Sol: filter with distance from a given point # Sol: Use Google Maps instead # see https://developers.google.com/maps/articles/toomanymarkers except: logging.error(traceback.format_exc()) lst_errors.append(filename) print("") print("=" * 20) print("") N_error = len(lst_errors) print("Convert %d files - %d errors" % (N_filenames, N_error)) for i, filename_error in enumerate(lst_errors): print(" * %03d / %03d: %s" % (i + 1, N_error, filename_error))
def main(igc_filename, z_mode, outdir, disp, use_c): basepath = os.path.dirname(__file__) if outdir=='': outdir = os.path.join(basepath, 'out') z_mode = z_mode.lower() assert z_mode in ['baro', 'gps'] print("Reading '%s'" % igc_filename) filename = igc_filename filename_base, filename_ext = os.path.splitext(os.path.basename(filename)) df_all = pd.read_csv(filename, header=None, names=['Data']) df_all['FirstChar'] = df_all['Data'].map(lambda s: s[0]) print(df_all['FirstChar'].value_counts()) df_task = df_all[df_all['FirstChar']=='C'].copy() df_points = df_all[df_all['FirstChar']=='B'].copy() Npts = len(df_points) df_points.index = np.arange(Npts) #s = 'B1005364607690N00610358EA0000001265' #print(s) #dat = igc_b_line_to_tuple(s) #print(dat) s_tuple = df_points['Data'].map(igc_b_line_to_tuple) m = 100 g = 9.81 first_date = datetime.date.today() # ToFix df_points['Time'] = s_tuple.map(lambda t: t[0]) df_points['TimeSup'] = (df_points['Time'] < df_points['Time'].shift(1)).astype(int).cumsum() df_points['Time'] = df_points['Time'].map(lambda t: datetime.datetime.combine(first_date, t)) df_points['Time'] = df_points['Time'] + df_points['TimeSup'] * datetime.timedelta(days=1) df_points['Deltatime'] = df_points['Time'] - df_points['Time'].shift(1) #df_points['Deltatime'] = df_points['Deltatime'].fillna(np.timedelta64(0, 's')) df_points['Deltatime'] = df_points['Deltatime'] / np.timedelta64(1, 's') print(df_points['Deltatime'].value_counts()) #df_points['Deltatime'] = 10 # seconds df_points['Lat'] = s_tuple.map(lambda t: t[1]) df_points['Lon'] = s_tuple.map(lambda t: t[2]) df_points['Lat2'] = df_points['Lat'].shift(1) df_points['Lon2'] = df_points['Lon'].shift(1) df_points['Speed'] = 1000 * df_points.apply(lambda pt: haversine_distance(pt['Lat'], pt['Lon'], pt['Lat2'], pt['Lon2']), axis=1) / df_points['Deltatime'] df_points['Speed'] = df_points['Speed'].fillna(0.0) df_points['Speed_km/h'] = df_points['Speed'] * 3.6 df_points.drop(['Lat2', 'Lon2'], axis=1, inplace=True) df_points['Ec'] = 0.5 * m * df_points['Speed']**2 # kinetic energy df_points['Z_mode'] = s_tuple.map(lambda t: t[3][0]) df_points['Z_baro'] = s_tuple.map(lambda t: t[3][1]) df_points['Z_gps'] = s_tuple.map(lambda t: t[3][2]) df_points['Altitude'] = df_points["Z_%s" % z_mode] df_points['Vz'] = (df_points['Altitude'] - df_points['Altitude'].shift(1)) / df_points['Deltatime'] df_points['Vz'] = df_points['Vz'].fillna(0.0) df_points['Ep'] = m * g * df_points['Altitude'] - m * g * df_points['Altitude'].loc[0] # potential energy df_points['Em'] = df_points['Ec'] + df_points['Ep'] df_points['Vz_comp'] = (df_points['Em'] - df_points['Em'].shift(1)) / (df_points['Deltatime'] * m *g) df_points['Vz_comp'] = df_points['Vz_comp'].fillna(0.0) """ Ep = m g z Ec = 1/2 m v^2 Em = Ep + Ec dEm / dt = m g dz/dt + d/dt (1/2 m v^2) VzComp = ( dEm / dt) * 1 / (m * g) = dz/dt + 1/(2*g) * d/dt(v^2) = Vz + VzK with VzK = 1/(2*g) * d/dt(v^2) """ df_points['Name'] = "" df_points.loc[0, "Name"] = "Start" df_points.loc[Npts-1, "Name"] = "Finish" df_points = df_points.set_index('Time') print("Points:\n%s" % df_points) print("Max speed: %f km/h" % df_points['Speed_km/h'].max()) print("Max Vz: %f" % df_points['Vz'].max()) print("Min Vz: %f" % df_points['Vz'].min()) print("Max Vz_comp: %f" % df_points['Vz_comp'].max()) print("Min Vz_comp: %f" % df_points['Vz_comp'].min()) if len(df_task)==0 or not use_c: print("No C record - using first and last point") df_task = df_points[df_points['Name'] != ""].copy() df_task = df_task.reset_index() else: df_task['Data'] = df_task['Data'].map(igc_c_line_to_tuple) df_task = df_task[df_task['Data'].notnull()].copy() df_task.index = np.arange(len(df_task)) df_task['Lat'] = df_task['Data'].map(lambda t: t[0]) df_task['Lon'] = df_task['Data'].map(lambda t: t[1]) df_task['Name'] = df_task['Data'].map(lambda t: t[2]) df_task['Altitude'] = 0 print("Task:\n%s" % df_task) points_to_kml_with_yattag(df_points, df_task, outdir, filename_base, disp)