package cgeo.geocaching.location;
import cgeo.geocaching.utils.Formatter;
import java.util.Locale;
/**
* Formatting of Geopoint.
*/
public class GeopointFormatter {
private GeopointFormatter() {
// utility class
}
/**
* Predefined formats.
*/
public enum Format {
/** Example: "10,123456 -0,123456" */
LAT_LON_DECDEGREE,
/** Example: "10.123456,-0.123456" (unlocalized) */
LAT_LON_DECDEGREE_COMMA,
/** Example: "N 10° 12,345 · W 5° 12,345" */
LAT_LON_DECMINUTE,
/** Example: "N 10° 12.345 W 5° 12.345" */
LAT_LON_DECMINUTE_RAW,
/** Example: "N 10° 12' 34" W 5° 12' 34" */
LAT_LON_DECSECOND,
/** Example: "-0.123456" (unlocalized latitude) */
LAT_DECDEGREE_RAW,
/** Example: "N 10° 12,345" */
LAT_DECMINUTE,
/** Example: "N 10 12,345" */
LAT_DECMINUTE_RAW,
/** Example: "-0.123456" (unlocalized longitude) */
LON_DECDEGREE_RAW,
/** Example: "W 5° 12,345" */
LON_DECMINUTE,
/** Example: "W 5 12,345" */
LON_DECMINUTE_RAW,
/** Example: "32U E 549996 N 5600860" */
UTM
}
/**
* Formats a Geopoint.
*
* @param gp
* the Geopoint to format
* @param format
* one of the predefined formats
* @return the formatted coordinates
*/
public static String format(final Format format, final Geopoint gp) {
final double latSigned = gp.getLatitude();
final double lonSigned = gp.getLongitude();
switch (format) {
case LAT_LON_DECDEGREE:
return String.format(Locale.getDefault(), "%.6f %.6f", latSigned, lonSigned);
case LAT_LON_DECDEGREE_COMMA:
return String.format((Locale) null, "%.6f,%.6f", latSigned, lonSigned);
case LAT_LON_DECMINUTE: {
final Geopoint rgp = gp.roundedAt(60 * 1000);
return String.format(Locale.getDefault(), "%c %02d° %06.3f" + Formatter.SEPARATOR + "%c %03d° %06.3f",
rgp.getLatDir(), rgp.getLatDeg(), rgp.getLatMinRaw(),
rgp.getLonDir(), rgp.getLonDeg(), rgp.getLonMinRaw());
}
case LAT_LON_DECMINUTE_RAW: {
final Geopoint rgp = gp.roundedAt(60 * 1000);
return String.format((Locale) null, "%c %02d° %06.3f %c %03d° %06.3f",
rgp.getLatDir(), rgp.getLatDeg(), rgp.getLatMinRaw(),
rgp.getLonDir(), rgp.getLonDeg(), rgp.getLonMinRaw());
}
case LAT_LON_DECSECOND: {
final Geopoint rgp = gp.roundedAt(3600 * 1000);
return String.format(Locale.getDefault(), "%c %02d° %02d' %06.3f\"" + Formatter.SEPARATOR + "%c %03d° %02d' %06.3f\"",
rgp.getLatDir(), rgp.getLatDeg(), rgp.getLatMin(), rgp.getLatSecRaw(),
rgp.getLonDir(), rgp.getLonDeg(), rgp.getLonMin(), rgp.getLonSecRaw());
}
case LAT_DECDEGREE_RAW:
return String.format((Locale) null, "%.6f", latSigned);
case LAT_DECMINUTE: {
final Geopoint rgp = gp.roundedAt(60 * 1000);
return String.format(Locale.getDefault(), "%c %02d° %06.3f", rgp.getLatDir(), rgp.getLatDeg(), rgp.getLatMinRaw());
}
case LAT_DECMINUTE_RAW: {
final Geopoint rgp = gp.roundedAt(60 * 1000);
return String.format(Locale.getDefault(), "%c %02d %06.3f", rgp.getLatDir(), rgp.getLatDeg(), rgp.getLatMinRaw());
}
case LON_DECDEGREE_RAW:
return String.format((Locale) null, "%.6f", lonSigned);
case LON_DECMINUTE: {
final Geopoint rgp = gp.roundedAt(60 * 1000);
return String.format(Locale.getDefault(), "%c %03d° %06.3f", rgp.getLonDir(), rgp.getLonDeg(), rgp.getLonMinRaw());
}
case LON_DECMINUTE_RAW: {
final Geopoint rgp = gp.roundedAt(60 * 1000);
return String.format(Locale.getDefault(), "%c %03d %06.3f", rgp.getLonDir(), rgp.getLonDeg(), rgp.getLonMinRaw());
}
case UTM: {
return UTMPoint.latLong2UTM(gp).toString();
}
}
throw new IllegalStateException(); // cannot happen, if switch case is enum complete
}
/**
* Reformats coordinates for Clipboard.
* It removes the middle dot if present.
*/
public static CharSequence reformatForClipboard(final CharSequence coordinatesToCopy) {
return coordinatesToCopy.toString().replace(Formatter.SEPARATOR, " ").replaceAll(",", ".");
}
}