diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2012-04-20 15:12:31 +0200 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2012-04-20 15:12:31 +0200 |
| commit | e4bb33582ae4a5fc200f04f0779e3ac7f67d20e2 (patch) | |
| tree | 0a0e5cf972e705e6c6738c615591375edef01769 | |
| parent | 24f45d4113155204ce928948ec0d11f565528560 (diff) | |
| download | cgeo-e4bb33582ae4a5fc200f04f0779e3ac7f67d20e2.zip cgeo-e4bb33582ae4a5fc200f04f0779e3ac7f67d20e2.tar.gz cgeo-e4bb33582ae4a5fc200f04f0779e3ac7f67d20e2.tar.bz2 | |
Refactoring: move Direction out of Geopoint
Directions deserve their own package to make it clearer of who use them.
8 files changed, 207 insertions, 186 deletions
diff --git a/main/src/cgeo/geocaching/cgeocoords.java b/main/src/cgeo/geocaching/cgeocoords.java index fdedfda..060260a 100644 --- a/main/src/cgeo/geocaching/cgeocoords.java +++ b/main/src/cgeo/geocaching/cgeocoords.java @@ -5,12 +5,12 @@ import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.compatibility.Compatibility; import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.Geopoint.DDD; -import cgeo.geocaching.geopoint.Geopoint.DMM; -import cgeo.geocaching.geopoint.Geopoint.DMS; -import cgeo.geocaching.geopoint.Geopoint.Direction; import cgeo.geocaching.geopoint.GeopointFormatter; import cgeo.geocaching.geopoint.GeopointParser.ParseException; +import cgeo.geocaching.geopoint.direction.DDD; +import cgeo.geocaching.geopoint.direction.DMM; +import cgeo.geocaching.geopoint.direction.DMS; +import cgeo.geocaching.geopoint.direction.Direction; import org.apache.commons.lang3.StringUtils; diff --git a/main/src/cgeo/geocaching/geopoint/Geopoint.java b/main/src/cgeo/geocaching/geopoint/Geopoint.java index ff97a4c..106e8a9 100644 --- a/main/src/cgeo/geocaching/geopoint/Geopoint.java +++ b/main/src/cgeo/geocaching/geopoint/Geopoint.java @@ -2,6 +2,10 @@ package cgeo.geocaching.geopoint; import cgeo.geocaching.ICoordinates; import cgeo.geocaching.geopoint.GeopointFormatter.Format; +import cgeo.geocaching.geopoint.direction.DDD; +import cgeo.geocaching.geopoint.direction.DMM; +import cgeo.geocaching.geopoint.direction.DMS; +import cgeo.geocaching.geopoint.direction.Direction; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.utils.Log; @@ -14,9 +18,6 @@ import android.location.Location; import android.os.Parcel; import android.os.Parcelable; -import java.math.BigDecimal; -import java.math.RoundingMode; - /** * Abstraction of geographic point. */ @@ -303,180 +304,6 @@ public final class Geopoint implements ICoordinates, Parcelable { return dms; } - /* Constant values needed for calculation */ - private static final double D60 = 60.0d; - private static final double D1000 = 1000.0d; - private static final double D3600 = 3600.0d; - private static final BigDecimal BD_SIXTY = BigDecimal.valueOf(D60); - private static final BigDecimal BD_THOUSAND = BigDecimal.valueOf(D1000); - private static final BigDecimal BD_ONEHOUNDREDTHOUSAND = BigDecimal.valueOf(100000.0d); - - /** - * Value type for the direction. - */ - public static class Direction { - /** latitude direction, 'N' or 'S' */ - public final char latDir; - /** longitude direction, 'E' or 'W' */ - public final char lonDir; - - private Direction(final double latSigned, final double lonSigned) { - latDir = latSigned < 0 ? 'S' : 'N'; - lonDir = lonSigned < 0 ? 'W' : 'E'; - } - - protected static String addZeros(final int value, final int len) { - return StringUtils.leftPad(Integer.toString(value), len, '0'); - } - } - - /** - * Value type for the DDD.DDDDD format. - */ - public static final class DDD extends Direction { - - /** latitude degree value */ - public final int latDeg; - /** fractional part of the latitude degree value */ - public final int latDegFrac; - - public final int lonDeg; - public final int lonDegFrac; - - private DDD(final double latSigned, final double lonSigned) { - super(latSigned, lonSigned); - BigDecimal bdLat = BigDecimal.valueOf(latSigned).abs(); - latDeg = bdLat.intValue(); - BigDecimal bdLatFrac = bdLat.subtract(BigDecimal.valueOf(latDeg)).multiply(BD_ONEHOUNDREDTHOUSAND); - latDegFrac = bdLatFrac.setScale(0, RoundingMode.HALF_UP).intValue(); - - BigDecimal bdlon = BigDecimal.valueOf(lonSigned).abs(); - lonDeg = bdlon.intValue(); - BigDecimal bdLonFrac = bdlon.subtract(BigDecimal.valueOf(lonDeg)).multiply(BD_ONEHOUNDREDTHOUSAND); - lonDegFrac = bdLonFrac.setScale(0, RoundingMode.HALF_UP).intValue(); - } - - public static Geopoint createGeopoint(final String latDir, final String latDeg, final String latDegFrac, - final String lonDir, final String lonDeg, final String lonDegFrac) { - double lat = 0.0d; - double lon = 0.0d; - try { - lat = Double.parseDouble(latDeg + "." + addZeros(Integer.parseInt(latDegFrac), 5)); - lon = Double.parseDouble(lonDeg + "." + addZeros(Integer.parseInt(lonDegFrac), 5)); - } catch (NumberFormatException e) { - } - lat *= "S".equalsIgnoreCase(latDir) ? -1 : 1; - lon *= "W".equalsIgnoreCase(lonDir) ? -1 : 1; - return new Geopoint(lat, lon); - } - } - - public static final class DMM extends Direction { - - public final int latDeg; - public final double latMinRaw; - public final int latMin; - public final int latMinFrac; - - public final int lonDeg; - public final double lonMinRaw; - public final int lonMin; - public final int lonMinFrac; - - private DMM(final double latSigned, final double lonSigned) { - super(latSigned, lonSigned); - BigDecimal bdLat = BigDecimal.valueOf(latSigned).abs(); - latDeg = bdLat.intValue(); - BigDecimal bdLatMin = bdLat.subtract(BigDecimal.valueOf(latDeg)).multiply(BD_SIXTY); - // Rounding here ... - bdLatMin = bdLatMin.setScale(3, RoundingMode.HALF_UP); - latMinRaw = bdLatMin.doubleValue(); - latMin = bdLatMin.intValue(); - BigDecimal bdLatMinFrac = bdLatMin.subtract(BigDecimal.valueOf(latMin)).multiply(BD_THOUSAND); - latMinFrac = bdLatMinFrac.setScale(0, RoundingMode.HALF_UP).intValue(); - - BigDecimal bdlon = BigDecimal.valueOf(lonSigned).abs(); - lonDeg = bdlon.intValue(); - BigDecimal bdLonMin = bdlon.subtract(BigDecimal.valueOf(lonDeg)).multiply(BD_SIXTY); - // Rounding here ... - bdLonMin = bdLonMin.setScale(3, RoundingMode.HALF_UP); - lonMinRaw = bdLonMin.doubleValue(); - lonMin = bdLonMin.intValue(); - BigDecimal bdLonMinFrac = bdLonMin.subtract(BigDecimal.valueOf(lonMin)).multiply(BD_THOUSAND); - lonMinFrac = bdLonMinFrac.setScale(0, RoundingMode.HALF_UP).intValue(); - } - - public static Geopoint createGeopoint(final String latDir, final String latDeg, final String latMin, final String latMinFrac, - final String lonDir, final String lonDeg, final String lonMin, final String lonMinFrac) { - double lat = 0.0d; - double lon = 0.0d; - try { - lat = Double.parseDouble(latDeg) + Double.parseDouble(latMin + "." + addZeros(Integer.parseInt(latMinFrac), 3)) / D60; - lon = Double.parseDouble(lonDeg) + Double.parseDouble(lonMin + "." + addZeros(Integer.parseInt(lonMinFrac), 3)) / D60; - } catch (NumberFormatException e) { - } - lat *= "S".equalsIgnoreCase(latDir) ? -1 : 1; - lon *= "W".equalsIgnoreCase(lonDir) ? -1 : 1; - return new Geopoint(lat, lon); - } - } - - public static final class DMS extends Direction { - - public final int latDeg; - public final int latMin; - public final double latSecRaw; - public final int latSec; - public final int latSecFrac; - - public final int lonDeg; - public final int lonMin; - public final double lonSecRaw; - public final int lonSec; - public final int lonSecFrac; - - private DMS(final double latSigned, final double lonSigned) { - super(latSigned, lonSigned); - BigDecimal bdLat = BigDecimal.valueOf(latSigned).abs(); - latDeg = bdLat.intValue(); - BigDecimal bdLatMin = bdLat.subtract(BigDecimal.valueOf(latDeg)).multiply(BD_SIXTY); - latMin = bdLatMin.intValue(); - BigDecimal bdLatSec = bdLatMin.subtract(BigDecimal.valueOf(latMin)).multiply(BD_SIXTY); - // Rounding here ... - bdLatSec = bdLatSec.setScale(3, RoundingMode.HALF_UP); - latSecRaw = bdLatSec.doubleValue(); - latSec = bdLatSec.intValue(); - BigDecimal bdLatSecFrac = bdLatSec.subtract(BigDecimal.valueOf(latSec)).multiply(BD_THOUSAND); - latSecFrac = bdLatSecFrac.setScale(0, RoundingMode.HALF_UP).intValue(); - - BigDecimal bdlon = BigDecimal.valueOf(lonSigned).abs(); - lonDeg = bdlon.intValue(); - BigDecimal bdLonMin = bdlon.subtract(BigDecimal.valueOf(lonDeg)).multiply(BD_SIXTY); - lonMin = bdLonMin.intValue(); - BigDecimal bdLonSec = bdLonMin.subtract(BigDecimal.valueOf(lonMin)).multiply(BD_SIXTY); - // Rounding here ... - bdLonSec = bdLonSec.setScale(3, RoundingMode.HALF_UP); - lonSecRaw = bdLonSec.doubleValue(); - lonSec = bdLonSec.intValue(); - BigDecimal bdLonSecFrac = bdLonSec.subtract(BigDecimal.valueOf(lonSec)).multiply(BD_THOUSAND); - lonSecFrac = bdLonSecFrac.setScale(0, RoundingMode.HALF_UP).intValue(); - } - - public static Geopoint createGeopoint(final String latDir, final String latDeg, final String latMin, final String latSec, final String latSecFrac, - final String lonDir, final String lonDeg, final String lonMin, final String lonSec, final String lonSecFrac) { - double lat = 0.0d; - double lon = 0.0d; - try { - lat = Double.parseDouble(latDeg) + Double.parseDouble(latMin) / D60 + Double.parseDouble(latSec + "." + addZeros(Integer.parseInt(latSecFrac), 3)) / D3600; - lon = Double.parseDouble(lonDeg) + Double.parseDouble(lonMin) / D60 + Double.parseDouble(lonSec + "." + addZeros(Integer.parseInt(lonSecFrac), 3)) / D3600; - } catch (NumberFormatException e) { - } - lat *= "S".equalsIgnoreCase(latDir) ? -1 : 1; - lon *= "W".equalsIgnoreCase(lonDir) ? -1 : 1; - return new Geopoint(lat, lon); - } - } - abstract public static class GeopointException extends RuntimeException { diff --git a/main/src/cgeo/geocaching/geopoint/GeopointFormatter.java b/main/src/cgeo/geocaching/geopoint/GeopointFormatter.java index d0baee9..43f83a3 100644 --- a/main/src/cgeo/geocaching/geopoint/GeopointFormatter.java +++ b/main/src/cgeo/geocaching/geopoint/GeopointFormatter.java @@ -1,7 +1,7 @@ package cgeo.geocaching.geopoint; -import cgeo.geocaching.geopoint.Geopoint.DMM; -import cgeo.geocaching.geopoint.Geopoint.DMS; +import cgeo.geocaching.geopoint.direction.DMM; +import cgeo.geocaching.geopoint.direction.DMS; import java.util.Locale; diff --git a/main/src/cgeo/geocaching/geopoint/direction/DDD.java b/main/src/cgeo/geocaching/geopoint/direction/DDD.java new file mode 100644 index 0000000..939d6ca --- /dev/null +++ b/main/src/cgeo/geocaching/geopoint/direction/DDD.java @@ -0,0 +1,47 @@ +package cgeo.geocaching.geopoint.direction; + +import cgeo.geocaching.geopoint.Geopoint; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * Value type for the DDD.DDDDD format. + */ +public final class DDD extends Direction { + + /** latitude degree value */ + public final int latDeg; + /** fractional part of the latitude degree value */ + public final int latDegFrac; + + public final int lonDeg; + public final int lonDegFrac; + + public DDD(final double latSigned, final double lonSigned) { + super(latSigned, lonSigned); + BigDecimal bdLat = BigDecimal.valueOf(latSigned).abs(); + latDeg = bdLat.intValue(); + BigDecimal bdLatFrac = bdLat.subtract(BigDecimal.valueOf(latDeg)).multiply(BD_ONEHOUNDREDTHOUSAND); + latDegFrac = bdLatFrac.setScale(0, RoundingMode.HALF_UP).intValue(); + + BigDecimal bdlon = BigDecimal.valueOf(lonSigned).abs(); + lonDeg = bdlon.intValue(); + BigDecimal bdLonFrac = bdlon.subtract(BigDecimal.valueOf(lonDeg)).multiply(BD_ONEHOUNDREDTHOUSAND); + lonDegFrac = bdLonFrac.setScale(0, RoundingMode.HALF_UP).intValue(); + } + + public static Geopoint createGeopoint(final String latDir, final String latDeg, final String latDegFrac, + final String lonDir, final String lonDeg, final String lonDegFrac) { + double lat = 0.0d; + double lon = 0.0d; + try { + lat = Double.parseDouble(latDeg + "." + addZeros(Integer.parseInt(latDegFrac), 5)); + lon = Double.parseDouble(lonDeg + "." + addZeros(Integer.parseInt(lonDegFrac), 5)); + } catch (NumberFormatException e) { + } + lat *= "S".equalsIgnoreCase(latDir) ? -1 : 1; + lon *= "W".equalsIgnoreCase(lonDir) ? -1 : 1; + return new Geopoint(lat, lon); + } +}
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/geopoint/direction/DMM.java b/main/src/cgeo/geocaching/geopoint/direction/DMM.java new file mode 100644 index 0000000..7426f28 --- /dev/null +++ b/main/src/cgeo/geocaching/geopoint/direction/DMM.java @@ -0,0 +1,56 @@ +package cgeo.geocaching.geopoint.direction; + +import cgeo.geocaching.geopoint.Geopoint; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public final class DMM extends Direction { + + public final int latDeg; + public final double latMinRaw; + public final int latMin; + public final int latMinFrac; + + public final int lonDeg; + public final double lonMinRaw; + public final int lonMin; + public final int lonMinFrac; + + public DMM(final double latSigned, final double lonSigned) { + super(latSigned, lonSigned); + BigDecimal bdLat = BigDecimal.valueOf(latSigned).abs(); + latDeg = bdLat.intValue(); + BigDecimal bdLatMin = bdLat.subtract(BigDecimal.valueOf(latDeg)).multiply(BD_SIXTY); + // Rounding here ... + bdLatMin = bdLatMin.setScale(3, RoundingMode.HALF_UP); + latMinRaw = bdLatMin.doubleValue(); + latMin = bdLatMin.intValue(); + BigDecimal bdLatMinFrac = bdLatMin.subtract(BigDecimal.valueOf(latMin)).multiply(BD_THOUSAND); + latMinFrac = bdLatMinFrac.setScale(0, RoundingMode.HALF_UP).intValue(); + + BigDecimal bdlon = BigDecimal.valueOf(lonSigned).abs(); + lonDeg = bdlon.intValue(); + BigDecimal bdLonMin = bdlon.subtract(BigDecimal.valueOf(lonDeg)).multiply(BD_SIXTY); + // Rounding here ... + bdLonMin = bdLonMin.setScale(3, RoundingMode.HALF_UP); + lonMinRaw = bdLonMin.doubleValue(); + lonMin = bdLonMin.intValue(); + BigDecimal bdLonMinFrac = bdLonMin.subtract(BigDecimal.valueOf(lonMin)).multiply(BD_THOUSAND); + lonMinFrac = bdLonMinFrac.setScale(0, RoundingMode.HALF_UP).intValue(); + } + + public static Geopoint createGeopoint(final String latDir, final String latDeg, final String latMin, final String latMinFrac, + final String lonDir, final String lonDeg, final String lonMin, final String lonMinFrac) { + double lat = 0.0d; + double lon = 0.0d; + try { + lat = Double.parseDouble(latDeg) + Double.parseDouble(latMin + "." + addZeros(Integer.parseInt(latMinFrac), 3)) / D60; + lon = Double.parseDouble(lonDeg) + Double.parseDouble(lonMin + "." + addZeros(Integer.parseInt(lonMinFrac), 3)) / D60; + } catch (NumberFormatException e) { + } + lat *= "S".equalsIgnoreCase(latDir) ? -1 : 1; + lon *= "W".equalsIgnoreCase(lonDir) ? -1 : 1; + return new Geopoint(lat, lon); + } +}
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/geopoint/direction/DMS.java b/main/src/cgeo/geocaching/geopoint/direction/DMS.java new file mode 100644 index 0000000..34a9a3d --- /dev/null +++ b/main/src/cgeo/geocaching/geopoint/direction/DMS.java @@ -0,0 +1,62 @@ +package cgeo.geocaching.geopoint.direction; + +import cgeo.geocaching.geopoint.Geopoint; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public final class DMS extends Direction { + + public final int latDeg; + public final int latMin; + public final double latSecRaw; + public final int latSec; + public final int latSecFrac; + + public final int lonDeg; + public final int lonMin; + public final double lonSecRaw; + public final int lonSec; + public final int lonSecFrac; + + public DMS(final double latSigned, final double lonSigned) { + super(latSigned, lonSigned); + BigDecimal bdLat = BigDecimal.valueOf(latSigned).abs(); + latDeg = bdLat.intValue(); + BigDecimal bdLatMin = bdLat.subtract(BigDecimal.valueOf(latDeg)).multiply(BD_SIXTY); + latMin = bdLatMin.intValue(); + BigDecimal bdLatSec = bdLatMin.subtract(BigDecimal.valueOf(latMin)).multiply(BD_SIXTY); + // Rounding here ... + bdLatSec = bdLatSec.setScale(3, RoundingMode.HALF_UP); + latSecRaw = bdLatSec.doubleValue(); + latSec = bdLatSec.intValue(); + BigDecimal bdLatSecFrac = bdLatSec.subtract(BigDecimal.valueOf(latSec)).multiply(BD_THOUSAND); + latSecFrac = bdLatSecFrac.setScale(0, RoundingMode.HALF_UP).intValue(); + + BigDecimal bdlon = BigDecimal.valueOf(lonSigned).abs(); + lonDeg = bdlon.intValue(); + BigDecimal bdLonMin = bdlon.subtract(BigDecimal.valueOf(lonDeg)).multiply(BD_SIXTY); + lonMin = bdLonMin.intValue(); + BigDecimal bdLonSec = bdLonMin.subtract(BigDecimal.valueOf(lonMin)).multiply(BD_SIXTY); + // Rounding here ... + bdLonSec = bdLonSec.setScale(3, RoundingMode.HALF_UP); + lonSecRaw = bdLonSec.doubleValue(); + lonSec = bdLonSec.intValue(); + BigDecimal bdLonSecFrac = bdLonSec.subtract(BigDecimal.valueOf(lonSec)).multiply(BD_THOUSAND); + lonSecFrac = bdLonSecFrac.setScale(0, RoundingMode.HALF_UP).intValue(); + } + + public static Geopoint createGeopoint(final String latDir, final String latDeg, final String latMin, final String latSec, final String latSecFrac, + final String lonDir, final String lonDeg, final String lonMin, final String lonSec, final String lonSecFrac) { + double lat = 0.0d; + double lon = 0.0d; + try { + lat = Double.parseDouble(latDeg) + Double.parseDouble(latMin) / D60 + Double.parseDouble(latSec + "." + addZeros(Integer.parseInt(latSecFrac), 3)) / D3600; + lon = Double.parseDouble(lonDeg) + Double.parseDouble(lonMin) / D60 + Double.parseDouble(lonSec + "." + addZeros(Integer.parseInt(lonSecFrac), 3)) / D3600; + } catch (NumberFormatException e) { + } + lat *= "S".equalsIgnoreCase(latDir) ? -1 : 1; + lon *= "W".equalsIgnoreCase(lonDir) ? -1 : 1; + return new Geopoint(lat, lon); + } +}
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/geopoint/direction/Direction.java b/main/src/cgeo/geocaching/geopoint/direction/Direction.java new file mode 100644 index 0000000..ad91516 --- /dev/null +++ b/main/src/cgeo/geocaching/geopoint/direction/Direction.java @@ -0,0 +1,29 @@ +package cgeo.geocaching.geopoint.direction; + +import org.apache.commons.lang3.StringUtils; + +import java.math.BigDecimal; + +public class Direction { + /* Constant values needed for calculation */ + static final double D60 = 60.0d; + private static final double D1000 = 1000.0d; + static final double D3600 = 3600.0d; + static final BigDecimal BD_SIXTY = BigDecimal.valueOf(D60); + static final BigDecimal BD_THOUSAND = BigDecimal.valueOf(D1000); + static final BigDecimal BD_ONEHOUNDREDTHOUSAND = BigDecimal.valueOf(100000.0d); + + /** latitude direction, 'N' or 'S' */ + public final char latDir; + /** longitude direction, 'E' or 'W' */ + public final char lonDir; + + public Direction(final double latSigned, final double lonSigned) { + latDir = latSigned < 0 ? 'S' : 'N'; + lonDir = lonSigned < 0 ? 'W' : 'E'; + } + + protected static String addZeros(final int value, final int len) { + return StringUtils.leftPad(Integer.toString(value), len, '0'); + } +}
\ No newline at end of file diff --git a/tests/src/cgeo/geocaching/geopoint/GeopointTest.java b/tests/src/cgeo/geocaching/geopoint/GeopointTest.java index 7990489..76a9496 100644 --- a/tests/src/cgeo/geocaching/geopoint/GeopointTest.java +++ b/tests/src/cgeo/geocaching/geopoint/GeopointTest.java @@ -1,8 +1,8 @@ package cgeo.geocaching.geopoint; -import cgeo.geocaching.geopoint.Geopoint.DDD; -import cgeo.geocaching.geopoint.Geopoint.DMM; -import cgeo.geocaching.geopoint.Geopoint.DMS; +import cgeo.geocaching.geopoint.direction.DDD; +import cgeo.geocaching.geopoint.direction.DMM; +import cgeo.geocaching.geopoint.direction.DMS; import android.os.Bundle; import android.test.AndroidTestCase; |
