Changeset 7518 in josm for trunk


Ignore:
Timestamp:
2014-09-10T02:29:55+02:00 (10 years ago)
Author:
Don-vip
Message:

fix #10489 - Add additional attributes to GPX Export for nodes + GPX code improvements

Location:
trunk/src/org/openstreetmap/josm
Files:
23 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/gpx/GpxConstants.java

    r6897 r7518  
    33
    44import java.util.Arrays;
     5import java.util.Collection;
    56import java.util.List;
    67
     
    1112 */
    1213public interface GpxConstants {
     14
     15    /** GPS name of the element. This field will be transferred to and from the GPS.
     16     *  GPX does not place restrictions on the length of this field or the characters contained in it.
     17     *  It is up to the receiving application to validate the field before sending it to the GPS. */
     18    public static final String GPX_NAME = "name";
     19
     20    /** GPS element comment. Sent to GPS as comment. */
     21    public static final String GPX_CMT = "cmt";
     22
     23    /** Text description of the element. Holds additional information about the element intended for the user, not the GPS. */
     24    public static final String GPX_DESC = "desc";
     25
     26    /** Source of data. Included to give user some idea of reliability and accuracy of data. */
     27    public static final String GPX_SRC = "src";
    1328
    1429    public static final String META_PREFIX = "meta.";
     
    2843    public static final String JOSM_EXTENSIONS_NAMESPACE_URI = Main.getXMLBase() + "/gpx-extensions-1.0";
    2944
    30     public static List<String> WPT_KEYS = Arrays.asList("ele", "time", "magvar", "geoidheight",
    31             "name", "cmt", "desc", "src", META_LINKS, "sym", "number", "type",
    32             "fix", "sat", "hdop", "vdop", "pdop", "ageofdgpsdata", "dgpsid", META_EXTENSIONS);
     45    /** Elevation (in meters) of the point. */
     46    public static final String PT_ELE = "ele";
    3347
     48    /** Creation/modification timestamp for the point.
     49     *  Date and time in are in Univeral Coordinated Time (UTC), not local time!
     50     *  Conforms to ISO 8601 specification for date/time representation.
     51     *  Fractional seconds are allowed for millisecond timing in tracklogs. */
     52    public static final String PT_TIME = "time";
     53
     54    /** Magnetic variation (in degrees) at the point. 0.0 <= value < 360.0 */
     55    public static final String PT_MAGVAR = "magvar";
     56
     57    /** Height, in meters, of geoid (mean sea level) above WGS-84 earth ellipsoid. (NMEA GGA message) */
     58    public static final String PT_GEOIDHEIGHT = "geoidheight";
     59
     60    /** Text of GPS symbol name. For interchange with other programs, use the exact spelling of the symbol on the GPS, if known. */
     61    public static final String PT_SYM = "sym";
     62
     63    /** Type (textual classification) of element. */
     64    public static final String PT_TYPE = "type";
     65
     66    /** Type of GPS fix. none means GPS had no fix. Value comes from list: {'none'|'2d'|'3d'|'dgps'|'pps'} */
     67    public static final String PT_FIX = "fix";
     68
     69    /** Number of satellites used to calculate the GPS fix. (not number of satellites in view). */
     70    public static final String PT_SAT = "sat";
     71
     72    /** Horizontal dilution of precision. */
     73    public static final String PT_HDOP = "hdop";
     74
     75    /** Vertical dilution of precision. */
     76    public static final String PT_VDOP = "vdop";
     77
     78    /** Position dilution of precision. */
     79    public static final String PT_PDOP = "pdop";
     80
     81    /** Number of seconds since last DGPS update. */
     82    public static final String PT_AGEOFDGPSDATA = "ageofdgpsdata";
     83
     84    /** Represents a differential GPS station. 0 <= value <= 1023 */
     85    public static final String PT_DGPSID = "dgpsid";
     86
     87    /**
     88     * Ordered list of all possible waypoint keys.
     89     */
     90    public static List<String> WPT_KEYS = Arrays.asList(PT_ELE, PT_TIME, PT_MAGVAR, PT_GEOIDHEIGHT,
     91            GPX_NAME, GPX_CMT, GPX_DESC, GPX_SRC, META_LINKS, PT_SYM, PT_TYPE,
     92            PT_FIX, PT_SAT, PT_HDOP, PT_VDOP, PT_PDOP, PT_AGEOFDGPSDATA, PT_DGPSID, META_EXTENSIONS);
     93
     94    /**
     95     * Ordered list of all possible route and track keys.
     96     */
     97    public static List<String> RTE_TRK_KEYS = Arrays.asList(
     98            GPX_NAME, GPX_CMT, GPX_DESC, GPX_SRC, META_LINKS, "number", PT_TYPE, META_EXTENSIONS);
     99
     100    /**
     101     * Possible fix values.
     102     */
     103    public static Collection<String> FIX_VALUES = Arrays.asList("none","2d","3d","dgps","pps");
    34104}
  • trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java

    r7509 r7518  
    4141            String k = ent.getKey();
    4242            if (k.equals(META_LINKS) && attr.containsKey(META_LINKS)) {
    43                 @SuppressWarnings("unchecked")
    44                 Collection<GpxLink> my = (Collection<GpxLink>) attr.get(META_LINKS);
     43                Collection<GpxLink> my = super.<GpxLink>getCollection(META_LINKS);
    4544                @SuppressWarnings("unchecked")
    4645                Collection<GpxLink> their = (Collection<GpxLink>) ent.getValue();
    4746                my.addAll(their);
    4847            } else {
    49                 attr.put(k, ent.getValue());
     48                put(k, ent.getValue());
    5049            }
    5150        }
  • trunk/src/org/openstreetmap/josm/data/gpx/GpxLink.java

    r6380 r7518  
    22package org.openstreetmap.josm.data.gpx;
    33
     4/**
     5 * A link to an external resource (Web page, digital photo, video clip, etc) with additional information.
     6 * @since 444
     7 */
    48public class GpxLink {
     9
     10    /** External resource URI */
    511    public String uri;
     12
     13    /** Text to display on the hyperlink */
    614    public String text;
     15
     16    /** Link type */
    717    public String type;
    818
     19    /**
     20     * Constructs a new {@code GpxLink}.
     21     * @param uri External resource URI
     22     */
    923    public GpxLink(String uri) {
    1024        this.uri = uri;
  • trunk/src/org/openstreetmap/josm/data/gpx/IWithAttributes.java

    r6142 r7518  
    3737     * @since 5502
    3838     */
    39     Collection<?> getCollection(String key);
     39    <T> Collection<T> getCollection(String key);
    4040
    4141    /**
  • trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java

    r7319 r7518  
    9595    @Override
    9696    public String toString() {
    97         return "WayPoint (" + (attr.containsKey("name") ? attr.get("name") + ", " :"") + getCoor().toString() + ", " + attr + ")";
     97        return "WayPoint (" + (attr.containsKey(GPX_NAME) ? get(GPX_NAME) + ", " :"") + getCoor().toString() + ", " + attr + ")";
    9898    }
    9999
     
    102102     */
    103103    public void setTime() {
    104         if(attr.containsKey("time")) {
     104        if (attr.containsKey(PT_TIME)) {
    105105            try {
    106                 time = dateParser.get().parse(attr.get("time").toString()).getTime() / 1000.; /* ms => seconds */
     106                time = dateParser.get().parse(get(PT_TIME).toString()).getTime() / 1000.; /* ms => seconds */
    107107            } catch(Exception e) {
    108108                time = 0;
     
    123123    public Object getTemplateValue(String name, boolean special) {
    124124        if (!special)
    125             return attr.get(name);
     125            return get(name);
    126126        else
    127127            return null;
  • trunk/src/org/openstreetmap/josm/data/gpx/WithAttributes.java

    r7005 r7518  
    5656     * @since 5502
    5757     */
     58    @SuppressWarnings("unchecked")
    5859    @Override
    59     public Collection<?> getCollection(String key) {
     60    public <T> Collection<T> getCollection(String key) {
    6061        Object value = attr.get(key);
    61         return (value instanceof Collection) ? (Collection<?>)value : null;
     62        return (value instanceof Collection) ? (Collection<T>)value : null;
    6263    }
    6364
  • trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java

    r7402 r7518  
    6464
    6565    public GpxLayer(GpxData d) {
    66         super((String) d.attr.get("name"));
     66        super(d.getString(GpxConstants.META_NAME));
    6767        data = d;
    6868        drawHelper = new GpxDrawHelper(data);
     
    124124
    125125        if (data.attr.containsKey("name")) {
    126             info.append(tr("Name: {0}", data.attr.get(GpxConstants.META_NAME))).append("<br>");
     126            info.append(tr("Name: {0}", data.get(GpxConstants.META_NAME))).append("<br>");
    127127        }
    128128
    129129        if (data.attr.containsKey("desc")) {
    130             info.append(tr("Description: {0}", data.attr.get(GpxConstants.META_DESC))).append("<br>");
     130            info.append(tr("Description: {0}", data.get(GpxConstants.META_DESC))).append("<br>");
    131131        }
    132132
     
    141141            for (GpxTrack trk : data.tracks) {
    142142                info.append("<tr><td>");
    143                 if (trk.getAttributes().containsKey("name")) {
    144                     info.append(trk.getAttributes().get("name"));
     143                if (trk.getAttributes().containsKey(GpxConstants.GPX_NAME)) {
     144                    info.append(trk.get(GpxConstants.GPX_NAME));
    145145                }
    146146                info.append("</td><td>");
    147                 if (trk.getAttributes().containsKey("desc")) {
    148                     info.append(" ").append(trk.getAttributes().get("desc"));
     147                if (trk.getAttributes().containsKey(GpxConstants.GPX_DESC)) {
     148                    info.append(" ").append(trk.get(GpxConstants.GPX_DESC));
    149149                }
    150150                info.append("</td><td>");
     
    154154                info.append("</td><td>");
    155155                if (trk.getAttributes().containsKey("url")) {
    156                     info.append(trk.getAttributes().get("url"));
     156                    info.append(trk.get("url"));
    157157                }
    158158                info.append("</td></tr>");
     
    215215        StringBuilder info = new StringBuilder().append("<html>");
    216216
    217         if (data.attr.containsKey("name")) {
    218             info.append(tr("Name: {0}", data.attr.get(GpxConstants.META_NAME))).append("<br>");
    219         }
    220 
    221         if (data.attr.containsKey("desc")) {
    222             info.append(tr("Description: {0}", data.attr.get(GpxConstants.META_DESC))).append("<br>");
     217        if (data.attr.containsKey(GpxConstants.META_NAME)) {
     218            info.append(tr("Name: {0}", data.get(GpxConstants.META_NAME))).append("<br>");
     219        }
     220
     221        if (data.attr.containsKey(GpxConstants.META_DESC)) {
     222            info.append(tr("Description: {0}", data.get(GpxConstants.META_DESC))).append("<br>");
    223223        }
    224224
  • trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java

    r7414 r7518  
    5151import org.openstreetmap.josm.data.conflict.ConflictCollection;
    5252import org.openstreetmap.josm.data.coor.LatLon;
     53import org.openstreetmap.josm.data.gpx.GpxConstants;
    5354import org.openstreetmap.josm.data.gpx.GpxData;
     55import org.openstreetmap.josm.data.gpx.GpxLink;
    5456import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack;
    5557import org.openstreetmap.josm.data.gpx.WayPoint;
     
    581583                WayPoint wpt = new WayPoint(n.getCoor());
    582584                if (!n.isTimestampEmpty()) {
    583                     wpt.attr.put("time", DateUtils.fromDate(n.getTimestamp()));
     585                    wpt.put("time", DateUtils.fromDate(n.getTimestamp()));
    584586                    wpt.setTime();
    585587                }
     
    600602            }
    601603            WayPoint wpt = new WayPoint(n.getCoor());
    602             String name = n.get("name");
    603             if (name != null) {
    604                 wpt.attr.put("name", name);
    605             }
     604
     605            // Position info
     606
     607            addDoubleIfPresent(wpt, n, GpxConstants.PT_ELE);
     608
    606609            if (!n.isTimestampEmpty()) {
    607                 wpt.attr.put("time", DateUtils.fromDate(n.getTimestamp()));
     610                wpt.put("time", DateUtils.fromDate(n.getTimestamp()));
    608611                wpt.setTime();
    609612            }
    610             String desc = n.get("description");
    611             if (desc != null) {
    612                 wpt.attr.put("desc", desc);
    613             }
     613
     614            addDoubleIfPresent(wpt, n, GpxConstants.PT_MAGVAR);
     615            addDoubleIfPresent(wpt, n, GpxConstants.PT_GEOIDHEIGHT);
     616
     617            // Description info
     618
     619            addStringIfPresent(wpt, n, GpxConstants.GPX_NAME);
     620            addStringIfPresent(wpt, n, GpxConstants.GPX_DESC, "description");
     621            addStringIfPresent(wpt, n, GpxConstants.GPX_CMT, "comment");
     622            addStringIfPresent(wpt, n, GpxConstants.GPX_SRC, "source", "source:position");
     623
     624            Collection<GpxLink> links = new ArrayList<>();
     625            for (String key : new String[]{"link", "url", "website", "contact:website"}) {
     626                String value = n.get(key);
     627                if (value != null) {
     628                    links.add(new GpxLink(value));
     629                }
     630            }
     631            wpt.put(GpxConstants.META_LINKS, links);
     632
     633            addStringIfPresent(wpt, n, GpxConstants.PT_SYM, "wpt_symbol");
     634            addStringIfPresent(wpt, n, GpxConstants.PT_TYPE);
     635
     636            // Accuracy info
     637            addStringIfPresent(wpt, n, GpxConstants.PT_FIX, "gps:fix");
     638            addIntegerIfPresent(wpt, n, GpxConstants.PT_SAT, "gps:sat");
     639            addDoubleIfPresent(wpt, n, GpxConstants.PT_HDOP, "gps:hdop");
     640            addDoubleIfPresent(wpt, n, GpxConstants.PT_VDOP, "gps:vdop");
     641            addDoubleIfPresent(wpt, n, GpxConstants.PT_PDOP, "gps:pdop");
     642            addDoubleIfPresent(wpt, n, GpxConstants.PT_AGEOFDGPSDATA, "gps:ageofdgpsdata");
     643            addIntegerIfPresent(wpt, n, GpxConstants.PT_DGPSID, "gps:dgpsid");
    614644
    615645            gpxData.waypoints.add(wpt);
     646        }
     647    }
     648
     649    private static void addIntegerIfPresent(WayPoint wpt, OsmPrimitive p, String gpxKey, String ... osmKeys) {
     650        ArrayList<String> possibleKeys = new ArrayList<>(Arrays.asList(osmKeys));
     651        possibleKeys.add(0, gpxKey);
     652        for (String key : possibleKeys) {
     653            String value = p.get(key);
     654            if (value != null) {
     655                try {
     656                    int i = Integer.parseInt(value);
     657                    // Sanity checks
     658                    if ((!GpxConstants.PT_SAT.equals(gpxKey) || i >= 0) &&
     659                        (!GpxConstants.PT_DGPSID.equals(gpxKey) || (0 <= i && i <= 1023))) {
     660                        wpt.put(gpxKey, value);
     661                        break;
     662                    }
     663                } catch (NumberFormatException e) {
     664                    if (Main.isTraceEnabled()) {
     665                        Main.trace(e.getMessage());
     666                    }
     667                }
     668            }
     669        }
     670    }
     671
     672    private static void addDoubleIfPresent(WayPoint wpt, OsmPrimitive p, String gpxKey, String ... osmKeys) {
     673        ArrayList<String> possibleKeys = new ArrayList<>(Arrays.asList(osmKeys));
     674        possibleKeys.add(0, gpxKey);
     675        for (String key : possibleKeys) {
     676            String value = p.get(key);
     677            if (value != null) {
     678                try {
     679                    double d = Double.parseDouble(value);
     680                    // Sanity checks
     681                    if (!GpxConstants.PT_MAGVAR.equals(gpxKey) || (0.0 <= d && d < 360.0)) {
     682                        wpt.put(gpxKey, value);
     683                        break;
     684                    }
     685                } catch (NumberFormatException e) {
     686                    if (Main.isTraceEnabled()) {
     687                        Main.trace(e.getMessage());
     688                    }
     689                }
     690            }
     691        }
     692    }
     693
     694    private static void addStringIfPresent(WayPoint wpt, OsmPrimitive p, String gpxKey, String ... osmKeys) {
     695        ArrayList<String> possibleKeys = new ArrayList<>(Arrays.asList(osmKeys));
     696        possibleKeys.add(0, gpxKey);
     697        for (String key : possibleKeys) {
     698            String value = p.get(key);
     699            if (value != null) {
     700                // Sanity checks
     701                if (!GpxConstants.PT_FIX.equals(gpxKey) || GpxConstants.FIX_VALUES.contains(value)) {
     702                    wpt.put(gpxKey, value);
     703                    break;
     704                }
     705            }
    616706        }
    617707    }
  • trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java

    r7320 r7518  
    6363import org.openstreetmap.josm.Main;
    6464import org.openstreetmap.josm.actions.DiskAccessAction;
     65import org.openstreetmap.josm.data.gpx.GpxConstants;
    6566import org.openstreetmap.josm.data.gpx.GpxData;
    6667import org.openstreetmap.josm.data.gpx.GpxTrack;
     
    10121013                for (GpxTrackSegment segment : trk.getSegments()) {
    10131014                    for (WayPoint curWp : segment.getWayPoints()) {
    1014                         String curDateWpStr = (String) curWp.attr.get("time");
     1015                        String curDateWpStr = curWp.getString(GpxConstants.PT_TIME);
    10151016                        if (curDateWpStr == null) {
    10161017                            continue;
     
    11361137                for (WayPoint curWp : segment.getWayPoints()) {
    11371138
    1138                     String curWpTimeStr = (String) curWp.attr.get("time");
     1139                    String curWpTimeStr = curWp.getString(GpxConstants.PT_TIME);
    11391140                    if (curWpTimeStr != null) {
    11401141
     
    11631164
    11641165    private static Double getElevation(WayPoint wp) {
    1165         String value = (String) wp.attr.get("ele");
     1166        String value = wp.getString(GpxConstants.PT_ELE);
    11661167        if (value != null) {
    11671168            try {
  • trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java

    r7005 r7518  
    3232
    3333import org.openstreetmap.josm.Main;
     34import org.openstreetmap.josm.data.gpx.GpxConstants;
    3435import org.openstreetmap.josm.data.gpx.GpxTrack;
    3536import org.openstreetmap.josm.gui.ExtendedDialog;
     
    111112        for (GpxTrack trk : layer.data.tracks) {
    112113            Map<String, Object> attr = trk.getAttributes();
    113             String name = (String) (attr.containsKey("name") ? attr.get("name") : "");
    114             String desc = (String) (attr.containsKey("desc") ? attr.get("desc") : "");
     114            String name = (String) (attr.containsKey(GpxConstants.GPX_NAME) ? attr.get(GpxConstants.GPX_NAME) : "");
     115            String desc = (String) (attr.containsKey(GpxConstants.GPX_DESC) ? attr.get(GpxConstants.GPX_DESC) : "");
    115116            String time = GpxLayer.getTimespanForTrack(trk);
    116117            TrackLength length = new TrackLength(trk.length());
  • trunk/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java

    r7299 r7518  
    1616
    1717import org.openstreetmap.josm.Main;
     18import org.openstreetmap.josm.data.gpx.GpxConstants;
    1819import org.openstreetmap.josm.data.gpx.GpxTrack;
    1920import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
     
    5354                for (WayPoint p : segment.getWayPoints()) {
    5455                    Node n = new Node(p.getCoor());
    55                     String timestr = p.getString("time");
     56                    String timestr = p.getString(GpxConstants.PT_TIME);
    5657                    if (timestr != null) {
    5758                        n.setTimestamp(DateUtils.fromString(timestr));
     
    6869        Main.main.removeLayer(layer);
    6970    }
    70 
    7171}
  • trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java

    r7402 r7518  
    1717import org.openstreetmap.josm.Main;
    1818import org.openstreetmap.josm.data.coor.LatLon;
     19import org.openstreetmap.josm.data.gpx.GpxConstants;
    1920import org.openstreetmap.josm.data.gpx.GpxData;
    2021import org.openstreetmap.josm.data.gpx.WayPoint;
     
    253254                for (Collection<WayPoint> segment : data.getLinesIterable(null)) {
    254255                    for (WayPoint trkPnt : segment) {
    255                         Object val = trkPnt.attr.get("hdop");
     256                        Object val = trkPnt.get(GpxConstants.PT_HDOP);
    256257                        if (val != null) {
    257258                            double hdop = ((Float) val).doubleValue();
     
    304305
    305306                if (colored == ColorMode.HDOP) {
    306                     Float hdop = (Float) trkPnt.attr.get("hdop");
     307                    Float hdop = (Float) trkPnt.get(GpxConstants.PT_HDOP);
    307308                    color = hdopScale.getColor(hdop);
    308309                }
     
    446447
    447448
    448                 if (hdopCircle && trkPnt.attr.get("hdop") != null) {
     449                if (hdopCircle && trkPnt.get(GpxConstants.PT_HDOP) != null) {
    449450                    // hdop value
    450                     float hdop = (Float)trkPnt.attr.get("hdop");
     451                    float hdop = (Float)trkPnt.get(GpxConstants.PT_HDOP);
    451452                    if (hdop < 0) {
    452453                        hdop = 0;
  • trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java

    r7509 r7518  
    2121import org.openstreetmap.josm.Main;
    2222import org.openstreetmap.josm.actions.DiskAccessAction;
     23import org.openstreetmap.josm.data.gpx.GpxConstants;
    2324import org.openstreetmap.josm.data.gpx.GpxData;
    2425import org.openstreetmap.josm.data.gpx.GpxTrack;
     
    184185                    WayPoint wc = new WayPoint(w.getCoor());
    185186                    wc.time = wNear.time;
    186                     if (w.attr.containsKey("name")) {
    187                         wc.attr.put("name", w.getString("name"));
     187                    if (w.attr.containsKey(GpxConstants.GPX_NAME)) {
     188                        wc.put(GpxConstants.GPX_NAME, w.getString(GpxConstants.GPX_NAME));
    188189                    }
    189190                    waypoints.add(wc);
     
    200201                for (GpxTrackSegment seg : track.getSegments()) {
    201202                    for (WayPoint w : seg.getWayPoints()) {
    202                         if (w.attr.containsKey("name") || w.attr.containsKey("desc")) {
     203                        if (w.attr.containsKey(GpxConstants.GPX_NAME) || w.attr.containsKey(GpxConstants.GPX_DESC)) {
    203204                            waypoints.add(w);
    204205                        }
     
    245246                    name = name.substring(0, dot);
    246247                }
    247                 wayPointFromTimeStamp.attr.put("name", name);
     248                wayPointFromTimeStamp.put(GpxConstants.GPX_NAME, name);
    248249                waypoints.add(wayPointFromTimeStamp);
    249250            }
     
    259260                    for (WayPoint w : seg.getWayPoints()) {
    260261                        WayPoint wStart = new WayPoint(w.getCoor());
    261                         wStart.attr.put("name", "start");
     262                        wStart.put(GpxConstants.GPX_NAME, "start");
    262263                        wStart.time = w.time;
    263264                        waypoints.add(wStart);
  • trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/AudioMarker.java

    r6830 r7518  
    8787        GpxLink link = new GpxLink(audioUrl.toString());
    8888        link.type = "audio";
    89         wpt.attr.put(GpxConstants.META_LINKS, Collections.singleton(link));
     89        wpt.put(GpxConstants.META_LINKS, Collections.singleton(link));
    9090        wpt.addExtension("offset", Double.toString(offset));
    9191        wpt.addExtension("sync-offset", Double.toString(syncOffset));
  • trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/ImageMarker.java

    r6830 r7518  
    9393        GpxLink link = new GpxLink(imageUrl.toString());
    9494        link.type = "image";
    95         wpt.attr.put(GpxConstants.META_LINKS, Collections.singleton(link));
     95        wpt.put(GpxConstants.META_LINKS, Collections.singleton(link));
    9696        return wpt;
    9797    }
    98 
    9998}
  • trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java

    r7049 r7518  
    181181    static {
    182182        Marker.markerProducers.add(new MarkerProducers() {
    183             @SuppressWarnings("unchecked")
    184183            @Override
    185184            public Marker createMarker(WayPoint wpt, File relativePath, MarkerLayer parentLayer, double time, double offset) {
     
    187186                // cheapest way to check whether "link" object exists and is a non-empty
    188187                // collection of GpxLink objects...
    189                 Collection<GpxLink> links = (Collection<GpxLink>)wpt.attr.get(GpxConstants.META_LINKS);
     188                Collection<GpxLink> links = wpt.<GpxLink>getCollection(GpxConstants.META_LINKS);
    190189                if (links != null) {
    191190                    for (GpxLink oneLink : links ) {
     
    210209                    String symbolName = wpt.getString("symbol");
    211210                    if (symbolName == null) {
    212                         symbolName = wpt.getString("sym");
     211                        symbolName = wpt.getString(GpxConstants.PT_SYM);
    213212                    }
    214213                    return new Marker(wpt.getCoor(), wpt, symbolName, parentLayer, time, offset);
  • trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/MarkerLayer.java

    r7326 r7518  
    9494            if (firstTime < 0 && wpt_has_link) {
    9595                firstTime = time;
    96                 for (Object oneLink : wpt.getCollection(GpxConstants.META_LINKS)) {
    97                     if (oneLink instanceof GpxLink) {
    98                         lastLinkedFile = ((GpxLink)oneLink).uri;
    99                         break;
     96                for (GpxLink oneLink : wpt.<GpxLink>getCollection(GpxConstants.META_LINKS)) {
     97                    lastLinkedFile = oneLink.uri;
     98                    break;
     99                }
     100            }
     101            if (wpt_has_link) {
     102                for (GpxLink oneLink : wpt.<GpxLink>getCollection(GpxConstants.META_LINKS)) {
     103                    String uri = oneLink.uri;
     104                    if (!uri.equals(lastLinkedFile)) {
     105                        firstTime = time;
    100106                    }
    101                 }
    102             }
    103             if (wpt_has_link) {
    104                 for (Object oneLink : wpt.getCollection(GpxConstants.META_LINKS)) {
    105                     if (oneLink instanceof GpxLink) {
    106                         String uri = ((GpxLink)oneLink).uri;
    107                         if (!uri.equals(lastLinkedFile)) {
    108                             firstTime = time;
    109                         }
    110                         lastLinkedFile = uri;
    111                         break;
    112                     }
     107                    lastLinkedFile = uri;
     108                    break;
    113109                }
    114110            }
  • trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/WebMarker.java

    r6830 r7518  
    5656        GpxLink link = new GpxLink(webUrl.toString());
    5757        link.type = "web";
    58         wpt.attr.put(GpxConstants.META_LINKS, Collections.singleton(link));
     58        wpt.put(GpxConstants.META_LINKS, Collections.singleton(link));
    5959        return wpt;
    6060    }
  • trunk/src/org/openstreetmap/josm/io/GpxExporter.java

    r7414 r7518  
    9090        desc.setWrapStyleWord(true);
    9191        desc.setLineWrap(true);
    92         desc.setText((String) gpxData.attr.get(META_DESC));
     92        desc.setText(gpxData.getString(META_DESC));
    9393        p.add(new JScrollPane(desc), GBC.eop().fill(GBC.BOTH));
    9494
     
    120120        p.add(new JLabel(tr("Keywords")), GBC.eol());
    121121        JosmTextField keywords = new JosmTextField();
    122         keywords.setText((String) gpxData.attr.get(META_KEYWORDS));
     122        keywords.setText(gpxData.getString(META_KEYWORDS));
    123123        p.add(keywords, GBC.eop().fill(GBC.HORIZONTAL));
    124124
     
    155155        if (author.isSelected()) {
    156156            if (authorName.getText().length() > 0) {
    157                 gpxData.attr.put(META_AUTHOR_NAME, authorName.getText());
    158                 gpxData.attr.put(META_COPYRIGHT_AUTHOR, authorName.getText());
     157                gpxData.put(META_AUTHOR_NAME, authorName.getText());
     158                gpxData.put(META_COPYRIGHT_AUTHOR, authorName.getText());
    159159            }
    160160            if (email.getText().length() > 0) {
    161                 gpxData.attr.put(META_AUTHOR_EMAIL, email.getText());
     161                gpxData.put(META_AUTHOR_EMAIL, email.getText());
    162162            }
    163163            if (copyright.getText().length() > 0) {
    164                 gpxData.attr.put(META_COPYRIGHT_LICENSE, copyright.getText());
     164                gpxData.put(META_COPYRIGHT_LICENSE, copyright.getText());
    165165            }
    166166            if (copyrightYear.getText().length() > 0) {
    167                 gpxData.attr.put(META_COPYRIGHT_YEAR, copyrightYear.getText());
     167                gpxData.put(META_COPYRIGHT_YEAR, copyrightYear.getText());
    168168            }
    169169        }
     
    171171        // add the description to the gpx data
    172172        if (desc.getText().length() > 0) {
    173             gpxData.attr.put(META_DESC, desc.getText());
     173            gpxData.put(META_DESC, desc.getText());
    174174        }
    175175
    176176        // add keywords to the gpx data
    177177        if (keywords.getText().length() > 0) {
    178             gpxData.attr.put(META_KEYWORDS, keywords.getText());
     178            gpxData.put(META_KEYWORDS, keywords.getText());
    179179        }
    180180
     
    201201        if (enable) {
    202202            if (copyrightYear.getText().length()==0) {
    203                 String sCopyrightYear = (String) data.attr.get(META_COPYRIGHT_YEAR);
     203                String sCopyrightYear = data.getString(META_COPYRIGHT_YEAR);
    204204                if (sCopyrightYear == null) {
    205205                    sCopyrightYear = Integer.toString(Calendar.getInstance().get(Calendar.YEAR));
     
    208208            }
    209209            if (copyright.getText().length()==0) {
    210                 String sCopyright = (String) data.attr.get(META_COPYRIGHT_LICENSE);
     210                String sCopyright = data.getString(META_COPYRIGHT_LICENSE);
    211211                if (sCopyright == null) {
    212212                    sCopyright = Main.pref.get("lastCopyright", "https://creativecommons.org/licenses/by-sa/2.5");
     
    247247                emailLabel.setEnabled(b);
    248248                if (b) {
    249                     String sAuthorName = (String) data.attr.get(META_AUTHOR_NAME);
     249                    String sAuthorName = data.getString(META_AUTHOR_NAME);
    250250                    if (sAuthorName == null) {
    251251                        sAuthorName = Main.pref.get("lastAuthorName");
    252252                    }
    253253                    authorName.setText(sAuthorName);
    254                     String sEmail = (String) data.attr.get(META_AUTHOR_EMAIL);
     254                    String sEmail = data.getString(META_AUTHOR_EMAIL);
    255255                    if (sEmail == null) {
    256256                        sEmail = Main.pref.get("lastAuthorEmail");
  • trunk/src/org/openstreetmap/josm/io/GpxReader.java

    r7509 r7518  
    156156                    states.push(currentState);
    157157                    currentState = State.copyright;
    158                     data.attr.put(META_COPYRIGHT_AUTHOR, atts.getValue("author"));
     158                    data.put(META_COPYRIGHT_AUTHOR, atts.getValue("author"));
    159159                    break;
    160160                case "link":
     
    172172                    break;
    173173                case "email":
    174                     data.attr.put(META_AUTHOR_EMAIL, atts.getValue("id") + "@" + atts.getValue("domain"));
     174                    data.put(META_AUTHOR_EMAIL, atts.getValue("id") + "@" + atts.getValue("domain"));
    175175                }
    176176                break;
     
    275275                switch (localName) {
    276276                case "name":
    277                     data.attr.put(META_NAME, accumulator.toString());
     277                    data.put(META_NAME, accumulator.toString());
    278278                    break;
    279279                case "desc":
    280                     data.attr.put(META_DESC, accumulator.toString());
     280                    data.put(META_DESC, accumulator.toString());
    281281                    break;
    282282                case "time":
    283                     data.attr.put(META_TIME, accumulator.toString());
     283                    data.put(META_TIME, accumulator.toString());
    284284                    break;
    285285                case "keywords":
    286                     data.attr.put(META_KEYWORDS, accumulator.toString());
     286                    data.put(META_KEYWORDS, accumulator.toString());
    287287                    break;
    288288                case "author":
    289289                    if ("1.0".equals(version)) {
    290290                        // author is a string in 1.0, but complex element in 1.1
    291                         data.attr.put(META_AUTHOR_NAME, accumulator.toString());
     291                        data.put(META_AUTHOR_NAME, accumulator.toString());
    292292                    }
    293293                    break;
    294294                case "email":
    295295                    if ("1.0".equals(version)) {
    296                         data.attr.put(META_AUTHOR_EMAIL, accumulator.toString());
     296                        data.put(META_AUTHOR_EMAIL, accumulator.toString());
    297297                    }
    298298                    break;
    299299                case "url":
    300300                case "urlname":
    301                     data.attr.put(localName, accumulator.toString());
     301                    data.put(localName, accumulator.toString());
    302302                    break;
    303303                case "metadata":
     
    307307                        convertUrlToLink(data.attr);
    308308                        if (currentExtensions != null && !currentExtensions.isEmpty()) {
    309                             data.attr.put(META_EXTENSIONS, currentExtensions);
     309                            data.put(META_EXTENSIONS, currentExtensions);
    310310                        }
    311311                        currentState = states.pop();
     
    322322                    break;
    323323                case "name":
    324                     data.attr.put(META_AUTHOR_NAME, accumulator.toString());
     324                    data.put(META_AUTHOR_NAME, accumulator.toString());
    325325                    break;
    326326                case "email":
     
    328328                    break;
    329329                case "link":
    330                     data.attr.put(META_AUTHOR_LINK, currentLink);
     330                    data.put(META_AUTHOR_LINK, currentLink);
    331331                    break;
    332332                }
     
    338338                    break;
    339339                case "year":
    340                     data.attr.put(META_COPYRIGHT_YEAR, accumulator.toString());
     340                    data.put(META_COPYRIGHT_YEAR, accumulator.toString());
    341341                    break;
    342342                case "license":
    343                     data.attr.put(META_COPYRIGHT_LICENSE, accumulator.toString());
     343                    data.put(META_COPYRIGHT_LICENSE, accumulator.toString());
    344344                    break;
    345345                }
     
    361361                }
    362362                if (currentState == State.author) {
    363                     data.attr.put(META_AUTHOR_LINK, currentLink);
     363                    data.put(META_AUTHOR_LINK, currentLink);
    364364                } else if (currentState != State.link) {
    365365                    Map<String, Object> attr = getAttr();
     
    381381                case "url":
    382382                case "urlname":
    383                     currentWayPoint.attr.put(localName, accumulator.toString());
     383                    currentWayPoint.put(localName, accumulator.toString());
    384384                    break;
    385385                case "hdop":
     
    387387                case "pdop":
    388388                    try {
    389                         currentWayPoint.attr.put(localName, Float.parseFloat(accumulator.toString()));
     389                        currentWayPoint.put(localName, Float.parseFloat(accumulator.toString()));
    390390                    } catch(Exception e) {
    391                         currentWayPoint.attr.put(localName, new Float(0));
     391                        currentWayPoint.put(localName, new Float(0));
    392392                    }
    393393                    break;
    394394                case "time":
    395                     currentWayPoint.attr.put(localName, accumulator.toString());
     395                    currentWayPoint.put(localName, accumulator.toString());
    396396                    currentWayPoint.setTime();
    397397                    break;
    398398                case "cmt":
    399399                case "desc":
    400                     currentWayPoint.attr.put(localName, accumulator.toString());
     400                    currentWayPoint.put(localName, accumulator.toString());
    401401                    currentWayPoint.setTime();
    402402                    break;
     
    415415                    convertUrlToLink(currentWayPoint.attr);
    416416                    if (currentExtensions != null && !currentExtensions.isEmpty()) {
    417                         currentWayPoint.attr.put(META_EXTENSIONS, currentExtensions);
     417                        currentWayPoint.put(META_EXTENSIONS, currentExtensions);
    418418                    }
    419419                    data.waypoints.add(currentWayPoint);
     
    472472            if (!states.empty())
    473473                throw new SAXException(tr("Parse error: invalid document structure for GPX document."));
    474             Extensions metaExt = (Extensions) data.attr.get(META_EXTENSIONS);
     474            Extensions metaExt = (Extensions) data.get(META_EXTENSIONS);
    475475            if (metaExt != null && "true".equals(metaExt.get("from-server"))) {
    476476                data.fromServer = true;
  • trunk/src/org/openstreetmap/josm/io/GpxWriter.java

    r7082 r7518  
    1010import java.nio.charset.StandardCharsets;
    1111import java.util.Collection;
     12import java.util.List;
    1213import java.util.Map;
    1314import java.util.Map.Entry;
     
    3233public class GpxWriter extends XmlWriter implements GpxConstants {
    3334
     35    /**
     36     * Constructs a new {@code GpxWriter}.
     37     * @param out The output writer
     38     */
    3439    public GpxWriter(PrintWriter out) {
    3540        super(out);
    3641    }
    3742
     43    /**
     44     * Constructs a new {@code GpxWriter}.
     45     * @param out The output stream
     46     */
    3847    public GpxWriter(OutputStream out) {
    3948        super(new PrintWriter(new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8))));
     
    4756    private static final int TRACK_POINT = 2;
    4857
     58    /**
     59     * Writes the given GPX data.
     60     * @param data The data to write
     61     */
    4962    public void write(GpxData data) {
    5063        this.data = data;
     
    8093    }
    8194
    82     private void writeAttr(IWithAttributes obj) {
    83         for (String key : WPT_KEYS) {
     95    private void writeAttr(IWithAttributes obj, List<String> keys) {
     96        for (String key : keys) {
    8497            if (key.equals(META_LINKS)) {
    85                 @SuppressWarnings("unchecked")
    86                 Collection<GpxLink> lValue = (Collection<GpxLink>) obj.getCollection(key);
     98                Collection<GpxLink> lValue = obj.<GpxLink>getCollection(key);
    8799                if (lValue != null) {
    88100                    for (GpxLink link : lValue) {
     
    104116    }
    105117
    106     @SuppressWarnings("unchecked")
    107118    private void writeMetaData() {
    108119        Map<String, Object> attr = data.attr;
     
    111122        // write the description
    112123        if (attr.containsKey(META_DESC)) {
    113             simpleTag("desc", (String)attr.get(META_DESC));
     124            simpleTag("desc", data.getString(META_DESC));
    114125        }
    115126
     
    119130            openln("author");
    120131            // write the name
    121             simpleTag("name", (String) attr.get(META_AUTHOR_NAME));
     132            simpleTag("name", data.getString(META_AUTHOR_NAME));
    122133            // write the email address
    123134            if (attr.containsKey(META_AUTHOR_EMAIL)) {
    124                 String[] tmp = ((String)attr.get(META_AUTHOR_EMAIL)).split("@");
     135                String[] tmp = data.getString(META_AUTHOR_EMAIL).split("@");
    125136                if (tmp.length == 2) {
    126137                    inline("email", "id=\"" + tmp[0] + "\" domain=\""+tmp[1]+"\"");
     
    128139            }
    129140            // write the author link
    130             gpxLink((GpxLink) attr.get(META_AUTHOR_LINK));
     141            gpxLink((GpxLink) data.get(META_AUTHOR_LINK));
    131142            closeln("author");
    132143        }
     
    135146        if (attr.containsKey(META_COPYRIGHT_LICENSE)
    136147                || attr.containsKey(META_COPYRIGHT_YEAR)) {
    137             openAtt("copyright", "author=\""+ attr.get(META_COPYRIGHT_AUTHOR) +"\"");
     148            openAtt("copyright", "author=\""+ data.get(META_COPYRIGHT_AUTHOR) +"\"");
    138149            if (attr.containsKey(META_COPYRIGHT_YEAR)) {
    139                 simpleTag("year", (String) attr.get(META_COPYRIGHT_YEAR));
     150                simpleTag("year", (String) data.get(META_COPYRIGHT_YEAR));
    140151            }
    141152            if (attr.containsKey(META_COPYRIGHT_LICENSE)) {
    142                 simpleTag("license", encode((String) attr.get(META_COPYRIGHT_LICENSE)));
     153                simpleTag("license", encode((String) data.get(META_COPYRIGHT_LICENSE)));
    143154            }
    144155            closeln("copyright");
     
    147158        // write links
    148159        if (attr.containsKey(META_LINKS)) {
    149             for (GpxLink link : (Collection<GpxLink>) attr.get(META_LINKS)) {
     160            for (GpxLink link : data.<GpxLink>getCollection(META_LINKS)) {
    150161                gpxLink(link);
    151162            }
     
    154165        // write keywords
    155166        if (attr.containsKey(META_KEYWORDS)) {
    156             simpleTag("keywords", (String)attr.get(META_KEYWORDS));
     167            simpleTag("keywords", data.getString(META_KEYWORDS));
    157168        }
    158169
     
    182193        for (GpxRoute rte : data.routes) {
    183194            openln("rte");
    184             writeAttr(rte);
     195            writeAttr(rte, RTE_TRK_KEYS);
    185196            for (WayPoint pnt : rte.routePoints) {
    186197                wayPoint(pnt, ROUTE_POINT);
     
    193204        for (GpxTrack trk : data.tracks) {
    194205            openln("trk");
    195             writeAttr(trk);
     206            writeAttr(trk, RTE_TRK_KEYS);
    196207            for (GpxTrackSegment seg : trk.getSegments()) {
    197208                openln("trkseg");
     
    284295            } else {
    285296                openAtt(type, coordAttr);
    286                 writeAttr(pnt);
     297                writeAttr(pnt, WPT_KEYS);
    287298                closeln(type);
    288299            }
  • trunk/src/org/openstreetmap/josm/io/NmeaReader.java

    r7299 r7518  
    1515import org.openstreetmap.josm.Main;
    1616import org.openstreetmap.josm.data.coor.LatLon;
     17import org.openstreetmap.josm.data.gpx.GpxConstants;
    1718import org.openstreetmap.josm.data.gpx.GpxData;
    1819import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack;
     
    287288                    // As this sentence has no complete time only use it
    288289                    // if there is no time so far
    289                     currentwp.attr.put("time", DateUtils.fromDate(d));
     290                    currentwp.put(GpxConstants.PT_TIME, DateUtils.fromDate(d));
    290291                }
    291292                // elevation
     
    299300                        // device sends nonstandard data.
    300301                        if(!accu.isEmpty()) { // FIX ? same check
    301                             currentwp.attr.put("ele", accu);
     302                            currentwp.put(GpxConstants.PT_ELE, accu);
    302303                        }
    303304                    }
     
    308309                if(!accu.isEmpty()) {
    309310                    sat = Integer.parseInt(accu);
    310                     currentwp.attr.put("sat", accu);
     311                    currentwp.put(GpxConstants.PT_SAT, accu);
    311312                }
    312313                // h-dilution
    313314                accu=e[GPGGA.HDOP.position];
    314315                if(!accu.isEmpty()) {
    315                     currentwp.attr.put("hdop", Float.parseFloat(accu));
     316                    currentwp.put(GpxConstants.PT_HDOP, Float.parseFloat(accu));
    316317                }
    317318                // fix
     
    321322                    switch(fixtype) {
    322323                    case 0:
    323                         currentwp.attr.put("fix", "none");
     324                        currentwp.put(GpxConstants.PT_FIX, "none");
    324325                        break;
    325326                    case 1:
    326327                        if(sat < 4) {
    327                             currentwp.attr.put("fix", "2d");
     328                            currentwp.put(GpxConstants.PT_FIX, "2d");
    328329                        } else {
    329                             currentwp.attr.put("fix", "3d");
     330                            currentwp.put(GpxConstants.PT_FIX, "3d");
    330331                        }
    331332                        break;
    332333                    case 2:
    333                         currentwp.attr.put("fix", "dgps");
     334                        currentwp.put(GpxConstants.PT_FIX, "dgps");
    334335                        break;
    335336                    default:
     
    345346                    if(!accu.isEmpty()) {
    346347                        Double.parseDouble(accu);
    347                         currentwp.attr.put("course", accu);
     348                        currentwp.put("course", accu);
    348349                    }
    349350                }
     
    355356                        double speed = Double.parseDouble(accu);
    356357                        speed /= 3.6; // speed in m/s
    357                         currentwp.attr.put("speed", Double.toString(speed));
     358                        currentwp.put("speed", Double.toString(speed));
    358359                    }
    359360                }
     
    362363                accu=e[GPGSA.VDOP.position];
    363364                if(!accu.isEmpty()) {
    364                     currentwp.attr.put("vdop", Float.parseFloat(accu));
     365                    currentwp.put(GpxConstants.PT_VDOP, Float.parseFloat(accu));
    365366                }
    366367                // hdop
    367368                accu=e[GPGSA.HDOP.position];
    368369                if(!accu.isEmpty()) {
    369                     currentwp.attr.put("hdop", Float.parseFloat(accu));
     370                    currentwp.put(GpxConstants.PT_HDOP, Float.parseFloat(accu));
    370371                }
    371372                // pdop
    372373                accu=e[GPGSA.PDOP.position];
    373374                if(!accu.isEmpty()) {
    374                     currentwp.attr.put("pdop", Float.parseFloat(accu));
     375                    currentwp.put(GpxConstants.PT_PDOP, Float.parseFloat(accu));
    375376                }
    376377            }
     
    399400                }
    400401                // time: this sentence has complete time so always use it.
    401                 currentwp.attr.put("time", DateUtils.fromDate(d));
     402                currentwp.put(GpxConstants.PT_TIME, DateUtils.fromDate(d));
    402403                // speed
    403404                accu = e[GPRMC.SPEED.position];
     
    405406                    double speed = Double.parseDouble(accu);
    406407                    speed *= 0.514444444; // to m/s
    407                     currentwp.attr.put("speed", Double.toString(speed));
     408                    currentwp.put("speed", Double.toString(speed));
    408409                }
    409410                // course
     
    411412                if(!accu.isEmpty() && !currentwp.attr.containsKey("course")) {
    412413                    Double.parseDouble(accu);
    413                     currentwp.attr.put("course", accu);
     414                    currentwp.put("course", accu);
    414415                }
    415416
  • trunk/src/org/openstreetmap/josm/io/session/MarkerSessionExporter.java

    r7082 r7518  
    100100        public void write(MarkerLayer layer) {
    101101            GpxData data = new GpxData();
    102             data.attr.put(GpxData.META_DESC, "exported JOSM marker layer");
     102            data.put(GpxData.META_DESC, "exported JOSM marker layer");
    103103            for (Marker m : layer.data) {
    104104                data.waypoints.add(m.convertToWayPoint());
Note: See TracChangeset for help on using the changeset viewer.