Different straightening algorithm, dist based instead of time based.

Added a 30-meter distance check to prevent big editing disasters
but I'm not fully satisfied with this feature yet. I think this
is a little better than before though.
master
voussoir 2023-04-12 17:29:22 -07:00
parent a181d67150
commit 2899bb992d
1 changed files with 20 additions and 7 deletions

View File

@ -638,21 +638,34 @@ class TrackFragment : Fragment(), MapListener, YesNoDialog.YesNoDialogListener
fun straighten_points(a: Trkpt, b: Trkpt) fun straighten_points(a: Trkpt, b: Trkpt)
{ {
val al = a.toLocation()
val bl = b.toLocation()
val subtrack = Track(track.database, track.device_id) val subtrack = Track(track.database, track.device_id)
subtrack.load_trkpts(trackbook.database.select_trkpt_start_end( subtrack.load_trkpts(trackbook.database.select_trkpt_start_end(
track.device_id, track.device_id,
start_time=min(a.time, b.time), start_time=min(a.time, b.time),
end_time=max(a.time, b.time), end_time=max(a.time, b.time),
max_accuracy=PreferencesHelper.load_max_accuracy(),
)) ))
val lat_step = (b.latitude - a.latitude) / (b.time - a.time) val lat_span = b.latitude - a.latitude
val lon_step = (b.longitude - a.longitude) / (b.time - a.time) val lon_span = b.longitude - a.longitude
val ele_step = (b.altitude - a.altitude) / (b.time - a.time) val ele_span = b.altitude - a.altitude
for (trkpt in subtrack.trkpts) for (trkpt in subtrack.trkpts)
{ {
val index = trkpt.time - a.time val new_location = Location("test")
trkpt.latitude = a.latitude + (index * lat_step) val tl = trkpt.toLocation()
trkpt.longitude = a.longitude + (index * lon_step) val dist_a = tl.distanceTo(al)
trkpt.altitude = a.altitude + (index * ele_step) val dist_b = tl.distanceTo(bl)
val proportion = dist_a / (dist_a + dist_b)
new_location.latitude = a.latitude + (lat_span * proportion)
new_location.longitude = a.longitude + (lon_span * proportion)
if (trkpt.toLocation().distanceTo(new_location) > 30.0)
{
continue
}
trkpt.latitude = new_location.latitude
trkpt.longitude = new_location.longitude
trkpt.altitude = a.altitude + (ele_span * proportion)
trackbook.database.update_trkpt(trkpt, commit=false) trackbook.database.update_trkpt(trkpt, commit=false)
} }
trackbook.database.commit() trackbook.database.commit()