source: josm/trunk/src/org/openstreetmap/josm/gui/io/importexport/NMEAImporter.java @ 14010

Last change on this file since 14010 was 14010, checked in by Don-vip, 5 months ago

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

  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.io.importexport;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.io.File;
7import java.io.IOException;
8import java.io.InputStream;
9
10import javax.swing.JOptionPane;
11import javax.swing.SwingUtilities;
12
13import org.openstreetmap.josm.Main;
14import org.openstreetmap.josm.actions.ExtensionFileFilter;
15import org.openstreetmap.josm.gui.HelpAwareOptionPane;
16import org.openstreetmap.josm.gui.MainApplication;
17import org.openstreetmap.josm.gui.Notification;
18import org.openstreetmap.josm.gui.io.importexport.GpxImporter.GpxImporterData;
19import org.openstreetmap.josm.gui.layer.GpxLayer;
20import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
21import org.openstreetmap.josm.gui.progress.ProgressMonitor;
22import org.openstreetmap.josm.gui.util.GuiHelper;
23import org.openstreetmap.josm.io.Compression;
24import org.openstreetmap.josm.io.nmea.NmeaReader;
25import org.openstreetmap.josm.spi.preferences.Config;
26import org.xml.sax.SAXException;
27
28/**
29 * File importer allowing to import NMEA-0183 files (*.nmea/nme/nma/log/txt files).
30 * @since 1637
31 */
32public class NMEAImporter extends FileImporter {
33
34    /**
35     * The NMEA file filter (*.nmea *.nme *.nma *.log *.txt files).
36     */
37    public static final ExtensionFileFilter FILE_FILTER = ExtensionFileFilter.newFilterWithArchiveExtensions(
38            "nmea,nme,nma,log,txt", "nmea", tr("NMEA-0183 Files"), false);
39
40    /**
41     * Constructs a new {@code NMEAImporter}.
42     */
43    public NMEAImporter() {
44        super(FILE_FILTER);
45    }
46
47    @Override
48    public void importData(File file, ProgressMonitor progressMonitor) throws IOException {
49        final String fn = file.getName();
50        try (InputStream fis = Compression.getUncompressedFileInputStream(file)) {
51            final NmeaReader r = buildAndParse(fis);
52            if (r.getNumberOfCoordinates() > 0) {
53                r.getGpxData().storageFile = file;
54                final GpxLayer gpxLayer = new GpxLayer(r.getGpxData(), fn, true);
55                final File fileFinal = file;
56
57                GuiHelper.runInEDT(() -> {
58                    MainApplication.getLayerManager().addLayer(gpxLayer);
59                    if (Config.getPref().getBoolean("marker.makeautomarkers", true)) {
60                        MarkerLayer ml = new MarkerLayer(r.getGpxData(), tr("Markers from {0}", fn), fileFinal, gpxLayer);
61                        if (!ml.data.isEmpty()) {
62                            MainApplication.getLayerManager().addLayer(ml);
63                        }
64                    }
65                });
66            }
67            showNmeaInfobox(r.getNumberOfCoordinates() > 0, r);
68        }
69    }
70
71    private static void showNmeaInfobox(boolean success, NmeaReader r) {
72        final StringBuilder msg = new StringBuilder(160).append("<html>")
73           .append(tr("Coordinates imported: {0}", r.getNumberOfCoordinates())).append("<br>")
74           .append(tr("Malformed sentences: {0}", r.getParserMalformed())).append("<br>")
75           .append(tr("Checksum errors: {0}", r.getParserChecksumErrors())).append("<br>");
76        if (!success) {
77            msg.append(tr("Unknown sentences: {0}", r.getParserUnknown())).append("<br>");
78        }
79        msg.append(tr("Zero coordinates: {0}", r.getParserZeroCoordinates()))
80           .append("</html>");
81        if (success) {
82            SwingUtilities.invokeLater(() -> new Notification(
83                    "<h3>" + tr("NMEA import success:") + "</h3>" + msg.toString())
84                    .setIcon(JOptionPane.INFORMATION_MESSAGE)
85                    .show());
86        } else {
87            HelpAwareOptionPane.showMessageDialogInEDT(
88                    Main.parent,
89                    msg.toString(),
90                    tr("NMEA import failure!"),
91                    JOptionPane.ERROR_MESSAGE, null);
92        }
93    }
94
95    /**
96     * Replies the new GPX and marker layers corresponding to the specified NMEA file.
97     * @param is input stream to NMEA 0183 data
98     * @param associatedFile NMEA file
99     * @param gpxLayerName The GPX layer name
100     * @param markerLayerName The marker layer name
101     * @return the new GPX and marker layers corresponding to the specified NMEA file
102     * @throws IOException if an I/O error occurs
103     */
104    public static GpxImporterData loadLayers(InputStream is, final File associatedFile,
105            final String gpxLayerName, String markerLayerName) throws IOException {
106        final NmeaReader r = buildAndParse(is);
107        final boolean parsedProperly = r.getNumberOfCoordinates() > 0;
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;
120    }
121}
Note: See TracBrowser for help on using the repository browser.