001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.osm;
003
004import org.openstreetmap.josm.Main;
005import org.openstreetmap.josm.data.coor.EastNorth;
006import org.openstreetmap.josm.data.coor.LatLon;
007import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
008
009/**
010 * The data on a single node (tags and position) that is stored in the database
011 */
012public class NodeData extends PrimitiveData implements INode {
013
014    private static final long serialVersionUID = 5626323599550908773L;
015    /*
016     * we "inline" lat/lon coordinates instead of using a LatLon => reduces memory footprint
017     */
018    private double lat = Double.NaN;
019    private double lon = Double.NaN;
020
021    /**
022     * Constructs a new {@code NodeData}.
023     */
024    public NodeData() {
025        // contents can be set later with setters
026    }
027
028    /**
029     * Constructs a new {@code NodeData} with given id.
030     * @param id id
031     * @since 12017
032     */
033    public NodeData(long id) {
034        super(id);
035    }
036
037    /**
038     * Constructs a new {@code NodeData}.
039     * @param data node data to copy
040     */
041    public NodeData(NodeData data) {
042        super(data);
043        setCoor(data.getCoor());
044    }
045
046    @Override
047    public double lat() {
048        return lat;
049    }
050
051    @Override
052    public double lon() {
053        return lon;
054    }
055
056    @Override
057    public boolean isLatLonKnown() {
058        return !Double.isNaN(lat) && !Double.isNaN(lon);
059    }
060
061    @Override
062    public LatLon getCoor() {
063        return isLatLonKnown() ? new LatLon(lat, lon) : null;
064    }
065
066    @Override
067    public final void setCoor(LatLon coor) {
068        if (coor == null) {
069            this.lat = Double.NaN;
070            this.lon = Double.NaN;
071        } else {
072            this.lat = coor.lat();
073            this.lon = coor.lon();
074        }
075    }
076
077    @Override
078    public void setEastNorth(EastNorth eastNorth) {
079        setCoor(Main.getProjection().eastNorth2latlon(eastNorth));
080    }
081
082    @Override
083    public NodeData makeCopy() {
084        return new NodeData(this);
085    }
086
087    @Override
088    public String toString() {
089        return super.toString() + " NODE " + getCoor();
090    }
091
092    @Override
093    public OsmPrimitiveType getType() {
094        return OsmPrimitiveType.NODE;
095    }
096
097    @Override
098    public void accept(PrimitiveVisitor visitor) {
099        visitor.visit(this);
100    }
101
102    @Override
103    public boolean isReferredByWays(int n) {
104        return false;
105    }
106}