sartrack.java

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

JAVA
534
字号
/*Copyright (C) 2001, 2007 United States Governmentas represented by the Administrator of theNational Aeronautics and Space Administration.All Rights Reserved.*/package gov.nasa.worldwind.applications.sar;import gov.nasa.worldwind.formats.gpx.GpxReader;import gov.nasa.worldwind.formats.gpx.GpxWriter;import gov.nasa.worldwind.formats.nmea.NmeaReader;import gov.nasa.worldwind.formats.nmea.NmeaWriter;import gov.nasa.worldwind.formats.csv.CSVReader;import gov.nasa.worldwind.formats.csv.CSVWriter;import gov.nasa.worldwind.geom.*;import gov.nasa.worldwind.tracks.*;import org.xml.sax.SAXException;import javax.xml.parsers.ParserConfigurationException;import java.awt.*;import java.beans.*;import java.io.*;import java.util.*;/** * @author tag * @version $Id: SARTrack.java 9496 2009-03-18 19:23:14Z dcollins $ */public class SARTrack implements Iterable<Position>{    public static final int FORMAT_GPX = 1;    public static final int FORMAT_CSV = 2;    public static final int FORMAT_NMEA = 3;    private static int nextColor = 0;    private static Color[] colors = new Color[]        {            Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW, Color.CYAN, Color.MAGENTA, Color.ORANGE, Color.PINK,            Color.WHITE        };    private static Color nextColor()    {        return colors[nextColor++ % colors.length];    }    // Meta-track properties.    private File file = null;    private String name = null;    private int format = 0;    private long lastSaveTime = 0L;    private long lastModifiedTime = 0L;    // Track properties.    private double offset = 0;    private Color color = nextColor();    private ArrayList<SARPosition> positions;    private PropertyChangeSupport propChangeSupport = new PropertyChangeSupport(this);    public static SARTrack fromFile(String filePath) throws IOException    {        File file = new File(filePath);        if (!file.exists())            return null; // TODO: issue message        SARTrack track = null;        int format = 0;        do        {            format++;            try            {                if (format == FORMAT_GPX)                    track = readGPX(filePath);                else if (format == FORMAT_CSV)                    track = readCSV(filePath);                else if (format == FORMAT_NMEA)                    track = readNMEA(filePath);            }            catch (IllegalArgumentException e)            {                //noinspection UnnecessaryContinue                continue;            }        } while (track == null && format <= 3);        if (track != null)        {            track.setFile(file);            track.setFormat(format);            track.setName(file.getName());        }        return track;    }    public static void toFile(SARTrack track, String filePath, int format) throws IOException    {        if (track == null)            throw new IllegalArgumentException("track is null");        if (filePath == null)            throw new IllegalArgumentException("filePath is null");                if (format == FORMAT_GPX)            writeGPX(track, filePath);        else if (format == FORMAT_CSV)            writeCSV(track, filePath);        else if (format == FORMAT_NMEA)            writeNMEA(track, filePath);        // If no format is specified, then do nothing.    }    private SARTrack()    {    }    public SARTrack(String name)    {        this.name = name;        this.positions = new ArrayList<SARPosition>();    }    public File getFile()    {        return this.file;    }    public void setFile(File file)    {        this.file = file;    }    public String getName()    {        return name;    }    public void setName(String name)    {        this.name = name;        this.firePropertyChange(TrackController.TRACK_NAME, null, this);    }    public int getFormat()    {        return format;    }    public void setFormat(int format)    {        this.format = format;    }    public long getLastSaveTime()    {        return this.lastSaveTime;    }    public long getLastModifiedTime()    {        return this.lastModifiedTime;    }    public boolean isDirty()    {        return this.lastModifiedTime == 0L || this.lastSaveTime == 0L || (this.lastModifiedTime > this.lastSaveTime);    }    public void markDirty()    {        this.lastModifiedTime = System.currentTimeMillis();        this.firePropertyChange(TrackController.TRACK_DIRTY_BIT, null, this);    }    public void clearDirtyBit()    {        long time = System.currentTimeMillis();        this.lastSaveTime = time;        this.lastModifiedTime = time;        this.firePropertyChange(TrackController.TRACK_DIRTY_BIT, null, this);    }    public Color getColor()    {        return color;    }    public void setColor(Color color)    {        this.color = color;    }    public int size()    {        return this.positions.size();    }    public ArrayList<SARPosition> getPositions()    {        return this.positions;    }    public SARPosition get(int index)    {        return this.positions.size() > index ? this.positions.get(index) : null;    }    public void set(int index, SARPosition position)    {        if (position == null)            return;        if (index >= this.positions.size())            this.positions.add(position);        else            this.positions.set(index, position);        this.markDirty();        this.firePropertyChange(TrackController.TRACK_MODIFY, null, index);    }    public void add(int index, SARPosition position)    {        if (position == null)            return;        if (index >= this.positions.size())            this.positions.add(position);        else            this.positions.add(index, position);        this.markDirty();        this.firePropertyChange(TrackController.TRACK_MODIFY, null, this);    }    public double getOffset()    {        return offset;    }    public void setOffset(double offset)    {        double oldOffset = this.offset;        this.offset = offset;        this.firePropertyChange(TrackController.TRACK_OFFSET, oldOffset, this.offset);    }    public Iterator<Position> iterator()    {        return new Iterator<Position>()        {            private Iterator<SARPosition> iter = SARTrack.this.positions.iterator();            public boolean hasNext()            {                return this.iter.hasNext();            }            public Position next()            {                return this.iter.next();            }            public void remove()            {                throw new UnsupportedOperationException("Remove operation not supported for SARTrack iterator");            }        };    }    public void removePosition(int index)    {        if (index < 0 || index >= this.positions.size())            return;        this.positions.remove(index);        this.markDirty();        this.firePropertyChange(TrackController.TRACK_MODIFY, null, this);    }    public void removePositions(int[] positionNumbers)    {        Arrays.sort(positionNumbers);        for (int i = positionNumbers.length - 1; i >= 0; i--)        {            if (positionNumbers[i] < 0 || positionNumbers[i] >= this.positions.size())                continue;            this.positions.remove(positionNumbers[i]);        }        this.markDirty();        this.firePropertyChange(TrackController.TRACK_MODIFY, null, this);    }    public void appendPosition(SARPosition position)    {        if (position == null)            return;        this.positions.add(position);        this.markDirty();        this.firePropertyChange(TrackController.TRACK_MODIFY, null, this);    }    public void insertPosition(int index, SARPosition position)    {        if (position == null || index < 0)            return;        this.positions.add(index, position);        this.markDirty();        this.firePropertyChange(TrackController.TRACK_MODIFY, null, this);    }    public void setPosition(int index, SARPosition position)    {        if (position == null || index < 0)            return;        this.positions.set(index, position);        this.markDirty();        this.firePropertyChange(TrackController.TRACK_MODIFY, null, index);    }    private static SARTrack readNMEA(String filePath) throws IOException    {        NmeaReader reader = new NmeaReader();        reader.readFile(filePath);        TrackPointIterator tpi = new TrackPointIteratorImpl(reader.getTracks());        return makeTrackFromTrackPointIterator(tpi);    }    private static SARTrack readGPX(String filePath) throws IOException    {        try        {            GpxReader reader = new GpxReader();            reader.readFile(filePath);            TrackPointIterator tpi = new TrackPointIteratorImpl(reader.getTracks());            return makeTrackFromTrackPointIterator(tpi);        }        catch (ParserConfigurationException e)        {            throw new IllegalArgumentException(e);        }        catch (SAXException e)        {            throw new IllegalArgumentException(e);        }    }    private static SARTrack readCSV(String filePath) throws IOException    {        CSVReader reader = new CSVReader();        reader.readFile(filePath);        TrackPointIterator tpi = new TrackPointIteratorImpl(reader.getTracks());        return makeTrackFromTrackPointIterator(tpi);    }    private static void writeNMEA(SARTrack track, String filePath) throws IOException    {        NmeaWriter writer = new NmeaWriter(filePath);        Track trk = makeTrackFromSARTrack(track);        writer.writeTrack(trk);        writer.close();    }    private static void writeGPX(SARTrack track, String filePath) throws IOException    {        try        {            GpxWriter writer = new GpxWriter(filePath);            Track trk = makeTrackFromSARTrack(track);            writer.writeTrack(trk);            writer.close();        }        catch (ParserConfigurationException e)        {            throw new IllegalArgumentException(e);        }        catch (javax.xml.transform.TransformerException e)        {            throw new IllegalArgumentException(e);        }    }    private static void writeCSV(SARTrack track, String filePath) throws IOException    {        CSVWriter writer = new CSVWriter(filePath);        Track trk = makeTrackFromSARTrack(track);        writer.writeTrack(trk);        writer.close();    }    private static SARTrack makeTrackFromTrackPointIterator(TrackPointIterator tpi) throws IOException    {        ArrayList<SARPosition> positions = new ArrayList<SARPosition>();        while (tpi.hasNext())        {            TrackPoint tp = tpi.next();            SARPosition sp = new SARPosition(                Angle.fromDegrees(tp.getLatitude()), Angle.fromDegrees(tp.getLongitude()), tp.getElevation());            positions.add(sp);        }        SARTrack st = new SARTrack();        st.positions = positions;        return st;    }    private static Track makeTrackFromSARTrack(SARTrack sarTrack)    {        return new TrackWrapper(sarTrack);    }    private static class TrackWrapper implements Track, TrackSegment    {        private final SARTrack sarTrack;        private final ArrayList<TrackSegment> segments = new ArrayList<TrackSegment>();        public TrackWrapper(SARTrack sarTrack)        {            this.sarTrack = sarTrack;            this.segments.add(this);        }        public java.util.List<TrackSegment> getSegments()        {            return this.segments;        }        public String getName()        {            return this.sarTrack.getName();        }        public int getNumPoints()        {            return this.sarTrack.size();        }        public java.util.List<TrackPoint> getPoints()        {            ArrayList<TrackPoint> trkPoints = new ArrayList<TrackPoint>();            for (SARPosition sarPos : this.sarTrack.positions)                trkPoints.add(sarPos != null ? new TrackPointWrapper(sarPos) : null);            return trkPoints;        }    }    private static class TrackPointWrapper implements TrackPoint    {        private final SARPosition sarPosition;        public TrackPointWrapper(SARPosition sarPosition)        {            this.sarPosition = sarPosition;        }        public double getLatitude()        {            return this.sarPosition.getLatitude().degrees;        }        public void setLatitude(double latitude)        {        }        public double getLongitude()        {            return this.sarPosition.getLongitude().degrees;        }        public void setLongitude(double longitude)        {        }        public double getElevation()        {            return this.sarPosition.getElevation();        }        public void setElevation(double elevation)        {        }        public String getTime()        {            return null;        }        public void setTime(String time)        {        }        public Position getPosition()        {            return this.sarPosition;        }        public void setPosition(Position position)        {        }    }    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener)    {        this.propChangeSupport.addPropertyChangeListener(propertyName, listener);    }    public void addPropertyChangeListener(PropertyChangeListener listener)    {        this.propChangeSupport.addPropertyChangeListener(listener);    }    public void removePropertyChangeListener(PropertyChangeListener listener)    {        this.propChangeSupport.removePropertyChangeListener(listener);    }    public void firePropertyChange(String propertyName, Object oldValue, Object newValue)    {        this.propChangeSupport.firePropertyChange(propertyName, oldValue, newValue);    }    @Override    public String toString()    {        return this.name;    }}

⌨️ 快捷键说明

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