nmea

by asdasdasdasd on July 6th, 2009
No notes
Syntax: Java - TinyURL for this snippet: http://tinyurl.com/nh3e23
Show lines - Hide lines - Show in textbox - Download
package gpsdata;
 
import java.text.NumberFormat;
/**
 * 
 * @author Andrea
 *
 */
public class DmsCoord {
 
	final static String NMEA_NORTH = "N";
	final static String NMEA_WEST  = "W";
	final static String NMEA_EAST  = "E";
	final static String NMEA_SOUTH = "S";
	final static String NMEA_SEP = ",";
 
	int deg, min;
	double sec;
 
	public DmsCoord(int deg, int min, double sec) {
		super();
		this.deg = deg;
		this.min = min;
		this.sec = sec;
	}
 
	public DmsCoord() {
		// TODO Auto-generated constructor stub
	}
 
	public int getDegrees() {
		return deg;
	}
	public void setDegrees(int deg) {
		this.deg = deg;
	}
	public int getMin() {
		return min;
	}
	public void setMin(int min) {
		this.min = min;
	}
	public double getSec() {
		return sec;
	}
	public void setSec(double sec) {
		this.sec = sec;
	}
 
	/**
	 * lat = ddmm.sssss
	 * lon = dddmm.sssss 
	 * @param f
	 * @param lat true = lat, false = lon
	 * @return
	 */
	String getNMEAString( boolean lat ){
		int deg = getDegrees();
		if (deg<0)
			deg = -deg;
		String dir = null;
 
		String str = null;
 
		if (lat){
			str = String.format("%02d", deg);
		} else {
			str = String.format("%03d", deg);
		}
 
		int mills = (int) ( (getSec()-(int)getSec())*1000);
 
		str += String.format("%02d.%02d%03d", getMin(), (int)getSec(), mills);
 
		if (lat){
			assert( str.length() == 10 );
		} else {
			assert( str.length() == 11 );
		}
 
		if (lat){
			// latitude
			dir = NMEA_NORTH;
			if (getDegrees() < 0){
				dir = NMEA_SOUTH;
			}
		} else { 
			// longitude
			dir = NMEA_EAST;
			if (getDegrees() < 0){
				dir = NMEA_WEST;
			}
		}
 
		str += DmsCoord.NMEA_SEP + dir;
 
		return str;
	}
	/**
	 * 
	 * @return
	 */
	public double getDecDeg(){
		int degInt = getDegrees();
		if (degInt<0)
			degInt = -degInt;
 
 
		double frac =  ((double)getMin()/60) + (getSec()/3600);
		double dec = getDegrees(); 
		if (getDegrees()<0)
			dec -= frac;
		else dec += frac;
		return dec;
	}
 
	/**
	 * 
	 * @param dec
	 */
	public void setDecDeg( double dec ){
		int deg = (int)dec;
		double posDec = dec;
		if (dec<0)
			posDec = -posDec; 
 
		double decPart = posDec - (int)posDec;
		int min = (int)(decPart * 60);
		decPart -= (double)min / 60;
		double sec = decPart * 60 * 60;
 
		this.deg = deg;
		this.min = min;
		this.sec = sec;
	}
 
	/**
	 * 
	 * @param nmea
	 */
	void setNMEAString( String nmeaCoords, String nmeaDirection ){
		if ( NMEA_NORTH.equalsIgnoreCase(nmeaDirection)|| NMEA_SOUTH.equalsIgnoreCase(nmeaDirection) )
		{
			// lat
			setNMEACoord( nmeaCoords, true );
			if (NMEA_SOUTH.equalsIgnoreCase(nmeaDirection))
				setDegrees( -getDegrees() );
		} else 
			if ( NMEA_WEST.equalsIgnoreCase(nmeaDirection)|| NMEA_EAST.equalsIgnoreCase(nmeaDirection) )
			{
				// lon
				setNMEACoord( nmeaCoords, false );
				if (NMEA_WEST.equalsIgnoreCase(nmeaDirection))
					setDegrees( -getDegrees() );
			} else 
				assert(false);
	}
 
	/**
	 * 
	 * @param nmeaCoord
	 * @param lat
	 */
	private void setNMEACoord( String nmeaCoord, boolean lat ){
		String [] strArr = nmeaCoord.split("\\.");
 
		String degreeStr = null, minStr = null;
 
		if (lat){
			assert( strArr[0].length() == 4 );
			degreeStr = strArr[0].substring(0, 2);
			minStr = strArr[0].substring(2, 4);
 
		} else {
			assert( strArr[0].length() == 5 );
			degreeStr = strArr[0].substring(0, 3);
			minStr = strArr[0].substring(3, 5);			
		}
		String secStr = strArr[1];
		int deg = Integer.parseInt(degreeStr);
		int min = Integer.parseInt(minStr);
		double sec = Double.parseDouble(secStr) / 1000;
 
		setDegrees(deg);
		setMin(min);
		setSec(sec);
	}
 
}
 

Leave a Reply

Note: XHTML is allowed. Your email address will never be published.

Subscribe to this comment feed via RSS