From 1e0bb81a38b70e97c8f01431e4cd632970b87b72 Mon Sep 17 00:00:00 2001 From: y20k Date: Tue, 24 Mar 2020 15:26:01 +0100 Subject: [PATCH] plausibility check for the first location (which sometimes can be wrong) --- app/src/main/java/org/y20k/trackbook/Keys.kt | 1 + .../trackbook/helpers/LengthUnitHelper.kt | 13 +++++++++++ .../y20k/trackbook/helpers/LocationHelper.kt | 22 ++++++++++++++++++- .../org/y20k/trackbook/helpers/TrackHelper.kt | 15 ++++++++++--- build.gradle | 4 ++-- 5 files changed, 49 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/y20k/trackbook/Keys.kt b/app/src/main/java/org/y20k/trackbook/Keys.kt index 8eb0ae7..9119e0c 100644 --- a/app/src/main/java/org/y20k/trackbook/Keys.kt +++ b/app/src/main/java/org/y20k/trackbook/Keys.kt @@ -99,6 +99,7 @@ object Keys { const val ADD_WAYPOINT_TO_TRACK_INTERVAL: Long = 15000L // 15 seconds in milliseconds const val SIGNIFICANT_TIME_DIFFERENCE: Long = 120000L // 2 minutes in milliseconds const val STOP_OVER_THRESHOLD: Long = 300000L // 5 minutes in milliseconds + const val IMPLAUSIBLE_TRACK_START_SPEED: Double = 250.0 // 250 km/h const val DEFAULT_LATITUDE: Double = 71.172500 // latitude Nordkapp, Norway const val DEFAULT_LONGITUDE: Double = 25.784444 // longitude Nordkapp, Norway const val DEFAULT_ACCURACY: Float = 300f // in meters diff --git a/app/src/main/java/org/y20k/trackbook/helpers/LengthUnitHelper.kt b/app/src/main/java/org/y20k/trackbook/helpers/LengthUnitHelper.kt index 96f8106..1e5bc0d 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/LengthUnitHelper.kt +++ b/app/src/main/java/org/y20k/trackbook/helpers/LengthUnitHelper.kt @@ -92,4 +92,17 @@ object LengthUnitHelper { return imperialSystemCountries.contains(countryCode) } + + /* Coverts meters per second to either km/h or mph */ + fun convertMetersPerSecond(metersPerSecond: Float, useImperial: Boolean = false): Double { + if (useImperial) { + // mph + return metersPerSecond * 2.2369362920544 + } else { + // km/h + return metersPerSecond * 3.6 + } + } + + } \ No newline at end of file diff --git a/app/src/main/java/org/y20k/trackbook/helpers/LocationHelper.kt b/app/src/main/java/org/y20k/trackbook/helpers/LocationHelper.kt index 534c53d..04243e2 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/LocationHelper.kt +++ b/app/src/main/java/org/y20k/trackbook/helpers/LocationHelper.kt @@ -155,6 +155,26 @@ object LocationHelper { } + /* Checks if the first location of track is plausible */ + fun isFirstLocationPlausible(secondLocation: Location, track: Track): Boolean { + // speed in km/h + val speed: Double = calculateSpeed(firstLocation = track.wayPoints[0].toLocation(), secondLocation = secondLocation, firstTimestamp = track.recordingStart.time, secondTimestamp = GregorianCalendar.getInstance().time.time) + // plausible = speed under 250 km/h + return speed < Keys.IMPLAUSIBLE_TRACK_START_SPEED + } + + + /* Calculates speed */ + private fun calculateSpeed(firstLocation: Location, secondLocation: Location, firstTimestamp: Long, secondTimestamp: Long, useImperial: Boolean = false): Double { + // time difference in seconds + val timeDifference: Long = (secondTimestamp - firstTimestamp) / 1000L + // distance in meters + val distance: Float = calculateDistance(firstLocation, secondLocation) + // speed in either km/h (default) or mph + return LengthUnitHelper.convertMetersPerSecond(distance / timeDifference, useImperial) + } + + /* Checks if given location is different enough compared to previous location */ fun isDifferentEnough(previousLocation: Location?, location: Location): Boolean { // check if previous location is (not) available @@ -173,7 +193,7 @@ object LocationHelper { } - /* Calculates distance between two locations */ + /* Calculates distance in meters between two locations */ fun calculateDistance(previousLocation: Location?, location: Location): Float { var distance: Float = 0f // two data points needed to calculate distance diff --git a/app/src/main/java/org/y20k/trackbook/helpers/TrackHelper.kt b/app/src/main/java/org/y20k/trackbook/helpers/TrackHelper.kt index 84d366c..6e28c9b 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/TrackHelper.kt +++ b/app/src/main/java/org/y20k/trackbook/helpers/TrackHelper.kt @@ -46,13 +46,22 @@ object TrackHelper { /* Adds given locatiom as waypoint to track */ fun addWayPointToTrack(track: Track, location: Location, locationAccuracyThreshold: Int, resumed: Boolean): Pair { - // get previous location val previousLocation: Location? - val numberOfWayPoints: Int = track.wayPoints.size + var numberOfWayPoints: Int = track.wayPoints.size + + // CASE: First location if (numberOfWayPoints == 0) { previousLocation = null - } else { + } + // CASE: Second location - check if first location was plausible & remove implausible location + else if (numberOfWayPoints == 1 && !LocationHelper.isFirstLocationPlausible(location, track)) { + previousLocation = null + numberOfWayPoints = 0 + track.wayPoints.removeAt(0) + } + // CASE: Third location or second location (if first was plausible) + else { previousLocation = track.wayPoints.get(numberOfWayPoints - 1).toLocation() } diff --git a/build.gradle b/build.gradle index f42cf58..d8e0fa0 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.61' + ext.kotlin_version = '1.3.71' repositories { google() jcenter() @@ -10,7 +10,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.6.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.2.0" + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.2.1" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }