001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.data.osm;
003    
004    import org.openstreetmap.josm.data.coor.EastNorth;
005    import org.openstreetmap.josm.data.coor.LatLon;
006    import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
007    import org.openstreetmap.josm.data.projection.Projections;
008    
009    public class NodeData extends PrimitiveData implements INode {
010    
011        /*
012         * we "inline" lat/lon coordinates instead of using a LatLon => reduces memory footprint
013         */
014        private double lat = Double.NaN;
015        private double lon = Double.NaN;
016    
017        public NodeData() {}
018    
019        public NodeData(NodeData data) {
020            super(data);
021            setCoor(data.getCoor());
022        }
023    
024        private boolean isLatLonKnown() {
025            return !Double.isNaN(lat) && !Double.isNaN(lon);
026        }
027    
028        @Override
029        public LatLon getCoor() {
030            return isLatLonKnown() ? new LatLon(lat,lon) : null;
031        }
032    
033        @Override
034        public void setCoor(LatLon coor) {
035            if (coor == null) {
036                this.lat = Double.NaN;
037                this.lon = Double.NaN;
038            } else {
039                this.lat = coor.lat();
040                this.lon = coor.lon();
041            }
042        }
043    
044        @Override
045        public EastNorth getEastNorth() {
046            /*
047             * No internal caching of projected coordinates needed. In contrast to getEastNorth()
048             * on Node, this method is rarely used. Caching would be overkill.
049             */
050            return Projections.project(getCoor());
051        }
052    
053        @Override
054        public void setEastNorth(EastNorth eastNorth) {
055            LatLon ll = Projections.inverseProject(eastNorth);
056            setCoor(ll);
057        }
058    
059        @Override
060        public NodeData makeCopy() {
061            return new NodeData(this);
062        }
063    
064        @Override
065        public String toString() {
066            return super.toString() + " NODE " + getCoor();
067        }
068    
069        @Override
070        public OsmPrimitiveType getType() {
071            return OsmPrimitiveType.NODE;
072        }
073    
074        @Override
075        public void visit(PrimitiveVisitor visitor) {
076            visitor.visit(this);
077        }
078    
079    }