From 53d6bd0c079112c20834e8605bf605b6064504e5 Mon Sep 17 00:00:00 2001 From: thePanz Date: Thu, 19 Sep 2013 00:39:34 +0200 Subject: [PATCH 1/9] Added distance and elevation (min/max) computation --- res/values/strings.xml | 4 ++ .../osmtracker/activity/TrackDetail.java | 14 +++++ .../android/osmtracker/db/model/Track.java | 62 +++++++++++++++++++ .../android/osmtracker/util/DistanceUtil.java | 26 ++++++++ 4 files changed, 106 insertions(+) create mode 100644 src/me/guillaumin/android/osmtracker/util/DistanceUtil.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 05b8dcf47..9faf0d205 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -53,6 +53,10 @@ Track Details Start time: End time: + Distance: + Km + Elevation(min/max): + Speed(min/max): Starts at: Ends at: Exported: diff --git a/src/me/guillaumin/android/osmtracker/activity/TrackDetail.java b/src/me/guillaumin/android/osmtracker/activity/TrackDetail.java index 8d593294e..017f1897c 100644 --- a/src/me/guillaumin/android/osmtracker/activity/TrackDetail.java +++ b/src/me/guillaumin/android/osmtracker/activity/TrackDetail.java @@ -2,6 +2,7 @@ import java.sql.Date; import java.text.DateFormat; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -155,6 +156,19 @@ protected void onResume() { map.put(ITEM_KEY, getResources().getString(R.string.trackdetail_enddate)); map.put(ITEM_VALUE, t.getEndDateAsString()); data.add(map); + + DecimalFormat df = new DecimalFormat("####0.00"); + // Distance + map = new HashMap(); + map.put(ITEM_KEY, getResources().getString(R.string.trackdetail_distance)); + map.put(ITEM_VALUE, df.format(t.getDistance()/1000) + " " +getResources().getString(R.string.trackdetail_distance_unit)); + data.add(map); + + // Elevation + map = new HashMap(); + map.put(ITEM_KEY, getResources().getString(R.string.trackdetail_elevation)); + map.put(ITEM_VALUE, df.format(t.getElevationMin()) + " / " + df.format(t.getElevationMax())); + data.add(map); // Start point map = new HashMap(); diff --git a/src/me/guillaumin/android/osmtracker/db/model/Track.java b/src/me/guillaumin/android/osmtracker/db/model/Track.java index aeb992e9f..b6c415f33 100644 --- a/src/me/guillaumin/android/osmtracker/db/model/Track.java +++ b/src/me/guillaumin/android/osmtracker/db/model/Track.java @@ -9,6 +9,7 @@ import me.guillaumin.android.osmtracker.R; import me.guillaumin.android.osmtracker.db.TrackContentProvider; import me.guillaumin.android.osmtracker.db.TrackContentProvider.Schema; +import me.guillaumin.android.osmtracker.util.DistanceUtil; import android.content.ContentResolver; import android.database.Cursor; @@ -57,6 +58,8 @@ public static OSMVisibility fromPosition(int position) { private Long startDate=null, endDate=null; private Float startLat=null, startLong=null, endLat=null, endLong=null; + private Double distance=0.0; + private Float elevationMax=0.0f,elevationMin=0.0f; private boolean extraInformationRead = false; @@ -117,10 +120,54 @@ private void readExtraInformation(){ } endCursor.close(); + readExtraInformation_stats(); + extraInformationRead = true; } } + /** + * + * @todo: allow to exclude zero speed values + */ + private void readExtraInformation_stats() { + Cursor cursor = cr.query(TrackContentProvider.trackPointsUri(trackId), null, null, null, null); + Float latitudeCurrent, longitudeCurrent, latitudePrev, longitudePrev; + + Float elevationCurr, speedMax, speedMin, speedCurr; + + if(cursor != null && cursor.moveToFirst()) { + // Initialize the min/max values + elevationMin = elevationMax = cursor.getFloat(cursor.getColumnIndex(Schema.COL_ELEVATION)); + speedMin = speedMax = cursor.getFloat(cursor.getColumnIndex(Schema.COL_SPEED)); + latitudePrev = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LATITUDE)); + longitudePrev = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LONGITUDE)); + + // Iterate over all points + while (cursor.moveToNext()) { + latitudeCurrent = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LATITUDE)); + longitudeCurrent = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LONGITUDE)); + distance += DistanceUtil.getDistance(latitudePrev, longitudePrev, latitudeCurrent, longitudeCurrent); + + latitudePrev = latitudeCurrent; + longitudePrev = longitudeCurrent; + + // Compute the Elevation + elevationCurr = cursor.getFloat(cursor.getColumnIndex(Schema.COL_ELEVATION)); + elevationMin = Math.min(elevationMin, elevationCurr); + elevationMax = Math.max(elevationMax, elevationCurr); + + // Compute the Speed + speedCurr = cursor.getFloat(cursor.getColumnIndex(Schema.COL_SPEED)); + speedMin = Math.min(speedMin, speedCurr); + speedMax = Math.max(speedMax, speedCurr); + } + + cursor.close(); + } + } + + public void setName(String name) { this.name = name; } @@ -177,6 +224,21 @@ public Integer getTpCount() { return tpCount; } + public Double getDistance() { + readExtraInformation(); + return distance; + } + + public Float getElevationMin() { + readExtraInformation(); + return elevationMin; + } + + public Float getElevationMax() { + readExtraInformation(); + return elevationMax; + } + public String getName() { if (name != null && name.length() > 0) { return name; diff --git a/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java b/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java new file mode 100644 index 000000000..ce1ea1aa7 --- /dev/null +++ b/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java @@ -0,0 +1,26 @@ +package me.guillaumin.android.osmtracker.util; + +public class DistanceUtil { + + private static final double DEG2RAD = Math.PI / 180.0; + // private static final double RAD2DEG = 180.0 / Math.PI; + private static final double RADIUS_EARTH_METERS = 6371.01; + + /** + * Computes the distance with Spherical Law of Cosines + * http://www.movable-type.co.uk/scripts/latlong.html + * @param lat1 + * @param lon1 + * @param lat2 + * @param lon2 + * @return The distance (in meters) between point1 and point2 + */ + public static double getDistance(final double lat1, final double lon1, final double lat2, final double lon2) { + double theta = lon1 - lon2; + double a = Math.sin(DEG2RAD * lat1) * Math.sin(DEG2RAD * lat2); + double b = Math.cos(DEG2RAD * lat1) * Math.cos(DEG2RAD * lat2) * Math.cos(DEG2RAD * theta); + + return Math.acos(a + b) * RADIUS_EARTH_METERS; + } + +} From 0b5869fe7c0013fc39f3cd5191d9fea973bdc17e Mon Sep 17 00:00:00 2001 From: thePanz Date: Thu, 19 Sep 2013 01:04:14 +0200 Subject: [PATCH 2/9] Fix: fixed wrong RADIUS_EARTH_METERS value --- src/me/guillaumin/android/osmtracker/util/DistanceUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java b/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java index ce1ea1aa7..e7db7e1d8 100644 --- a/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java +++ b/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java @@ -4,7 +4,7 @@ public class DistanceUtil { private static final double DEG2RAD = Math.PI / 180.0; // private static final double RAD2DEG = 180.0 / Math.PI; - private static final double RADIUS_EARTH_METERS = 6371.01; + private static final double RADIUS_EARTH_METERS = 6378137.0; /** * Computes the distance with Spherical Law of Cosines From f059d3f75c7afa560bba5ea6c0636a1bc914b5bf Mon Sep 17 00:00:00 2001 From: thePanz Date: Thu, 19 Sep 2013 13:54:36 +0200 Subject: [PATCH 3/9] Fixes for numeric types (using Float instead of Double) Added getDistance() given two GeoPoints --- .../android/osmtracker/util/DistanceUtil.java | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java b/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java index e7db7e1d8..12afcaa14 100644 --- a/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java +++ b/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java @@ -1,10 +1,12 @@ package me.guillaumin.android.osmtracker.util; +import org.osmdroid.api.IGeoPoint; + public class DistanceUtil { private static final double DEG2RAD = Math.PI / 180.0; // private static final double RAD2DEG = 180.0 / Math.PI; - private static final double RADIUS_EARTH_METERS = 6378137.0; + private static final int RADIUS_EARTH_METERS = 6378137; /** * Computes the distance with Spherical Law of Cosines @@ -15,12 +17,27 @@ public class DistanceUtil { * @param lon2 * @return The distance (in meters) between point1 and point2 */ - public static double getDistance(final double lat1, final double lon1, final double lat2, final double lon2) { - double theta = lon1 - lon2; - double a = Math.sin(DEG2RAD * lat1) * Math.sin(DEG2RAD * lat2); - double b = Math.cos(DEG2RAD * lat1) * Math.cos(DEG2RAD * lat2) * Math.cos(DEG2RAD * theta); + public static float getDistance(final float lat1, final float lon1, final float lat2, final float lon2) { + final double theta = lon1 - lon2; + final double a = Math.sin(DEG2RAD * lat1) * Math.sin(DEG2RAD * lat2); + final double b = Math.cos(DEG2RAD * lat1) * Math.cos(DEG2RAD * lat2) * Math.cos(DEG2RAD * theta); - return Math.acos(a + b) * RADIUS_EARTH_METERS; + return (float) (Math.acos(a + b) * RADIUS_EARTH_METERS); + } + + /** + * Computes the distance with Spherical Law of Cosines + * http://www.movable-type.co.uk/scripts/latlong.html + * @param point1 + * @param point2 + * @return The distance (in meters) between point1 and point2 + */ + public static float getDistance(final IGeoPoint point1, final IGeoPoint point2) { + final float lat1 = (float) (point1.getLatitudeE6() / 1E6); + final float lon1 = (float) (point1.getLongitudeE6() / 1E6); + final float lat2 = (float) (point2.getLatitudeE6() / 1E6); + final float lon2 = (float) (point2.getLongitudeE6() / 1E6); + + return getDistance(lat1, lon1, lat2, lon2); } - } From 4ad22883a4e13352189216ad3305c594f0df507e Mon Sep 17 00:00:00 2001 From: thePanz Date: Thu, 19 Sep 2013 13:55:22 +0200 Subject: [PATCH 4/9] Using Float for distance computation instead of Double --- src/me/guillaumin/android/osmtracker/db/model/Track.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/me/guillaumin/android/osmtracker/db/model/Track.java b/src/me/guillaumin/android/osmtracker/db/model/Track.java index b6c415f33..71c01ea06 100644 --- a/src/me/guillaumin/android/osmtracker/db/model/Track.java +++ b/src/me/guillaumin/android/osmtracker/db/model/Track.java @@ -58,7 +58,7 @@ public static OSMVisibility fromPosition(int position) { private Long startDate=null, endDate=null; private Float startLat=null, startLong=null, endLat=null, endLong=null; - private Double distance=0.0; + private Float distance=0.0f; private Float elevationMax=0.0f,elevationMin=0.0f; private boolean extraInformationRead = false; @@ -224,7 +224,7 @@ public Integer getTpCount() { return tpCount; } - public Double getDistance() { + public Float getDistance() { readExtraInformation(); return distance; } From 87bf1f3a2767a8b52c4ae41d6b013af9e35a191f Mon Sep 17 00:00:00 2001 From: thePanz Date: Thu, 19 Sep 2013 14:06:32 +0200 Subject: [PATCH 5/9] Added speed (GPS data) display --- .../android/osmtracker/activity/TrackDetail.java | 6 ++++++ .../android/osmtracker/db/model/Track.java | 13 ++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/me/guillaumin/android/osmtracker/activity/TrackDetail.java b/src/me/guillaumin/android/osmtracker/activity/TrackDetail.java index 017f1897c..474e6f053 100644 --- a/src/me/guillaumin/android/osmtracker/activity/TrackDetail.java +++ b/src/me/guillaumin/android/osmtracker/activity/TrackDetail.java @@ -170,6 +170,12 @@ protected void onResume() { map.put(ITEM_VALUE, df.format(t.getElevationMin()) + " / " + df.format(t.getElevationMax())); data.add(map); + // Speed + map = new HashMap(); + map.put(ITEM_KEY, getResources().getString(R.string.trackdetail_speed)); + map.put(ITEM_VALUE, df.format(t.getSpeedMin()) + " / " + df.format(t.getSpeedMax())); + data.add(map); + // Start point map = new HashMap(); map.put(ITEM_KEY, getResources().getString(R.string.trackdetail_startloc)); diff --git a/src/me/guillaumin/android/osmtracker/db/model/Track.java b/src/me/guillaumin/android/osmtracker/db/model/Track.java index 71c01ea06..575e7d062 100644 --- a/src/me/guillaumin/android/osmtracker/db/model/Track.java +++ b/src/me/guillaumin/android/osmtracker/db/model/Track.java @@ -60,6 +60,7 @@ public static OSMVisibility fromPosition(int position) { private Float startLat=null, startLong=null, endLat=null, endLong=null; private Float distance=0.0f; private Float elevationMax=0.0f,elevationMin=0.0f; + private Float speedMax=0.0f, speedMin=0.0f; private boolean extraInformationRead = false; @@ -134,7 +135,7 @@ private void readExtraInformation_stats() { Cursor cursor = cr.query(TrackContentProvider.trackPointsUri(trackId), null, null, null, null); Float latitudeCurrent, longitudeCurrent, latitudePrev, longitudePrev; - Float elevationCurr, speedMax, speedMin, speedCurr; + Float elevationCurr, speedCurr; if(cursor != null && cursor.moveToFirst()) { // Initialize the min/max values @@ -238,6 +239,16 @@ public Float getElevationMax() { readExtraInformation(); return elevationMax; } + + public Float getSpeedMax() { + readExtraInformation(); + return speedMax; + } + + public Float getSpeedMin() { + readExtraInformation(); + return speedMin; + } public String getName() { if (name != null && name.length() > 0) { From 1b25ff1a1492acd32378e3a6c915c0a3ab89b306 Mon Sep 17 00:00:00 2001 From: thePanz Date: Thu, 19 Sep 2013 14:33:46 +0200 Subject: [PATCH 6/9] Added option to avoid counting zero-value speeds --- .../android/osmtracker/db/model/Track.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/me/guillaumin/android/osmtracker/db/model/Track.java b/src/me/guillaumin/android/osmtracker/db/model/Track.java index 575e7d062..51bce2927 100644 --- a/src/me/guillaumin/android/osmtracker/db/model/Track.java +++ b/src/me/guillaumin/android/osmtracker/db/model/Track.java @@ -137,10 +137,14 @@ private void readExtraInformation_stats() { Float elevationCurr, speedCurr; + boolean avoidZeroSpeed = true; + if(cursor != null && cursor.moveToFirst()) { // Initialize the min/max values elevationMin = elevationMax = cursor.getFloat(cursor.getColumnIndex(Schema.COL_ELEVATION)); - speedMin = speedMax = cursor.getFloat(cursor.getColumnIndex(Schema.COL_SPEED)); + speedMax = cursor.getFloat(cursor.getColumnIndex(Schema.COL_SPEED)); + speedMin = (avoidZeroSpeed && speedMax == 0) ? Float.MAX_VALUE : speedMax; + latitudePrev = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LATITUDE)); longitudePrev = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LONGITUDE)); @@ -160,8 +164,10 @@ private void readExtraInformation_stats() { // Compute the Speed speedCurr = cursor.getFloat(cursor.getColumnIndex(Schema.COL_SPEED)); - speedMin = Math.min(speedMin, speedCurr); - speedMax = Math.max(speedMax, speedCurr); + if (!avoidZeroSpeed || speedCurr > 0) { + speedMin = Math.min(speedMin, speedCurr); + speedMax = Math.max(speedMax, speedCurr); + } } cursor.close(); @@ -247,7 +253,8 @@ public Float getSpeedMax() { public Float getSpeedMin() { readExtraInformation(); - return speedMin; + // Avoid returning inconsistent min-speed if "avoidZeroSpeed" is set to true + return (speedMin > speedMax) ? 0.0f : speedMin; } public String getName() { From fb9d3b07a465432bac0a483f325b6510d013c7ef Mon Sep 17 00:00:00 2001 From: thePanz Date: Thu, 19 Sep 2013 14:42:00 +0200 Subject: [PATCH 7/9] Added speed (Km/h) and elevation (m) units with localized formetter --- res/values/strings.xml | 2 ++ .../guillaumin/android/osmtracker/activity/TrackDetail.java | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 9faf0d205..4a2bc0451 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -56,7 +56,9 @@ Distance: Km Elevation(min/max): + m Speed(min/max): + Km/h Starts at: Ends at: Exported: diff --git a/src/me/guillaumin/android/osmtracker/activity/TrackDetail.java b/src/me/guillaumin/android/osmtracker/activity/TrackDetail.java index 474e6f053..78070acbc 100644 --- a/src/me/guillaumin/android/osmtracker/activity/TrackDetail.java +++ b/src/me/guillaumin/android/osmtracker/activity/TrackDetail.java @@ -157,7 +157,7 @@ protected void onResume() { map.put(ITEM_VALUE, t.getEndDateAsString()); data.add(map); - DecimalFormat df = new DecimalFormat("####0.00"); + DecimalFormat df = new DecimalFormat("#,##0.00"); // Distance map = new HashMap(); map.put(ITEM_KEY, getResources().getString(R.string.trackdetail_distance)); @@ -167,13 +167,13 @@ protected void onResume() { // Elevation map = new HashMap(); map.put(ITEM_KEY, getResources().getString(R.string.trackdetail_elevation)); - map.put(ITEM_VALUE, df.format(t.getElevationMin()) + " / " + df.format(t.getElevationMax())); + map.put(ITEM_VALUE, df.format(t.getElevationMin()) + " / " + df.format(t.getElevationMax()) + " " +getResources().getString(R.string.trackdetail_elevation_unit)); data.add(map); // Speed map = new HashMap(); map.put(ITEM_KEY, getResources().getString(R.string.trackdetail_speed)); - map.put(ITEM_VALUE, df.format(t.getSpeedMin()) + " / " + df.format(t.getSpeedMax())); + map.put(ITEM_VALUE, df.format(t.getSpeedMin() * 3.6) + " / " + df.format(t.getSpeedMax() * 3.6) + " " + getResources().getString(R.string.trackdetail_speed_unit)); data.add(map); // Start point From 90ba53ac1b124c941bef3a3973f4b4a106ae333f Mon Sep 17 00:00:00 2001 From: thePanz Date: Thu, 19 Sep 2013 15:15:03 +0200 Subject: [PATCH 8/9] Fix: do not compute Track statistics when not needed! --- .../android/osmtracker/db/model/Track.java | 95 ++++++++++--------- 1 file changed, 48 insertions(+), 47 deletions(-) diff --git a/src/me/guillaumin/android/osmtracker/db/model/Track.java b/src/me/guillaumin/android/osmtracker/db/model/Track.java index 51bce2927..b4d2b1027 100644 --- a/src/me/guillaumin/android/osmtracker/db/model/Track.java +++ b/src/me/guillaumin/android/osmtracker/db/model/Track.java @@ -63,6 +63,7 @@ public static OSMVisibility fromPosition(int position) { private Float speedMax=0.0f, speedMin=0.0f; private boolean extraInformationRead = false; + private boolean extraInformationRead_stats = false; private ContentResolver cr; @@ -121,8 +122,6 @@ private void readExtraInformation(){ } endCursor.close(); - readExtraInformation_stats(); - extraInformationRead = true; } } @@ -132,46 +131,48 @@ private void readExtraInformation(){ * @todo: allow to exclude zero speed values */ private void readExtraInformation_stats() { - Cursor cursor = cr.query(TrackContentProvider.trackPointsUri(trackId), null, null, null, null); - Float latitudeCurrent, longitudeCurrent, latitudePrev, longitudePrev; - - Float elevationCurr, speedCurr; - - boolean avoidZeroSpeed = true; - - if(cursor != null && cursor.moveToFirst()) { - // Initialize the min/max values - elevationMin = elevationMax = cursor.getFloat(cursor.getColumnIndex(Schema.COL_ELEVATION)); - speedMax = cursor.getFloat(cursor.getColumnIndex(Schema.COL_SPEED)); - speedMin = (avoidZeroSpeed && speedMax == 0) ? Float.MAX_VALUE : speedMax; - - latitudePrev = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LATITUDE)); - longitudePrev = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LONGITUDE)); - - // Iterate over all points - while (cursor.moveToNext()) { - latitudeCurrent = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LATITUDE)); - longitudeCurrent = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LONGITUDE)); - distance += DistanceUtil.getDistance(latitudePrev, longitudePrev, latitudeCurrent, longitudeCurrent); - - latitudePrev = latitudeCurrent; - longitudePrev = longitudeCurrent; - - // Compute the Elevation - elevationCurr = cursor.getFloat(cursor.getColumnIndex(Schema.COL_ELEVATION)); - elevationMin = Math.min(elevationMin, elevationCurr); - elevationMax = Math.max(elevationMax, elevationCurr); - - // Compute the Speed - speedCurr = cursor.getFloat(cursor.getColumnIndex(Schema.COL_SPEED)); - if (!avoidZeroSpeed || speedCurr > 0) { - speedMin = Math.min(speedMin, speedCurr); - speedMax = Math.max(speedMax, speedCurr); - } - } - - cursor.close(); - } + if(!extraInformationRead_stats){ + Cursor cursor = cr.query(TrackContentProvider.trackPointsUri(trackId), null, null, null, null); + Float latitudeCurrent, longitudeCurrent, latitudePrev, longitudePrev; + + Float elevationCurr, speedCurr; + + boolean avoidZeroSpeed = true; + + if(cursor != null && cursor.moveToFirst()) { + // Initialize the min/max values + elevationMin = elevationMax = cursor.getFloat(cursor.getColumnIndex(Schema.COL_ELEVATION)); + speedMax = cursor.getFloat(cursor.getColumnIndex(Schema.COL_SPEED)); + speedMin = (avoidZeroSpeed && speedMax == 0) ? Float.MAX_VALUE : speedMax; + + latitudePrev = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LATITUDE)); + longitudePrev = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LONGITUDE)); + + // Iterate over all points + while (cursor.moveToNext()) { + latitudeCurrent = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LATITUDE)); + longitudeCurrent = cursor.getFloat(cursor.getColumnIndex(Schema.COL_LONGITUDE)); + distance += DistanceUtil.getDistance(latitudePrev, longitudePrev, latitudeCurrent, longitudeCurrent); + + latitudePrev = latitudeCurrent; + longitudePrev = longitudeCurrent; + + // Compute the Elevation + elevationCurr = cursor.getFloat(cursor.getColumnIndex(Schema.COL_ELEVATION)); + elevationMin = Math.min(elevationMin, elevationCurr); + elevationMax = Math.max(elevationMax, elevationCurr); + + // Compute the Speed + speedCurr = cursor.getFloat(cursor.getColumnIndex(Schema.COL_SPEED)); + if (!avoidZeroSpeed || speedCurr > 0) { + speedMin = Math.min(speedMin, speedCurr); + speedMax = Math.max(speedMax, speedCurr); + } + } + cursor.close(); + extraInformationRead_stats = true; + } + } } @@ -232,27 +233,27 @@ public Integer getTpCount() { } public Float getDistance() { - readExtraInformation(); + readExtraInformation_stats(); return distance; } public Float getElevationMin() { - readExtraInformation(); + readExtraInformation_stats(); return elevationMin; } public Float getElevationMax() { - readExtraInformation(); + readExtraInformation_stats(); return elevationMax; } public Float getSpeedMax() { - readExtraInformation(); + readExtraInformation_stats(); return speedMax; } public Float getSpeedMin() { - readExtraInformation(); + readExtraInformation_stats(); // Avoid returning inconsistent min-speed if "avoidZeroSpeed" is set to true return (speedMin > speedMax) ? 0.0f : speedMin; } From 33bf8b84f5167dc0157f8f7c0e64f0adbc266d38 Mon Sep 17 00:00:00 2001 From: thePanz Date: Thu, 19 Sep 2013 15:15:42 +0200 Subject: [PATCH 9/9] Fix: fixed distance computation formula, avoid NaN for Math.acos() function --- .../android/osmtracker/util/DistanceUtil.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java b/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java index 12afcaa14..d4a456df5 100644 --- a/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java +++ b/src/me/guillaumin/android/osmtracker/util/DistanceUtil.java @@ -18,11 +18,14 @@ public class DistanceUtil { * @return The distance (in meters) between point1 and point2 */ public static float getDistance(final float lat1, final float lon1, final float lat2, final float lon2) { - final double theta = lon1 - lon2; - final double a = Math.sin(DEG2RAD * lat1) * Math.sin(DEG2RAD * lat2); - final double b = Math.cos(DEG2RAD * lat1) * Math.cos(DEG2RAD * lat2) * Math.cos(DEG2RAD * theta); - - return (float) (Math.acos(a + b) * RADIUS_EARTH_METERS); + final double theta = lon1 - lon2; + System.out.println("theta = " + theta); + final double v = (Math.sin(DEG2RAD * lat1) * Math.sin(DEG2RAD * lat2)) + + (Math.cos(DEG2RAD * lat1) * Math.cos(DEG2RAD * lat2) * Math.cos(DEG2RAD * theta)); + + // Due to Float/Double approximations sometimes the value v is greater than 1, thus out of Math.acos() domain + // @see: http://www.mathworks.it/it/help/matlab/ref/acos.html + return (v > 1) ? 0.0f : (float) (Math.acos(v) * RADIUS_EARTH_METERS); } /**