package org.osm2world.console; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * immutable latitude/longitude/elevation coordinate triple */ public class LatLonEle { public final double lat; public final double lon; public final double ele; private static final String DOUBLE_P = "[+-]?\\d+(?:\\.\\d+)?"; /** * pattern for parseable arguments */ public static final String PATTERN = "("+DOUBLE_P+"),("+DOUBLE_P+")"; public static final String PATTERN_WITH_ELE = PATTERN + ",(" + DOUBLE_P + ")"; /** * regular constructor */ public LatLonEle(double lat, double lon, double ele) { this.lat = lat; this.lon = lon; this.ele = ele; validateValues(); } /** * regular constructor (with default elevation of 0) */ public LatLonEle(double lat, double lon) { this(lat, lon, 0); } /** * parsing constructor * @param arg command line argument to be parsed; * formats see {@link #PATTERN} and {@link #PATTERN_WITH_ELE} */ public LatLonEle(String arg) { Matcher mEle = Pattern.compile(PATTERN_WITH_ELE).matcher(arg); Matcher m = Pattern.compile(PATTERN).matcher(arg); if (mEle.matches()) { lat = Double.parseDouble(mEle.group(1)); lon = Double.parseDouble(mEle.group(2)); ele = Double.parseDouble(mEle.group(3)); validateValues(); } else if (m.matches()) { lat = Double.parseDouble(m.group(1)); lon = Double.parseDouble(m.group(2)); ele = 0; validateValues(); } else { throw new IllegalArgumentException("argument doesn't match: " + arg); } } /** * @throws IllegalArgumentException for incorrect field values */ private void validateValues() { if (lat > 90 || lat < -90 || lon > 180 || lon < -180) { throw new IllegalArgumentException("not valid: " + lat + ", " + lon); } } @Override public String toString() { return lat + "," + lon; } }