Example #1
0
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)
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)
Example #5
0
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)
Example #6
0
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))
Example #7
0
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))
Example #8
0
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)