aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2011-09-15 14:59:42 +0200
committerSamuel Tardieu <sam@rfc1149.net>2011-09-15 15:14:49 +0200
commit880f483c345b687181027f0e0074ec4461039ba2 (patch)
treedbfcd909881065057de4fcc296bd92ce6002bbbe /src
parent42b8d8542e4056ece23af2ff8ee2b5db8abe832b (diff)
downloadcgeo-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.java112
-rw-r--r--src/cgeo/geocaching/cgeoadvsearch.java21
-rw-r--r--src/cgeo/geocaching/cgeopoint.java18
-rw-r--r--src/cgeo/geocaching/cgeowaypointadd.java17
-rw-r--r--src/cgeo/geocaching/files/LocParser.java9
-rw-r--r--src/cgeo/geocaching/geopoint/GeopointParser.java30
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.