Ticket #8647: Fit.java

File Fit.java, 3.3 KB (added by simon04, 12 years ago)
Line 
1package org.openstreetmap.josm.plugins.dataimport.io;
2
3import static org.openstreetmap.josm.tools.I18n.tr;
4
5import com.garmin.fit.*;
6import java.io.BufferedInputStream;
7import java.io.File;
8import java.io.FileInputStream;
9import java.io.IOException;
10import java.io.InputStream;
11import java.util.ArrayList;
12import java.util.Collection;
13import java.util.Collections;
14import org.openstreetmap.josm.Main;
15import org.openstreetmap.josm.actions.ExtensionFileFilter;
16import org.openstreetmap.josm.data.coor.LatLon;
17import org.openstreetmap.josm.data.gpx.GpxData;
18import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack;
19import org.openstreetmap.josm.data.gpx.WayPoint;
20import org.openstreetmap.josm.gui.layer.GpxLayer;
21import org.openstreetmap.josm.gui.progress.ProgressMonitor;
22import org.openstreetmap.josm.io.FileImporter;
23import org.openstreetmap.josm.io.IllegalDataException;
24import org.openstreetmap.josm.tools.Utils;
25
26public class Fit extends FileImporter {
27
28 public Fit() {
29 super(new ExtensionFileFilter("fit", "fit",
30 tr("Flexible and Interoperable Data Transfer Files (*.fit)")));
31 }
32
33 public static GpxData toGpxData(InputStream fit) {
34 final Collection<WayPoint> track = new ArrayList<WayPoint>();
35
36 final Decode decode = new Decode();
37 decode.addListener(new MesgListener() {
38
39 private Number semicircleToDegree(Field field) {
40 if (field != null && "semicircles".equals(field.getUnits())) {
41 final long semicircle = field.getLongValue();
42 return semicircle / Double.valueOf(1L << 31) * 180;
43 } else {
44 return null;
45 }
46 }
47
48 @Override
49 public void onMesg(Mesg mesg) {
50
51 Main.debug(Utils.transform(mesg.getFields(), new Utils.Function<Field, String>() {
52
53 @Override
54 public String apply(Field x) {
55 return x.getName() + "=" + x.getStringValue();
56 }
57
58 }).toString());
59
60 final Number lat = semicircleToDegree(mesg.getField("position_lat"));
61 final Number lon = semicircleToDegree(mesg.getField("position_long"));
62
63 if (lat != null && lon != null) {
64 final WayPoint wp = new WayPoint(new LatLon(lat.doubleValue(), lon.doubleValue()));
65 wp.attr.put("time", mesg.getFieldStringValue("timestamp"));
66 wp.attr.put("ele", mesg.getFieldStringValue("altitude"));
67 wp.attr.put("speed", mesg.getFieldStringValue("speed"));
68 wp.setTime();
69 track.add(wp);
70 }
71
72 }
73 });
74 decode.read(fit);
75
76 final GpxData data = new GpxData();
77 data.tracks.add(new ImmutableGpxTrack(
78 Collections.singleton(track),
79 Collections.<String, Object>emptyMap()
80 ));
81
82 return data;
83 }
84
85 @Override
86 public void importData(File file, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
87 final GpxData gpxData = toGpxData(new BufferedInputStream(new FileInputStream(file)));
88 gpxData.storageFile = file;
89 GpxLayer gpxLayer = new GpxLayer(gpxData, file.getName());
90 Main.main.addLayer(gpxLayer);
91 }
92
93}