nmeatrackpoint.java

来自「world wind java sdk 源码」· Java 代码 · 共 212 行

JAVA
212
字号
/*Copyright (C) 2001, 2006 United States Governmentas represented by the Administrator of theNational Aeronautics and Space Administration.All Rights Reserved.*/package gov.nasa.worldwind.formats.nmea;import gov.nasa.worldwind.tracks.TrackPoint;import gov.nasa.worldwind.util.Logging;import gov.nasa.worldwind.geom.Position;/** * @author tag * @version $Id: NmeaTrackPoint.java 2815 2007-09-12 19:24:02Z tgaskins $ */public class NmeaTrackPoint implements TrackPoint{    private double latitude;    private double longitude;    private double altitude;    private double geoidHeight;    private String time;    /**     * @param words     * @throws IllegalArgumentException if <code>words</code> is null or has length less than 1     */    public NmeaTrackPoint(String[] words)    {        if (words == null)        {            String msg = Logging.getMessage("nullValue.ArrayIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        if (words.length < 1)        {            String msg = Logging.getMessage("generic.ArrayInvalidLength", words.length);            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        if (words[0].equalsIgnoreCase("GPGGA"))            this.doGGA(words);        else if (words[0].equalsIgnoreCase("GPRMC"))            this.doRMC(words);    }    /**     * @param words     * @throws IllegalArgumentException if <code>words</code> is null or has length less than 6     */    private void doGGA(String[] words)    {        // words won't be null, but it could be the wrong length        if (words.length < 6)        {            String msg = Logging.getMessage("generic.ArrayInvalidLength", words.length);            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        this.time = words[1];        this.latitude = this.parseLatitude(words[2], words[3]);        this.longitude = this.parseLongitude(words[4], words[5]);        if (words.length >= 11)            this.altitude = this.parseElevation(words[9], words[10]);        if (words.length >= 13)            this.geoidHeight = this.parseElevation(words[11], words[12]);    }    private void doRMC(String[] words)    {    }    private double parseLatitude(String angle, String direction)    {        if (angle.length() == 0)            return 0;        double minutes = angle.length() > 2 ? Double.parseDouble(angle.substring(2, angle.length())) : 0d;        double degrees = Double.parseDouble(angle.substring(0, 2)) + minutes / 60d;        return direction.equalsIgnoreCase("S") ? -degrees : degrees;    }    private double parseLongitude(String angle, String direction)    {        if (angle.length() == 0)            return 0;        double minutes = angle.length() > 3 ? Double.parseDouble(angle.substring(3, angle.length())) : 0d;        double degrees = Double.parseDouble(angle.substring(0, 3)) + minutes / 60d;        return direction.equalsIgnoreCase("W") ? -degrees : degrees;    }    private double parseElevation(String height, String units)    {        if (height.length() == 0)            return 0;        return Double.parseDouble(height) * unitsToMeters(units);    }    private double unitsToMeters(String units)    {        double f;        if (units.equals("M")) // meters            f = 1d;        else if (units.equals("f")) // feet            f = 3.2808399;        else if (units.equals("F")) // fathoms            f = 0.5468066528;        else            f = 1d;        return f;    }    public double getLatitude()    {        return latitude;    }    /**     * @param latitude     * @throws IllegalArgumentException if <code>latitude</code> is less than -90 or greater than 90     */    public void setLatitude(double latitude)    {        if (latitude > 90 || latitude < -90)        {            String msg = Logging.getMessage("generic.AngleOutOfRange", latitude);            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        this.latitude = latitude;    }    public double getLongitude()    {        return longitude;    }    /**     * @param longitude     * @throws IllegalArgumentException if <code>longitude</code> is less than -180 or greater than 180     */    public void setLongitude(double longitude)    {        if (longitude > 180 || longitude < -180)        {            String msg = Logging.getMessage("generic.AngleOutOfRange", longitude);            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        this.longitude = longitude;    }    public Position getPosition()    {        return Position.fromDegrees(this.latitude, this.longitude, this.altitude);    }    public void setPosition(Position position)    {        if (position == null)        {            String msg = Logging.getMessage("nullValue.PositionIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        this.latitude = position.getLatitude().getDegrees();        this.longitude = position.getLongitude().getDegrees();        this.altitude = position.getElevation();    }    public double getElevation()    {        return this.altitude + this.geoidHeight;    }    public void setElevation(double elevation)    {        this.altitude = elevation;        this.geoidHeight = 0;    }    public String getTime()    {        return time;    }    public void setTime(String time)    {        this.time = time;    }    @Override    public String toString()    {        return String.format("(%10.8f\u00B0, %11.8f\u00B0, %10.4g m, %10.4g m, %s)", this.latitude, this.longitude,            this.altitude, this.geoidHeight, this.time);    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?