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 }