def interpolate()

in mapillary_tools/process_sequence_properties.py [0:0]


def interpolate(sequence: GPXSequence, interpolate_directions: bool) -> GPXSequence:
    interpolated: GPXSequence = []
    for cur, nex in pairwise(sequence):
        # should interpolate or not
        if interpolate_directions or cur.angle is None:
            new_bearing = compute_bearing(cur.lat, cur.lon, nex.lat, nex.lon)
            new_desc = T.cast(
                types.ImageDescriptionFile,
                {
                    **cur.desc,
                    "MAPCompassHeading": {
                        "TrueHeading": new_bearing,
                        "MagneticHeading": new_bearing,
                    },
                },
            )
            interpolated.append(_GPXPoint(new_desc))
        else:
            interpolated.append(cur)

    if interpolated:
        assert len(interpolated) == len(sequence) - 1
    else:
        assert len(sequence) <= 1

    # interpolate the last image's angle
    # can interpolate or not
    if 2 <= len(sequence) and interpolated[-1] is not None:
        # should interpolate or not
        if interpolate_directions or sequence[-1] is None:
            new_desc = T.cast(
                types.ImageDescriptionFile,
                {
                    **sequence[-1].desc,
                    "MAPCompassHeading": {
                        "TrueHeading": interpolated[-1].angle,
                        "MagneticHeading": interpolated[-1].angle,
                    },
                },
            )
            interpolated.append(_GPXPoint(new_desc))
        else:
            interpolated.append(sequence[-1])
    else:
        interpolated.append(sequence[-1])

    assert len(interpolated) == len(sequence)

    return interpolated