1/*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5package jme3tools.navigation;
6
7/**
8 * This class represents the position of an entity in the world.
9 *
10 * @author Benjamin Jakobus (based on JMarine by Cormac Gebruers and Benjamin Jakobus)
11 * @version 1.0
12 * @since 1.0
13 */
14public class Position {
15
16    /* the latitude (+ N/E) */
17    private Coordinate lat;
18
19    /* the longitude  (-W/S) */
20    private Coordinate lng;
21
22    /* An optional time to associate with this position - for historical tracking */
23    private String utcTimeStamp;
24
25    /* Degree position */
26    private double degree;
27
28    /**
29     * A new position expressed in decimal format
30     * @param dblLat
31     * @param dblLng
32     * @since 1.0
33     */
34    public Position(double dblLat, double dblLng) throws InvalidPositionException {
35        lat = new Coordinate(dblLat, Coordinate.LAT);
36        lng = new Coordinate(dblLng, Coordinate.LNG);
37    }
38
39    /**
40     * A new position expressed in decimal format and degrees
41     * @param dblLat
42     * @param dblLng
43     * @param degree
44     * @since 1.0
45     */
46//    public Position(double dblLat, double dblLng, double degree) throws InvalidPositionException {
47//        lat = new Coordinate(dblLat, Coordinate.LAT);
48//        lng = new Coordinate(dblLng, Coordinate.LNG);
49//        this.degree = degree;
50//    }
51    /**
52     * A new position expressed in DegMin format
53     * @param latDeg
54     * @param latMin
55     * @param lngDeg
56     * @param lngMin
57     * @since 1.0
58     */
59    public Position(int latDeg, float latMin, int latQuad, int lngDeg,
60            float lngMin, int lngQuad) throws InvalidPositionException {
61        lat = new Coordinate(latDeg, latMin, Coordinate.LAT, latQuad);
62        lng = new Coordinate(lngDeg, lngMin, Coordinate.LNG, lngQuad);
63    }
64
65    /**
66     * A new position expressed in ALRS format
67     * @param lat
68     * @param lng
69     * @since 1.0
70     */
71    public Position(String lat, String lng) throws InvalidPositionException {
72        this.lat = new Coordinate(lat);
73        this.lng = new Coordinate(lng);
74    }
75
76    /**
77     * A new position expressed in NMEA GPS message format:
78     * 4807.038,N,01131.000,E
79     * @param
80     * @param
81     * @param
82     * @param
83     * @since  12.0
84     */
85    public Position(String latNMEAGPS, String latQuad, String lngNMEAGPS, String lngQuad, String utcTimeStamp) {
86        int quad;
87
88        //LAT
89        if (latQuad.compareTo("N") == 0) {
90            quad = Coordinate.N;
91        } else {
92            quad = Coordinate.S;
93        }
94        try {
95            this.lat = new Coordinate(Integer.valueOf(latNMEAGPS.substring(0, 2)), Float.valueOf(latNMEAGPS.substring(2)), Coordinate.LAT, quad);
96        } catch (InvalidPositionException e) {
97            e.printStackTrace();
98        }
99
100        //LNG
101        if (lngQuad.compareTo("E") == 0) {
102            quad = Coordinate.E;
103        } else {
104            quad = Coordinate.W;
105        }
106        try {
107            this.lng = new Coordinate(Integer.valueOf(lngNMEAGPS.substring(0, 3)), Float.valueOf(lngNMEAGPS.substring(3)), Coordinate.LNG, quad);
108        } catch (InvalidPositionException e) {
109            e.printStackTrace();
110        }
111
112        //TIMESTAMP
113        this.associateUTCTime(utcTimeStamp);
114    }
115
116    /**
117     * Add a reference time for this position - useful for historical tracking
118     * @param data
119     * @since 1.0
120     */
121    public void associateUTCTime(String data) {
122        utcTimeStamp = data;
123    }
124
125    /**
126     * Returns the UTC time stamp
127     * @return str the UTC timestamp
128     * @since 1.0
129     */
130    public String utcTimeStamp() {
131        return utcTimeStamp;
132    }
133
134    /**
135     * Prints out position using decimal format
136     * @return the position in decimal format
137     */
138    public String toStringDec() {
139        return lat.toStringDec() + " " + lng.toStringDec();
140    }
141
142    /**
143     * Return the position latitude in decimal format
144     * @return the latitude in decimal format
145     * @since 1.0
146     */
147    public double getLatitude() {
148        return lat.decVal();
149    }
150
151    /**
152     * Returns the degree of the entity
153     * @return degree
154     * @since 1.0
155     */
156//    public double getDegree() {
157//        return degree;
158//    }
159    /**
160     * Return the position longitude in decimal format
161     * @return the longitude in decimal format
162     * @since 1.0
163     */
164    public double getLongitude() {
165        return lng.decVal();
166    }
167
168    /**
169     * Prints out position using DegMin format
170     * @return the position in DegMin Format
171     * @since 1.0
172     */
173    public String toStringDegMin() {
174        String output = "";
175        output += lat.toStringDegMin();
176        output += "   " + lng.toStringDegMin();
177        return output;
178    }
179
180    /**
181     * Prints out the position latitude
182     * @return the latitude as a string for display purposes
183     * @since 1.0
184     */
185    public String toStringDegMinLat() {
186        return lat.toStringDegMin();
187    }
188
189    /**
190     * Prints out the position longitude
191     * @return the longitude as a string for display purposes
192     * @since 1.0
193     */
194    public String toStringDegMinLng() {
195        return lng.toStringDegMin();
196    }
197
198    /**
199     * Prints out the position latitude
200     * @return the latitude as a string for display purposes
201     * @since 1.0
202     */
203    public String toStringDecLat() {
204        return lat.toStringDec();
205    }
206
207    /**
208     * Prints out the position longitude
209     * @return the longitude as a string for display purposes
210     * @since 1.0
211     */
212    public String toStringDecLng() {
213        return lng.toStringDec();
214    }
215
216    //TEST HARNESS - DO NOT DELETE!
217    public static void main(String[] argsc) {
218
219        //NMEA GPS Position format:
220        Position p = new Position("4807.038", "N", "01131.000", "W", "123519");
221        System.out.println(p.toStringDegMinLat());
222        System.out.println(p.getLatitude());
223        System.out.println(p.getLongitude());
224        System.out.println(p.toStringDegMinLng());
225        System.out.println(p.utcTimeStamp());
226
227    }//main
228}
229