Changeset 14010 in josm


Ignore:
Timestamp:
2018-07-07T14:09:37+02:00 (4 months ago)
Author:
Don-vip
Message:

fix #16471 - Support NMEA files when correlating images to a GPX track

Location:
trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/io/importexport/NMEAImporter.java

    r12846 r14010  
    2424import org.openstreetmap.josm.io.nmea.NmeaReader;
    2525import org.openstreetmap.josm.spi.preferences.Config;
     26import org.xml.sax.SAXException;
    2627
    2728/**
     
    4849        final String fn = file.getName();
    4950        try (InputStream fis = Compression.getUncompressedFileInputStream(file)) {
    50             final NmeaReader r = new NmeaReader(fis);
     51            final NmeaReader r = buildAndParse(fis);
    5152            if (r.getNumberOfCoordinates() > 0) {
    52                 r.data.storageFile = file;
    53                 final GpxLayer gpxLayer = new GpxLayer(r.data, fn, true);
     53                r.getGpxData().storageFile = file;
     54                final GpxLayer gpxLayer = new GpxLayer(r.getGpxData(), fn, true);
    5455                final File fileFinal = file;
    5556
     
    5758                    MainApplication.getLayerManager().addLayer(gpxLayer);
    5859                    if (Config.getPref().getBoolean("marker.makeautomarkers", true)) {
    59                         MarkerLayer ml = new MarkerLayer(r.data, tr("Markers from {0}", fn), fileFinal, gpxLayer);
     60                        MarkerLayer ml = new MarkerLayer(r.getGpxData(), tr("Markers from {0}", fn), fileFinal, gpxLayer);
    6061                        if (!ml.data.isEmpty()) {
    6162                            MainApplication.getLayerManager().addLayer(ml);
     
    103104    public static GpxImporterData loadLayers(InputStream is, final File associatedFile,
    104105            final String gpxLayerName, String markerLayerName) throws IOException {
    105         final NmeaReader r = new NmeaReader(is);
     106        final NmeaReader r = buildAndParse(is);
    106107        final boolean parsedProperly = r.getNumberOfCoordinates() > 0;
    107         r.data.storageFile = associatedFile;
    108         return GpxImporter.loadLayers(r.data, parsedProperly, gpxLayerName, markerLayerName);
     108        r.getGpxData().storageFile = associatedFile;
     109        return GpxImporter.loadLayers(r.getGpxData(), parsedProperly, gpxLayerName, markerLayerName);
     110    }
     111
     112    static NmeaReader buildAndParse(InputStream fis) throws IOException {
     113        final NmeaReader r = new NmeaReader(fis);
     114        try {
     115            r.parse(true);
     116        } catch (SAXException e) {
     117            throw new IOException(e);
     118        }
     119        return r;
    109120    }
    110121}
  • trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java

    r13220 r14010  
    2323import java.io.IOException;
    2424import java.io.InputStream;
    25 import java.nio.file.Files;
    2625import java.text.DateFormat;
    2726import java.text.ParseException;
    2827import java.text.SimpleDateFormat;
    2928import java.util.ArrayList;
     29import java.util.Arrays;
    3030import java.util.Collection;
    3131import java.util.Collections;
     
    3838import java.util.TimeZone;
    3939import java.util.concurrent.TimeUnit;
    40 import java.util.zip.GZIPInputStream;
    4140
    4241import javax.swing.AbstractAction;
     
    6059import javax.swing.event.DocumentEvent;
    6160import javax.swing.event.DocumentListener;
    62 import javax.swing.filechooser.FileFilter;
    6361
    6462import org.openstreetmap.josm.Main;
    6563import org.openstreetmap.josm.actions.DiskAccessAction;
     64import org.openstreetmap.josm.actions.ExtensionFileFilter;
    6665import org.openstreetmap.josm.data.gpx.GpxConstants;
    6766import org.openstreetmap.josm.data.gpx.GpxData;
     
    7271import org.openstreetmap.josm.gui.ExtendedDialog;
    7372import org.openstreetmap.josm.gui.MainApplication;
     73import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
    7474import org.openstreetmap.josm.gui.io.importexport.JpgImporter;
     75import org.openstreetmap.josm.gui.io.importexport.NMEAImporter;
    7576import org.openstreetmap.josm.gui.layer.GpxLayer;
    7677import org.openstreetmap.josm.gui.layer.Layer;
    7778import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
     79import org.openstreetmap.josm.gui.widgets.FileChooserManager;
    7880import org.openstreetmap.josm.gui.widgets.JosmComboBox;
    7981import org.openstreetmap.josm.gui.widgets.JosmTextField;
     82import org.openstreetmap.josm.io.Compression;
    8083import org.openstreetmap.josm.io.GpxReader;
     84import org.openstreetmap.josm.io.IGpxReader;
     85import org.openstreetmap.josm.io.nmea.NmeaReader;
    8186import org.openstreetmap.josm.spi.preferences.Config;
    8287import org.openstreetmap.josm.tools.GBC;
     
    8590import org.openstreetmap.josm.tools.Logging;
    8691import org.openstreetmap.josm.tools.Pair;
    87 import org.openstreetmap.josm.tools.Utils;
    8892import org.openstreetmap.josm.tools.date.DateUtils;
    8993import org.xml.sax.SAXException;
     
    251255
    252256        @Override
    253         public void actionPerformed(ActionEvent arg0) {
    254             FileFilter filter = new FileFilter() {
    255                 @Override
    256                 public boolean accept(File f) {
    257                     return f.isDirectory() || Utils.hasExtension(f, "gpx", "gpx.gz");
    258                 }
    259 
    260                 @Override
    261                 public String getDescription() {
    262                     return tr("GPX Files (*.gpx *.gpx.gz)");
    263                 }
    264             };
    265             AbstractFileChooser fc = DiskAccessAction.createAndOpenFileChooser(true, false, null, filter, JFileChooser.FILES_ONLY, null);
     257        public void actionPerformed(ActionEvent e) {
     258            ExtensionFileFilter gpxFilter = GpxImporter.getFileFilter();
     259            AbstractFileChooser fc = new FileChooserManager(true, null).createFileChooser(false, null,
     260                    Arrays.asList(gpxFilter, NMEAImporter.FILE_FILTER), gpxFilter, JFileChooser.FILES_ONLY).openFileChooser();
    266261            if (fc == null)
    267262                return;
     
    287282                }
    288283                GpxData data = null;
    289                 try (InputStream iStream = createInputStream(sel)) {
    290                     GpxReader reader = new GpxReader(iStream);
     284                try (InputStream iStream = Compression.getUncompressedFileInputStream(sel)) {
     285                    IGpxReader reader = gpxFilter.accept(sel) ? new GpxReader(iStream) : new NmeaReader(iStream);
    291286                    reader.parse(false);
    292287                    data = reader.getGpxData();
     
    327322            }
    328323        }
    329 
    330         private InputStream createInputStream(File sel) throws IOException {
    331             if (Utils.hasExtension(sel, "gpx.gz")) {
    332                 return new GZIPInputStream(Files.newInputStream(sel.toPath()));
    333             } else {
    334                 return Files.newInputStream(sel.toPath());
    335             }
    336         }
    337324    }
    338325
  • trunk/src/org/openstreetmap/josm/io/GpxReader.java

    r13901 r14010  
    4242 * @author imi, ramack
    4343 */
    44 public class GpxReader implements GpxConstants {
     44public class GpxReader implements GpxConstants, IGpxReader {
    4545
    4646    private enum State {
     
    579579     * @throws IOException if any I/O error occurs
    580580     */
     581    @Override
    581582    public boolean parse(boolean tryToFinish) throws SAXException, IOException {
    582583        Parser parser = new Parser();
     
    604605    }
    605606
    606     /**
    607      * Replies the GPX data.
    608      * @return The GPX data
    609      */
     607    @Override
    610608    public GpxData getGpxData() {
    611609        return gpxData;
  • trunk/src/org/openstreetmap/josm/io/nmea/NmeaReader.java

    r12620 r14010  
    1414import java.util.Date;
    1515import java.util.Locale;
     16import java.util.Objects;
    1617import java.util.Optional;
    1718
     
    2122import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack;
    2223import org.openstreetmap.josm.data.gpx.WayPoint;
     24import org.openstreetmap.josm.io.IGpxReader;
    2325import org.openstreetmap.josm.io.IllegalDataException;
    2426import org.openstreetmap.josm.tools.Logging;
    2527import org.openstreetmap.josm.tools.date.DateUtils;
     28import org.xml.sax.SAXException;
    2629
    2730/**
     
    4043 * @author cbrill
    4144 */
    42 public class NmeaReader {
     45public class NmeaReader implements IGpxReader {
    4346
    4447    enum VTG {
     
    129132    }
    130133
    131     public GpxData data;
     134    private final InputStream source;
     135    GpxData data;
    132136
    133137    private final SimpleDateFormat rmcTimeFmt = new SimpleDateFormat("ddMMyyHHmmss.SSS", Locale.ENGLISH);
     
    171175     */
    172176    public NmeaReader(InputStream source) throws IOException {
     177        this.source = Objects.requireNonNull(source);
    173178        rmcTimeFmt.setTimeZone(DateUtils.UTC);
    174179        rmcTimeFmtStd.setTimeZone(DateUtils.UTC);
    175 
     180    }
     181
     182    @Override
     183    public boolean parse(boolean tryToFinish) throws SAXException, IOException {
    176184        // create the data tree
    177185        data = new GpxData();
     
    184192            if (loopstartChar == -1)
    185193                //TODO tell user about the problem?
    186                 return;
     194                return false;
    187195            sb.append((char) loopstartChar);
    188196            ps.pDate = "010100"; // TODO date problem
     
    210218        } catch (IllegalDataException e) {
    211219            Logging.warn(e);
    212         }
     220            return false;
     221        }
     222        return true;
    213223    }
    214224
     
    529539        return new LatLon(lat, lon);
    530540    }
     541
     542    @Override
     543    public GpxData getGpxData() {
     544        return data;
     545    }
    531546}
  • trunk/test/unit/org/openstreetmap/josm/io/nmea/NmeaReaderTest.java

    r12422 r14010  
    4848        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
    4949        final NmeaReader in = new NmeaReader(new FileInputStream("data_nodist/btnmeatrack_2016-01-25.nmea"));
     50        in.parse(true);
    5051        assertEquals(30, in.getNumberOfCoordinates());
    5152        assertEquals(0, in.getParserMalformed());
     
    7475        GpxData gpx = GpxReaderTest.parseGpxData(TestUtils.getRegressionDataFile(ticket, filename+".gpx"));
    7576        NmeaReader in = new NmeaReader(new FileInputStream(TestUtils.getRegressionDataFile(ticket, filename+".nmea")));
     77        in.parse(true);
    7678        assertEquals(numCoor, in.getNumberOfCoordinates());
    7779        assertEquals(0, in.getParserMalformed());
Note: See TracChangeset for help on using the changeset viewer.