diff options
Diffstat (limited to 'main/src/cgeo/geocaching/geopoint/Units.java')
| -rw-r--r-- | main/src/cgeo/geocaching/geopoint/Units.java | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/main/src/cgeo/geocaching/geopoint/Units.java b/main/src/cgeo/geocaching/geopoint/Units.java new file mode 100644 index 0000000..3da3ad9 --- /dev/null +++ b/main/src/cgeo/geocaching/geopoint/Units.java @@ -0,0 +1,73 @@ +package cgeo.geocaching.geopoint; + +import cgeo.geocaching.Settings; + +import org.apache.commons.lang3.tuple.ImmutablePair; + +public class Units { + + public static ImmutablePair<Double, String> scaleDistance(final double distanceKilometers) { + double distance; + String units; + if (Settings.isUseMetricUnits()) { + if (distanceKilometers >= 1) { + distance = distanceKilometers; + units = "km"; + } else { + distance = distanceKilometers * 1000; + units = "m"; + } + } else { + distance = distanceKilometers / IConversion.MILES_TO_KILOMETER; + if (distance >= 0.1) { + units = "mi"; + } else { + distance *= 5280; + units = "ft"; + } + } + return new ImmutablePair<Double, String>(distance, units); + } + + public static String getDistanceFromKilometers(final Float distanceKilometers) { + if (distanceKilometers == null) { + return "?"; + } + + final ImmutablePair<Double, String> scaled = scaleDistance(distanceKilometers); + String formatString; + if (scaled.left >= 100) { + formatString = "%.0f"; + } else if (scaled.left >= 10) { + formatString = "%.1f"; + } else { + formatString = "%.2f"; + } + + return String.format(formatString + " %s", scaled.left, scaled.right); + } + + /** + * Get human readable elevation, depending on settings for metric units. + * Result is rounded to full meters/feet, as the sensors don't have that precision anyway. + * + * @param meters + * @return + */ + public static String getElevation(float meters) { + final ImmutablePair<Double, String> scaled = scaleDistance(meters / 1000f); + return (meters >= 0 ? "↥ " : "↧ ") + String.format("%d %s", Math.abs(Math.round(scaled.left)), scaled.right); + } + + public static String getDistanceFromMeters(float meters) { + return getDistanceFromKilometers(meters / 1000f); + } + + public static String getSpeed(float kilometersPerHour) { + final String speed = getDistanceFromKilometers(kilometersPerHour); + if (speed.endsWith("mi")) { + return speed.substring(0, speed.length() - 2) + "mph"; + } + return speed + (Settings.isUseMetricUnits() ? "/h" : "ph"); + } +} |
