diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2011-09-15 14:59:42 +0200 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2011-09-15 15:14:49 +0200 |
| commit | 880f483c345b687181027f0e0074ec4461039ba2 (patch) | |
| tree | dbfcd909881065057de4fcc296bd92ce6002bbbe /src | |
| parent | 42b8d8542e4056ece23af2ff8ee2b5db8abe832b (diff) | |
| download | cgeo-880f483c345b687181027f0e0074ec4461039ba2.zip cgeo-880f483c345b687181027f0e0074ec4461039ba2.tar.gz cgeo-880f483c345b687181027f0e0074ec4461039ba2.tar.bz2 | |
Use GeopointParser to parse coordinates
Diffstat (limited to 'src')
| -rw-r--r-- | src/cgeo/geocaching/cgBase.java | 112 | ||||
| -rw-r--r-- | src/cgeo/geocaching/cgeoadvsearch.java | 21 | ||||
| -rw-r--r-- | src/cgeo/geocaching/cgeopoint.java | 18 | ||||
| -rw-r--r-- | src/cgeo/geocaching/cgeowaypointadd.java | 17 | ||||
| -rw-r--r-- | src/cgeo/geocaching/files/LocParser.java | 9 | ||||
| -rw-r--r-- | src/cgeo/geocaching/geopoint/GeopointParser.java | 30 |
6 files changed, 62 insertions, 145 deletions
diff --git a/src/cgeo/geocaching/cgBase.java b/src/cgeo/geocaching/cgBase.java index c1ef6b8..53227e5 100644 --- a/src/cgeo/geocaching/cgBase.java +++ b/src/cgeo/geocaching/cgBase.java @@ -2480,118 +2480,6 @@ public class cgBase { return formatLatitude(coords.getLatitude(), degrees) + " | " + formatLongitude(coords.getLongitude(), degrees); } - // TODO Use android.util.Pair<Double, String> if needed rather than a Map here. - public static Map<String, Object> parseCoordinate(String coord, String latlon) { - final Map<String, Object> coords = new HashMap<String, Object>(); - - final Pattern patternA = Pattern.compile("^([NSWE])[^\\d]*(\\d+)°? +(\\d+)([\\.|,](\\d+))?$", Pattern.CASE_INSENSITIVE); - final Pattern patternB = Pattern.compile("^([NSWE])[^\\d]*(\\d+)([\\.|,](\\d+))?$", Pattern.CASE_INSENSITIVE); - final Pattern patternC = Pattern.compile("^(-?\\d+)([\\.|,](\\d+))?$", Pattern.CASE_INSENSITIVE); - final Pattern patternD = Pattern.compile("^([NSWE])[^\\d]*(\\d+)°?$", Pattern.CASE_INSENSITIVE); - final Pattern patternE = Pattern.compile("^(-?\\d+)°?$", Pattern.CASE_INSENSITIVE); - final Pattern patternF = Pattern.compile("^([NSWE])[^\\d]*(\\d+)$", Pattern.CASE_INSENSITIVE); - final Pattern pattern0 = Pattern.compile("^(-?\\d+)([\\.|,](\\d+))?$", Pattern.CASE_INSENSITIVE); - - coord = coord.trim().toUpperCase(); - - final Matcher matcherA = patternA.matcher(coord); - final Matcher matcherB = patternB.matcher(coord); - final Matcher matcherC = patternC.matcher(coord); - final Matcher matcherD = patternD.matcher(coord); - final Matcher matcherE = patternE.matcher(coord); - final Matcher matcherF = patternF.matcher(coord); - final Matcher matcher0 = pattern0.matcher(coord); - - int latlonNegative; - if (matcherA.find() && matcherA.groupCount() > 0) { - if (matcherA.group(1).equalsIgnoreCase("N") || matcherA.group(1).equalsIgnoreCase("E")) { - latlonNegative = 1; - } else { - latlonNegative = -1; - } - - if (matcherA.groupCount() < 5 || matcherA.group(5) == null) { - coords.put("coordinate", Double.valueOf(latlonNegative * (Double.valueOf(matcherA.group(2)) + Double.valueOf(matcherA.group(3) + ".0") / 60))); - coords.put("string", matcherA.group(1) + " " + matcherA.group(2) + "° " + matcherA.group(3) + ".000"); - } else { - coords.put("coordinate", Double.valueOf(latlonNegative * (Double.valueOf(matcherA.group(2)) + Double.valueOf(matcherA.group(3) + "." + matcherA.group(5)) / 60))); - coords.put("string", matcherA.group(1) + " " + matcherA.group(2) + "° " + matcherA.group(3) + "." + matcherA.group(5)); - } - - return coords; - } else if (matcherB.find() && matcherB.groupCount() > 0) { - if (matcherB.group(1).equalsIgnoreCase("N") || matcherB.group(1).equalsIgnoreCase("E")) { - latlonNegative = 1; - } else { - latlonNegative = -1; - } - - if (matcherB.groupCount() < 4 || matcherB.group(4) == null) { - coords.put("coordinate", Double.valueOf(latlonNegative * (Double.valueOf(matcherB.group(2) + ".0")))); - } else { - coords.put("coordinate", Double.valueOf(latlonNegative * (Double.valueOf(matcherB.group(2) + "." + matcherB.group(4))))); - } - } else if (matcherC.find() && matcherC.groupCount() > 0) { - if (matcherC.groupCount() < 3 || matcherC.group(3) == null) { - coords.put("coordinate", Double.valueOf(new Float(matcherC.group(1) + ".0"))); - } else { - coords.put("coordinate", Double.valueOf(new Float(matcherC.group(1) + "." + matcherC.group(3)))); - } - } else if (matcherD.find() && matcherD.groupCount() > 0) { - if (matcherD.group(1).equalsIgnoreCase("N") || matcherD.group(1).equalsIgnoreCase("E")) { - latlonNegative = 1; - } else { - latlonNegative = -1; - } - - coords.put("coordinate", Double.valueOf(latlonNegative * (Double.valueOf(matcherB.group(2))))); - } else if (matcherE.find() && matcherE.groupCount() > 0) { - coords.put("coordinate", Double.valueOf(matcherE.group(1))); - } else if (matcherF.find() && matcherF.groupCount() > 0) { - if (matcherF.group(1).equalsIgnoreCase("N") || matcherF.group(1).equalsIgnoreCase("E")) { - latlonNegative = 1; - } else { - latlonNegative = -1; - } - - coords.put("coordinate", Double.valueOf(latlonNegative * (Double.valueOf(matcherB.group(2))))); - } else { - return null; - } - - if (matcher0.find() && matcher0.groupCount() > 0) { - String tmpDir = null; - Float tmpCoord; - if (matcher0.groupCount() < 3 || matcher0.group(3) == null) { - tmpCoord = new Float("0.0"); - } else { - tmpCoord = new Float("0." + matcher0.group(3)); - } - - if (latlon.equalsIgnoreCase("lat")) { - if (matcher0.group(1).equals("+")) { - tmpDir = "N"; - } - if (matcher0.group(1).equals("-")) { - tmpDir = "S"; - } - } else if (latlon.equalsIgnoreCase("lon")) { - if (matcher0.group(1).equals("+")) { - tmpDir = "E"; - } - if (matcher0.group(1).equals("-")) { - tmpDir = "W"; - } - } - - coords.put("string", tmpDir + " " + matcher0.group(1) + "° " + (Math.round(tmpCoord / (1 / 60) * 1000) * 1000)); - - return coords; - } else { - return new HashMap<String, Object>(); - } - } - public UUID searchByNextPage(cgSearchThread thread, final UUID searchId, int reason, boolean showCaptcha) { final String[] viewstates = app.getViewstates(searchId); diff --git a/src/cgeo/geocaching/cgeoadvsearch.java b/src/cgeo/geocaching/cgeoadvsearch.java index d48c23f..cbf64e1 100644 --- a/src/cgeo/geocaching/cgeoadvsearch.java +++ b/src/cgeo/geocaching/cgeoadvsearch.java @@ -2,6 +2,7 @@ package cgeo.geocaching; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.geopoint.GeopointParser; import org.apache.commons.lang3.StringUtils; @@ -22,7 +23,6 @@ import android.widget.Button; import android.widget.EditText; import android.widget.TextView; -import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -263,29 +263,32 @@ public class cgeoadvsearch extends AbstractActivity { final String latText = latView.getText().toString(); final String lonText = lonView.getText().toString(); - if (StringUtils.isEmpty(latText) || StringUtils.isEmpty(lonText)) { // TODO: now coordinates + if (StringUtils.isEmpty(latText) || StringUtils.isEmpty(lonText)) { if (geo.coordsNow != null) { latView.setText(cgBase.formatLatitude(geo.coordsNow.getLatitude(), true)); lonView.setText(cgBase.formatLongitude(geo.coordsNow.getLongitude(), true)); } } else { - Map<String, Object> latParsed = cgBase.parseCoordinate(latText, "lat"); - Map<String, Object> lonParsed = cgBase.parseCoordinate(lonText, "lat"); - - if (latParsed == null || latParsed.get("coordinate") == null || latParsed.get("string") == null) { + double latitude; + try { + latitude = GeopointParser.parseLatitude(latText); + } catch (GeopointParser.ParseException e) { showToast(res.getString(R.string.err_parse_lat)); return; } - if (lonParsed == null || lonParsed.get("coordinate") == null || lonParsed.get("string") == null) { + double longitude; + try { + longitude = GeopointParser.parseLongitude(lonText); + } catch (GeopointParser.ParseException e) { showToast(res.getString(R.string.err_parse_lon)); return; } final Intent cachesIntent = new Intent(this, cgeocaches.class); cachesIntent.putExtra("type", "coordinate"); - cachesIntent.putExtra("latitude", (Double) latParsed.get("coordinate")); - cachesIntent.putExtra("longitude", (Double) lonParsed.get("coordinate")); + cachesIntent.putExtra("latitude", latitude); + cachesIntent.putExtra("longitude", longitude); cachesIntent.putExtra("cachetype", settings.cacheType); startActivity(cachesIntent); } diff --git a/src/cgeo/geocaching/cgeopoint.java b/src/cgeo/geocaching/cgeopoint.java index ff4216c..14511ed 100644 --- a/src/cgeo/geocaching/cgeopoint.java +++ b/src/cgeo/geocaching/cgeopoint.java @@ -4,6 +4,7 @@ import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; import cgeo.geocaching.geopoint.DistanceParser; import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.geopoint.GeopointParser; import org.apache.commons.lang3.StringUtils; @@ -32,7 +33,6 @@ import android.widget.ListView; import android.widget.TextView; import java.util.List; -import java.util.Map; public class cgeopoint extends AbstractActivity { @@ -482,21 +482,23 @@ public class cgeopoint extends AbstractActivity { } if (StringUtils.isNotBlank(latText) && StringUtils.isNotBlank(lonText)) { - // latitude & longitude - Map<String, Object> latParsed = cgBase.parseCoordinate(latText, "lat"); - Map<String, Object> lonParsed = cgBase.parseCoordinate(lonText, "lon"); - - if (latParsed == null || latParsed.get("coordinate") == null || latParsed.get("string") == null) { + double latitude; + try { + latitude = GeopointParser.parseLatitude(latText); + } catch (GeopointParser.ParseException e) { showToast(res.getString(R.string.err_parse_lat)); return null; } - if (lonParsed == null || lonParsed.get("coordinate") == null || lonParsed.get("string") == null) { + double longitude; + try { + longitude = GeopointParser.parseLongitude(lonText); + } catch (GeopointParser.ParseException e) { showToast(res.getString(R.string.err_parse_lon)); return null; } - coords = new Geopoint((Double) latParsed.get("coordinate"), (Double) lonParsed.get("coordinate")); + coords = new Geopoint(latitude, longitude); } else { if (geo == null || geo.coordsNow == null) { showToast(res.getString(R.string.err_point_curr_position_unavailable)); diff --git a/src/cgeo/geocaching/cgeowaypointadd.java b/src/cgeo/geocaching/cgeowaypointadd.java index f4d1ba7..9695c2e 100644 --- a/src/cgeo/geocaching/cgeowaypointadd.java +++ b/src/cgeo/geocaching/cgeowaypointadd.java @@ -5,6 +5,7 @@ import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.geopoint.DistanceParser; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.GeopointFormatter; +import cgeo.geocaching.geopoint.GeopointParser; import org.apache.commons.lang3.StringUtils; @@ -22,7 +23,6 @@ import android.widget.EditText; import java.util.ArrayList; import java.util.List; -import java.util.Map; public class cgeowaypointadd extends AbstractActivity { @@ -258,22 +258,19 @@ public class cgeowaypointadd extends AbstractActivity { } if (StringUtils.isNotBlank(latText) && StringUtils.isNotBlank(lonText)) { - // latitude & longitude - Map<String, Object> latParsed = cgBase.parseCoordinate(latText, "lat"); - Map<String, Object> lonParsed = cgBase.parseCoordinate(lonText, "lon"); - - if (latParsed == null || latParsed.get("coordinate") == null || latParsed.get("string") == null) { + try { + latitude = GeopointParser.parseLatitude(latText); + } catch (GeopointParser.ParseException e) { showToast(res.getString(R.string.err_parse_lat)); return; } - if (lonParsed == null || lonParsed.get("coordinate") == null || lonParsed.get("string") == null) { + try { + longitude = GeopointParser.parseLongitude(lonText); + } catch (GeopointParser.ParseException e) { showToast(res.getString(R.string.err_parse_lon)); return; } - - latitude = (Double) latParsed.get("coordinate"); - longitude = (Double) lonParsed.get("coordinate"); } else { if (geo == null || geo.coordsNow == null) { showToast(res.getString(R.string.err_point_curr_position_unavailable)); diff --git a/src/cgeo/geocaching/files/LocParser.java b/src/cgeo/geocaching/files/LocParser.java index 34ef7f1..240d61d 100644 --- a/src/cgeo/geocaching/files/LocParser.java +++ b/src/cgeo/geocaching/files/LocParser.java @@ -1,6 +1,5 @@ package cgeo.geocaching.files; -import cgeo.geocaching.cgBase; import cgeo.geocaching.cgCache; import cgeo.geocaching.cgCacheWrap; import cgeo.geocaching.cgCoord; @@ -8,7 +7,7 @@ import cgeo.geocaching.cgSearch; import cgeo.geocaching.cgSettings; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.enumerations.CacheSize; -import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.geopoint.GeopointParser; import org.apache.commons.lang3.StringUtils; @@ -96,10 +95,8 @@ public final class LocParser extends FileParser { final Matcher matcherLat = patternLat.matcher(pointString); final Matcher matcherLon = patternLon.matcher(pointString); if (matcherLat.find() && matcherLon.find()) { - final Map<String, Object> tmpLat = cgBase.parseCoordinate(matcherLat.group(1).trim(), "lat"); - final Map<String, Object> tmpLon = cgBase.parseCoordinate(matcherLon.group(1).trim(), "lon"); - pointCoord.coords = new Geopoint((Double) tmpLat.get("coordinate"), - (Double) tmpLon.get("coordinate")); + pointCoord.coords = + GeopointParser.parse(matcherLat.group(1).trim(), matcherLon.group(1).trim()); } final Matcher matcherDifficulty = patternDifficulty.matcher(pointString); if (matcherDifficulty.find()) { diff --git a/src/cgeo/geocaching/geopoint/GeopointParser.java b/src/cgeo/geocaching/geopoint/GeopointParser.java index 5545438..46e6bc3 100644 --- a/src/cgeo/geocaching/geopoint/GeopointParser.java +++ b/src/cgeo/geocaching/geopoint/GeopointParser.java @@ -49,6 +49,36 @@ public class GeopointParser return new Geopoint(lat, lon); } + /** + * Parses a pair of coordinates (latitude and longitude) out of a String. + * Accepts following formats and combinations of it: + * X DD + * X DD° + * X DD° MM + * X DD° MM.MMM + * X DD° MM SS + * + * as well as: + * DD.DDDDDDD + * + * Both . and , are accepted, also variable count of spaces (also 0) + * + * @param latitude + * the latitude string to parse + * @param longitude + * the longitude string to parse + * @return an Geopoint with parsed latitude and longitude + * @throws ParseException + * if lat or lon could not be parsed + */ + public static Geopoint parse(final String latitude, final String longitude) + { + final double lat = parseLatitude(latitude); + final double lon = parseLongitude(longitude); + + return new Geopoint(lat, lon); + } + /* * (non JavaDoc) * Helper for coordinates-parsing. |
