summaryrefslogtreecommitdiffstats
path: root/vespajlib
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2020-07-14 11:03:42 +0000
committerArne Juul <arnej@verizonmedia.com>2020-07-15 15:39:24 +0000
commit9debffd31d309a7fe4062241a731d5722f4199e0 (patch)
tree53a6e0ec72e6f74f57b05736ca16290e17da0aa6 /vespajlib
parentc5fc3ffbbd620f50992ac978fe0dab46a0d19f4f (diff)
refactor and require unit for distance
Diffstat (limited to 'vespajlib')
-rw-r--r--vespajlib/src/main/java/com/yahoo/geo/DistanceParser.java (renamed from vespajlib/src/main/java/com/yahoo/geo/ParseDistance.java)10
-rw-r--r--vespajlib/src/main/java/com/yahoo/geo/OneDegreeParser.java (renamed from vespajlib/src/main/java/com/yahoo/geo/ParseDegree.java)6
-rw-r--r--vespajlib/src/main/java/com/yahoo/geo/ParsedDegree.java57
-rw-r--r--vespajlib/src/test/java/com/yahoo/geo/OneDegreeParserTestCase.java (renamed from vespajlib/src/test/java/com/yahoo/geo/ParseDegreeTestCase.java)46
4 files changed, 89 insertions, 30 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/geo/ParseDistance.java b/vespajlib/src/main/java/com/yahoo/geo/DistanceParser.java
index 8a96ec32f8d..e184e4c36ba 100644
--- a/vespajlib/src/main/java/com/yahoo/geo/ParseDistance.java
+++ b/vespajlib/src/main/java/com/yahoo/geo/DistanceParser.java
@@ -2,7 +2,7 @@
package com.yahoo.geo;
-public class ParseDistance {
+public class DistanceParser {
// according to wikipedia:
// Earth's equatorial radius = 6378137 meter - not used
// meters per mile = 1609.344
@@ -13,9 +13,9 @@ public class ParseDistance {
public final static double km2deg = 1000.000 * 180.0 / (Math.PI * 6356752.0);
public final static double mi2deg = 1609.344 * 180.0 / (Math.PI * 6356752.0);
- public double degrees = 0.0;
+ public final double degrees;
- public ParseDistance(String distance) {
+ public DistanceParser(String distance, boolean assume_micro_degrees) {
if (distance.endsWith(" km")) {
double km = Double.valueOf(distance.substring(0, distance.length()-3));
degrees = km * km2deg;
@@ -48,8 +48,10 @@ public class ParseDistance {
degrees = Double.valueOf(distance.substring(0, distance.length()-3));
} else if (distance.endsWith("d")) {
degrees = Double.valueOf(distance.substring(0, distance.length()-1));
- } else {
+ } else if (assume_micro_degrees) {
degrees = Integer.parseInt(distance) * 0.000001;
+ } else {
+ throw new IllegalArgumentException("missing unit for distance: "+distance);
}
}
diff --git a/vespajlib/src/main/java/com/yahoo/geo/ParseDegree.java b/vespajlib/src/main/java/com/yahoo/geo/OneDegreeParser.java
index a6200ed60c6..2af85ad0b9e 100644
--- a/vespajlib/src/main/java/com/yahoo/geo/ParseDegree.java
+++ b/vespajlib/src/main/java/com/yahoo/geo/OneDegreeParser.java
@@ -3,11 +3,11 @@
package com.yahoo.geo;
/**
- * utility for parsing geographical coordinates
+ * utility for parsing one geographical coordinate
*
* @author arnej27959
**/
-public class ParseDegree {
+class OneDegreeParser {
/**
* the parsed latitude (degrees north if positive)
**/
@@ -82,7 +82,7 @@ public class ParseDegree {
* @param lat_or_lon Latitude or longitude
*
**/
- public ParseDegree(boolean assume_n_s, String lat_or_lon) throws IllegalArgumentException {
+ public OneDegreeParser(boolean assume_n_s, String lat_or_lon) throws IllegalArgumentException {
this.parseString = lat_or_lon;
this.len = parseString.length();
consumeString(assume_n_s);
diff --git a/vespajlib/src/main/java/com/yahoo/geo/ParsedDegree.java b/vespajlib/src/main/java/com/yahoo/geo/ParsedDegree.java
new file mode 100644
index 00000000000..0abcbd0c606
--- /dev/null
+++ b/vespajlib/src/main/java/com/yahoo/geo/ParsedDegree.java
@@ -0,0 +1,57 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+package com.yahoo.geo;
+
+/**
+ * utility for holding one geographical coordinate
+ *
+ * @author arnej27959
+ **/
+public class ParsedDegree {
+ /**
+ * the parsed latitude or longitude
+ * Degrees north or east if positive
+ * Degrees south or west if negative
+ **/
+ public final double degrees;
+
+ // one of these two flag will be true:
+ public final boolean isLatitude;
+ public final boolean isLongitude;
+
+ public ParsedDegree(double value, boolean isLat, boolean isLon) {
+ this.degrees = value;
+ this.isLatitude = isLat;
+ this.isLongitude = isLon;
+ if (isLat && isLon) {
+ throw new IllegalArgumentException("value cannot be both latitude and longitude at once");
+ }
+ if (isLat || isLon) {
+ return;
+ }
+ throw new IllegalArgumentException("value must be either latitude or longitude");
+ }
+
+ static public ParsedDegree fromString(String toParse, boolean assumeLatitude, boolean assumeLongitude) {
+ if (assumeLatitude && assumeLongitude) {
+ throw new IllegalArgumentException("value cannot be both latitude and longitude at once");
+ }
+ var parser = new OneDegreeParser(assumeLatitude, toParse);
+ if (parser.foundLatitude) {
+ return new ParsedDegree(parser.latitude, true, false);
+ }
+ if (parser.foundLongitude) {
+ return new ParsedDegree(parser.longitude, false, true);
+ }
+ throw new IllegalArgumentException("could not parse: "+toParse);
+ }
+
+ public String toString() {
+ if (isLatitude) {
+ return "Latitude: "+degrees+" degrees";
+ } else {
+ return "Longitude: "+degrees+" degrees";
+ }
+ }
+
+}
diff --git a/vespajlib/src/test/java/com/yahoo/geo/ParseDegreeTestCase.java b/vespajlib/src/test/java/com/yahoo/geo/OneDegreeParserTestCase.java
index 3ca2d7ce4f8..6a7ea5e826d 100644
--- a/vespajlib/src/test/java/com/yahoo/geo/ParseDegreeTestCase.java
+++ b/vespajlib/src/test/java/com/yahoo/geo/OneDegreeParserTestCase.java
@@ -8,24 +8,24 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
- * Tests for the ParseDegree class.
+ * Tests for the OneDegreeParser class.
*
* @author arnej27959
*/
-public class ParseDegreeTestCase {
+public class OneDegreeParserTestCase {
private static final double delta = 0.000000000001;
- private ParseDegree parser;
+ private OneDegreeParser parser;
private void checkLat(boolean ans, String to_parse, double expected) {
- parser = new ParseDegree(ans, to_parse);
+ parser = new OneDegreeParser(ans, to_parse);
assertEquals(expected, parser.latitude, delta);
assertTrue(parser.foundLatitude);
assertFalse(parser.foundLongitude);
}
private void checkLon(boolean ans, String to_parse, double expected) {
- parser = new ParseDegree(ans, to_parse);
+ parser = new OneDegreeParser(ans, to_parse);
assertEquals(expected, parser.longitude, delta);
assertFalse(parser.foundLatitude);
assertTrue(parser.foundLongitude);
@@ -146,49 +146,49 @@ public class ParseDegreeTestCase {
public void testAboveBoundary() {
String message = "";
try {
- parser = new ParseDegree(false, "N90.0001");
+ parser = new OneDegreeParser(false, "N90.0001");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("out of range [-90,+90]: 90.0001", message);
try {
- parser = new ParseDegree(false, "S90.0001");
+ parser = new OneDegreeParser(false, "S90.0001");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("out of range [-90,+90]: -90.0001", message);
try {
- parser = new ParseDegree(true, "E180.0001");
+ parser = new OneDegreeParser(true, "E180.0001");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("out of range [-180,+180]: 180.0001", message);
try {
- parser = new ParseDegree(true, "W180.0001");
+ parser = new OneDegreeParser(true, "W180.0001");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("out of range [-180,+180]: -180.0001", message);
try {
- parser = new ParseDegree(false, "N90.000001");
+ parser = new OneDegreeParser(false, "N90.000001");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("out of range [-90,+90]: 90.000001", message);
try {
- parser = new ParseDegree(false, "S90.000001");
+ parser = new OneDegreeParser(false, "S90.000001");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("out of range [-90,+90]: -90.000001", message);
try {
- parser = new ParseDegree(true, "E180.000001");
+ parser = new OneDegreeParser(true, "E180.000001");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("out of range [-180,+180]: 180.000001", message);
try {
- parser = new ParseDegree(true, "W180.000001");
+ parser = new OneDegreeParser(true, "W180.000001");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
@@ -202,61 +202,61 @@ public class ParseDegreeTestCase {
public void testInputErrors() {
String message = "";
try {
- parser = new ParseDegree(false, "N90S90");
+ parser = new OneDegreeParser(false, "N90S90");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("already set direction once, cannot add direction: S", message);
try {
- parser = new ParseDegree(false, "E120W120");
+ parser = new OneDegreeParser(false, "E120W120");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("already set direction once, cannot add direction: W", message);
try {
- parser = new ParseDegree(false, "E");
+ parser = new OneDegreeParser(false, "E");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("end of field without any number seen", message);
try {
- parser = new ParseDegree(false, "");
+ parser = new OneDegreeParser(false, "");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("end of field without any number seen", message);
try {
- parser = new ParseDegree(false, "NW25");
+ parser = new OneDegreeParser(false, "NW25");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("already set direction once, cannot add direction: W", message);
try {
- parser = new ParseDegree(false, "N16.25\u00B0");
+ parser = new OneDegreeParser(false, "N16.25\u00B0");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("cannot have fractional degrees before degrees sign", message);
try {
- parser = new ParseDegree(false, "N16\u00B022.40'");
+ parser = new OneDegreeParser(false, "N16\u00B022.40'");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("cannot have fractional minutes before minutes sign", message);
try {
- parser = new ParseDegree(false, "");
+ parser = new OneDegreeParser(false, "");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("end of field without any number seen", message);
try {
- parser = new ParseDegree(false, "Yahoo!");
+ parser = new OneDegreeParser(false, "Yahoo!");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}
assertEquals("invalid character: Y", message);
try {
- parser = new ParseDegree(false, "N63O025.105");
+ parser = new OneDegreeParser(false, "N63O025.105");
} catch (IllegalArgumentException e) {
message = e.getMessage();
}