From 48a409da21191f05815a1c7a3755c2abe286c558 Mon Sep 17 00:00:00 2001 From: madwasp79 Date: Tue, 2 Jul 2019 17:53:53 +0300 Subject: [PATCH] add location formatting method. --- .../src/net/osmand/data/PointDescription.java | 13 +-- .../src/net/osmand/plus/OsmAndFormatter.java | 88 ++++++++++--------- .../plus/mapcontextmenu/MenuBuilder.java | 14 ++- 3 files changed, 62 insertions(+), 53 deletions(-) diff --git a/OsmAnd/src/net/osmand/data/PointDescription.java b/OsmAnd/src/net/osmand/data/PointDescription.java index 64d252d40b..95fe9abfbd 100644 --- a/OsmAnd/src/net/osmand/data/PointDescription.java +++ b/OsmAnd/src/net/osmand/data/PointDescription.java @@ -186,17 +186,9 @@ public class PointDescription { String latLonDeg; String latLonMin; String latLonSec; - String utm; - String olc; - UTMPoint pnt = new UTMPoint(new LatLonPoint(lat, lon)); - utm = pnt.zone_number + "" + pnt.zone_letter + " " + ((long) pnt.easting) + " " + ((long) pnt.northing); - - try { - olc = getLocationOlcName(lat, lon); - } catch (RuntimeException e) { - olc = "0, 0"; - } + String utm = OsmAndFormatter.formatLocationCoordinates(lat, lon, OsmAndFormatter.FORMAT_UTM); + String olc = OsmAndFormatter.formatLocationCoordinates(lat, lon, OsmAndFormatter.FORMAT_OLC); try { latLonString = OsmAndFormatter.formatLocationCoordinates(lat, lon, OsmAndFormatter.FORMAT_DEGREES_SHORT); @@ -237,7 +229,6 @@ public class PointDescription { } else if (f == PointDescription.FORMAT_SECONDS) { results.put(LOCATION_LIST_HEADER, latLonSec); } - return results; } diff --git a/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java b/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java index ff396d89fe..12a0feefa8 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndFormatter.java @@ -1,8 +1,12 @@ package net.osmand.plus; +import static net.osmand.data.PointDescription.getLocationOlcName; + import android.content.Context; import android.text.format.DateUtils; +import com.jwetherell.openmap.common.LatLonPoint; +import com.jwetherell.openmap.common.UTMPoint; import java.text.DecimalFormatSymbols; import net.osmand.data.Amenity; import net.osmand.data.City.CityType; @@ -13,6 +17,7 @@ import net.osmand.osm.PoiType; import net.osmand.plus.OsmandSettings.AngularConstants; import net.osmand.plus.OsmandSettings.MetricsConstants; import net.osmand.plus.OsmandSettings.SpeedConstants; +import net.osmand.plus.mapmarkers.CoordinateInputFormats.Format; import net.osmand.util.Algorithms; import java.text.DateFormatSymbols; @@ -35,6 +40,21 @@ public class OsmAndFormatter { private static final SimpleDateFormat SIMPLE_TIME_OF_DAY_FORMAT = new SimpleDateFormat("HH:mm", Locale.getDefault()); private static final String[] localDaysStr = getLettersStringArray(DateFormatSymbols.getInstance().getShortWeekdays(), 3); + public static final int FORMAT_DEGREES_SHORT = 100; + public static final int FORMAT_DEGREES = 101; + public static final int FORMAT_MINUTES = 102; + public static final int FORMAT_SECONDS = 103; + public static final int FORMAT_UTM = 104; + public static final int FORMAT_OLC = 105; + private static final char DELIMITER_DEGREES = '°'; + private static final char DELIMITER_MINUTES = '′'; + private static final char DELIMITER_SECONDS = '″'; + + private static final char NORTH = 'N'; + private static final char SOUTH = 'S'; + private static final char WEST = 'W'; + private static final char EAST = 'E'; + { fixed2.setMinimumFractionDigits(2); fixed1.setMinimumFractionDigits(1); @@ -408,61 +428,52 @@ public class OsmAndFormatter { cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR)); } - - public static final int FORMAT_DEGREES_SHORT = 100; - public static final int FORMAT_DEGREES = 101; - public static final int FORMAT_MINUTES = 102; - public static final int FORMAT_SECONDS = 103; - public static final int FORMAT_UTM = 104; - public static final int FORMAT_OLC = 105; - private static final char DELIMITER_DEGREES = '°'; - private static final char DELIMITER_MINUTES = '′'; - private static final char DELIMITER_SECONDS = '″'; - - private static final char NORTH = 'N'; - private static final char SOUTH = 'S'; - private static final char WEST = 'W'; - private static final char EAST = 'E'; - - public static void main(String[] args) { - System.out.println(formatLocationCoordinates(30.122345, -42.101245, FORMAT_DEGREES_SHORT)); - System.out.println(formatLocationCoordinates(30.122345, -42.101245, FORMAT_DEGREES)); - System.out.println(formatLocationCoordinates(-30.122345, 42.101245, FORMAT_MINUTES)); - System.out.println(formatLocationCoordinates(30.122345, -42.101245, FORMAT_SECONDS)); - } public static String formatLocationCoordinates(double lat, double lon, int outputFormat) { - StringBuilder sb = new StringBuilder(); + StringBuilder result = new StringBuilder(); if (outputFormat == FORMAT_DEGREES_SHORT) { - sb.append(formatCoordinate(lat, outputFormat)).append(" ").append(formatCoordinate(lon, outputFormat)); + result.append(formatCoordinate(lat, outputFormat)).append(" ").append(formatCoordinate(lon, outputFormat)); } else if (outputFormat == FORMAT_DEGREES || outputFormat == FORMAT_MINUTES || outputFormat == FORMAT_SECONDS) { - sb - .append(formatCoordinate(lat, outputFormat)) - .append(" ") - .append(lat > 0 ? NORTH : SOUTH) - .append(", ").append(formatCoordinate(lon, outputFormat)) - .append(" ") + result + .append(formatCoordinate(lat, outputFormat)).append(" ") + .append(lat > 0 ? NORTH : SOUTH).append(", ") + .append(formatCoordinate(lon, outputFormat)).append(" ") .append(lon > 0 ? EAST : WEST); + } else if (outputFormat == FORMAT_UTM) { + UTMPoint pnt = new UTMPoint(new LatLonPoint(lat, lon)); + result + .append(pnt.zone_number) + .append(pnt.zone_letter).append(" ") + .append((long) pnt.easting).append(" ") + .append((long) pnt.northing); } else if (outputFormat == FORMAT_OLC) { - - } else if (outputFormat == FORMAT_UTM) { - + String r; + try { + r = getLocationOlcName(lat, lon); + } catch (RuntimeException e) { + r = "0, 0"; + } + result.append(r); } - return sb.toString(); + return result.toString(); } private static String formatCoordinate(double coordinate, int outputType) { + if (coordinate < -180.0 || coordinate > 180.0 || Double.isNaN(coordinate)) { - throw new IllegalArgumentException("coordinate=" + coordinate); //$NON-NLS-1$ + return "Error. Wrong coordinates data!"; } if ((outputType != FORMAT_DEGREES) && (outputType != FORMAT_MINUTES) && (outputType != FORMAT_SECONDS) && (outputType != FORMAT_DEGREES_SHORT)) { - throw new IllegalArgumentException("outputType=" + outputType); //$NON-NLS-1$ + return "Unknown Output Format!"; } + DecimalFormat degDf = new DecimalFormat("##0.00000",new DecimalFormatSymbols(Locale.US)); + DecimalFormat minDf = new DecimalFormat("00.0000",new DecimalFormatSymbols(Locale.US)); + DecimalFormat secDf = new DecimalFormat("00.000",new DecimalFormatSymbols(Locale.US)); + StringBuilder sb = new StringBuilder(); - // Handle negative values if (coordinate < 0) { if (outputType == FORMAT_DEGREES_SHORT) { sb.append('-'); @@ -470,9 +481,6 @@ public class OsmAndFormatter { coordinate = -coordinate; } - DecimalFormat degDf = new DecimalFormat("##0.00000",new DecimalFormatSymbols(Locale.US)); - DecimalFormat minDf = new DecimalFormat("00.0000",new DecimalFormatSymbols(Locale.US)); - DecimalFormat secDf = new DecimalFormat("00.000",new DecimalFormatSymbols(Locale.US)); if (outputType == FORMAT_DEGREES_SHORT) { sb.append(degDf.format(coordinate)); } else if (outputType == FORMAT_DEGREES) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java index b9814151d1..8c385d9078 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java @@ -17,9 +17,11 @@ import android.support.v4.content.ContextCompat; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v7.view.ContextThemeWrapper; import android.text.ClipboardManager; +import android.text.SpannableStringBuilder; +import android.text.Spanned; import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; import android.text.util.Linkify; -import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; @@ -681,7 +683,15 @@ public class MenuBuilder { LinearLayout llv = buildCollapsableContentView(mapActivity, true, true); for (final Map.Entry line : locationData.entrySet()) { final TextViewEx button = buildButtonInCollapsableView(mapActivity, false, false); - button.setText(line.getValue()); + if (line.getKey() == OsmAndFormatter.FORMAT_UTM || line.getKey() == OsmAndFormatter.FORMAT_OLC) { + SpannableStringBuilder ssb = new SpannableStringBuilder(); + ssb.append(line.getKey() == OsmAndFormatter.FORMAT_UTM ? "UTM: " : "OLC: "); + ssb.setSpan(new ForegroundColorSpan(app.getResources().getColor(R.color.text_color_secondary_light)), 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + ssb.append(line.getValue()); + button.setText(ssb); + } else { + button.setText(line.getValue()); + } button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) {