package org.syzygy.gps; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; /** * A Location Bean. * <p/> * This class was written by Stephen Crane (jscrane@gmail.com) * and is released under the terms of the GNU GPL * (http://www.gnu.org/licenses/gpl.html). */ public final class Location { public Location() { } public Location(Location l) { setLatitude(l.getLatitude()); setLongitude(l.getLongitude()); setSpeed(l.getSpeed()); setDate(l.getDate()); setAltitude(l.getAltitude()); setCourse(l.getCourse()); setIsError(l.getIsError()); } public void setLatitude(double latitude) { this.latitude = latitude; } public double getLatitude() { return latitude; } public void setLongitude(double longitude) { this.longitude = longitude; } public double getLongitude() { return longitude; } public void setSpeed(double knots) { this.speed = knots; } public double getSpeed() { return speed; } public double getSpeedMph() { return speed * 1.1507771555; } public double getSpeedKmh() { return speed * 1.85198479488; } public void setUtcDate(String s) { if (s.length() == 6) { Calendar c = Calendar.getInstance(); c.setTime(new Date()); int y = c.get(Calendar.YEAR); c.setTime(getDate()); c.set(Calendar.DAY_OF_MONTH, Integer.parseInt(s.substring(0, 2))); c.set(Calendar.MONTH, Integer.parseInt(s.substring(2, 4)) - 1); int ty = Integer.parseInt(s.substring(4, 6)) + 2000; if (ty > y) ty -= 100; c.set(Calendar.YEAR, ty); setDate(c.getTime()); } } public String getUtcDate() { Calendar c = Calendar.getInstance(); c.setTime(getDate()); return toStringWithLeadingZero(c.get(Calendar.DAY_OF_MONTH)) + toStringWithLeadingZero(c.get(Calendar.MONTH) + 1) + toStringWithLeadingZero(c.get(Calendar.YEAR) % 100); } public void setGpsTime(String s) { if (s.length() >= 6) { Calendar c = Calendar.getInstance(); c.setTime(getDate()); c.set(Calendar.HOUR_OF_DAY, Integer.parseInt(s.substring(0, 2))); c.set(Calendar.MINUTE, Integer.parseInt(s.substring(2, 4))); c.set(Calendar.SECOND, Integer.parseInt(s.substring(4, 6))); setDate(c.getTime()); } } private String toStringWithLeadingZero(int i) { String s = ""; if (i < 10) s += "0"; return s += new Integer(i).toString(); } public String getGpsTime() { Calendar c = Calendar.getInstance(); c.setTime(getDate()); return toStringWithLeadingZero(c.get(Calendar.HOUR_OF_DAY)) + toStringWithLeadingZero(c.get(Calendar.MINUTE)) + toStringWithLeadingZero(c.get(Calendar.SECOND)); } public void setDate(Date time) { this.time = time; } public Date getDate() { return time; } public String getIsoTime() { Calendar c = Calendar.getInstance(); c.setTime(getDate()); c.setTimeZone(TimeZone.getTimeZone("UTC")); StringBuffer b = new StringBuffer(); b.append(c.get(Calendar.YEAR)).append('-'); b.append(toStringWithLeadingZero(c.get(Calendar.MONTH) + 1)).append('-'); b.append(toStringWithLeadingZero(c.get(Calendar.DAY_OF_MONTH))).append('T'); b.append(toStringWithLeadingZero(c.get(Calendar.HOUR_OF_DAY))).append(':'); b.append(toStringWithLeadingZero(c.get(Calendar.MINUTE))).append(':'); b.append(toStringWithLeadingZero(c.get(Calendar.SECOND))).append('Z'); return b.toString(); } public void setAltitude(double altitude) { this.altitude = altitude; } public double getAltitude() { return altitude; } public void setCourse(double course) { this.course = course; } public double getCourse() { return course; } public void setIsError(boolean isError) { this.isError = isError; } public boolean getIsError() { return isError; } public void setSatellites(int satellites) { this.satellites = satellites; } public int getSatellites() { return satellites; } public boolean samePosition(Location other) { return other != null && latitude == other.getLatitude() && longitude == other.getLongitude() && altitude == other.getAltitude(); } public String toString() { String s = getGpsTime() + " " + getLatitude() + " " + getLongitude() + " " + getSpeed() + " " + getAltitude() + " " + getCourse() + " " + getUtcDate() + " " + getSatellites(); if (isError) s += " E"; return s; } public static Location parse(String s) { Location l = new Location(); s = s.trim(); for (int i = 0; i < 8; i++) { int idx = s.indexOf(' '); String t = idx == -1 ? s : s.substring(0, idx); s = s.substring(idx + 1); if (i == 0) l.setGpsTime(t); else if (i == 1) l.setLatitude(Double.parseDouble(t)); else if (i == 2) l.setLongitude(Double.parseDouble(t)); else if (i == 3) l.setSpeed(Double.parseDouble(t)); else if (i == 4) l.setAltitude(Double.parseDouble(t)); else if (i == 5) l.setCourse(Double.parseDouble(t)); else if (i == 6) l.setUtcDate(t); else if (i == 7) l.setSatellites(Integer.parseInt(t)); if (idx == -1) break; } l.setIsError("E".equals(s)); return l; } private double latitude, longitude, speed, altitude, course; private Date time = new Date(); private boolean isError = false; private int satellites; }