summaryrefslogtreecommitdiffstats
path: root/vespajlib
diff options
context:
space:
mode:
authorArne Juul <arnej@verizonmedia.com>2020-07-08 12:53:44 +0000
committerArne Juul <arnej@verizonmedia.com>2020-07-15 15:39:20 +0000
commitb3669d86589a0123338fe75c192cf9c79d331c1b (patch)
tree583d62373ef72ba513622b2d4cc33f9b860fecd9 /vespajlib
parent576b4e2d9b35440d7cf0e6ccf19213b2d5cd6102 (diff)
add simple distance parser
Diffstat (limited to 'vespajlib')
-rw-r--r--vespajlib/src/main/java/com/yahoo/geo/ParseDegree.java21
-rw-r--r--vespajlib/src/main/java/com/yahoo/geo/ParseDistance.java56
2 files changed, 74 insertions, 3 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/geo/ParseDegree.java b/vespajlib/src/main/java/com/yahoo/geo/ParseDegree.java
index fe783b95414..a6200ed60c6 100644
--- a/vespajlib/src/main/java/com/yahoo/geo/ParseDegree.java
+++ b/vespajlib/src/main/java/com/yahoo/geo/ParseDegree.java
@@ -31,6 +31,14 @@ public class ParseDegree {
private int len = 0;
private int pos = 0;
+ public String toString() {
+ if (foundLatitude) {
+ return parseString + " -> latitude(" + latitude + ")";
+ } else {
+ return parseString + " -> longitude(" + longitude + ")";
+ }
+ }
+
private char getNextChar() throws IllegalArgumentException {
if (pos == len) {
pos++;
@@ -71,11 +79,11 @@ public class ParseDegree {
* "N63.418417" and "E10.433033" → same <br>
* "63N25.105" and "10E25.982" → same <br>
* @param assume_n_s Latitude assumed, otherwise longitude
- * @param latorlong Latitude or longitude
+ * @param lat_or_lon Latitude or longitude
*
**/
- public ParseDegree(boolean assume_n_s, String lat_or_long) throws IllegalArgumentException {
- this.parseString = lat_or_long;
+ public ParseDegree(boolean assume_n_s, String lat_or_lon) throws IllegalArgumentException {
+ this.parseString = lat_or_lon;
this.len = parseString.length();
consumeString(assume_n_s);
}
@@ -263,5 +271,12 @@ public class ParseDegree {
}
} while (ch != 0);
// everything parsed OK
+ if (foundLatitude && foundLongitude) {
+ throw new IllegalArgumentException("found both latitude and longitude from: "+parseString);
+ }
+ if (foundLatitude || foundLongitude) {
+ return;
+ }
+ throw new IllegalArgumentException("found neither latitude nor longitude from: "+parseString);
}
}
diff --git a/vespajlib/src/main/java/com/yahoo/geo/ParseDistance.java b/vespajlib/src/main/java/com/yahoo/geo/ParseDistance.java
new file mode 100644
index 00000000000..8a96ec32f8d
--- /dev/null
+++ b/vespajlib/src/main/java/com/yahoo/geo/ParseDistance.java
@@ -0,0 +1,56 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+package com.yahoo.geo;
+
+public class ParseDistance {
+ // according to wikipedia:
+ // Earth's equatorial radius = 6378137 meter - not used
+ // meters per mile = 1609.344
+ // 180 degrees equals one half diameter equals PI*r
+ // Earth's polar radius = 6356752 meter
+
+ public final static double m2deg = 180.0 / (Math.PI * 6356752.0);
+ 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 ParseDistance(String distance) {
+ if (distance.endsWith(" km")) {
+ double km = Double.valueOf(distance.substring(0, distance.length()-3));
+ degrees = km * km2deg;
+ } else if (distance.endsWith(" m")) {
+ double meters = Double.valueOf(distance.substring(0, distance.length()-2));
+ degrees = meters * m2deg;
+ } else if (distance.endsWith(" miles")) {
+ double miles = Double.valueOf(distance.substring(0, distance.length()-6));
+ degrees = miles * mi2deg;
+ } else if (distance.endsWith(" mi")) {
+ double miles = Double.valueOf(distance.substring(0, distance.length()-3));
+ degrees = miles * mi2deg;
+ } else if (distance.endsWith(" deg")) {
+ degrees = Double.valueOf(distance.substring(0, distance.length()-4));
+ } else if (distance.endsWith(" d")) {
+ degrees = Double.valueOf(distance.substring(0, distance.length()-2));
+ } else if (distance.endsWith("km")) {
+ double km = Double.valueOf(distance.substring(0, distance.length()-2));
+ degrees = km * km2deg;
+ } else if (distance.endsWith("m")) {
+ double meters = Double.valueOf(distance.substring(0, distance.length()-1));
+ degrees = meters * m2deg;
+ } else if (distance.endsWith("miles")) {
+ double miles = Double.valueOf(distance.substring(0, distance.length()-5));
+ degrees = miles * mi2deg;
+ } else if (distance.endsWith("mi")) {
+ double miles = Double.valueOf(distance.substring(0, distance.length()-2));
+ degrees = miles * mi2deg;
+ } else if (distance.endsWith("deg")) {
+ degrees = Double.valueOf(distance.substring(0, distance.length()-3));
+ } else if (distance.endsWith("d")) {
+ degrees = Double.valueOf(distance.substring(0, distance.length()-1));
+ } else {
+ degrees = Integer.parseInt(distance) * 0.000001;
+ }
+ }
+
+}