diff options
author | Arne Juul <arnej@verizonmedia.com> | 2020-07-08 12:53:44 +0000 |
---|---|---|
committer | Arne Juul <arnej@verizonmedia.com> | 2020-07-15 15:39:20 +0000 |
commit | b3669d86589a0123338fe75c192cf9c79d331c1b (patch) | |
tree | 583d62373ef72ba513622b2d4cc33f9b860fecd9 /vespajlib | |
parent | 576b4e2d9b35440d7cf0e6ccf19213b2d5cd6102 (diff) |
add simple distance parser
Diffstat (limited to 'vespajlib')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/geo/ParseDegree.java | 21 | ||||
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/geo/ParseDistance.java | 56 |
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; + } + } + +} |