001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.data.osm; 003 004import org.openstreetmap.josm.data.coor.EastNorth; 005import org.openstreetmap.josm.data.coor.LatLon; 006import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor; 007import org.openstreetmap.josm.data.projection.ProjectionRegistry; 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(ProjectionRegistry.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 BBox getBBox() { 104 return new BBox(lon, lat); 105 } 106 107 @Override 108 public boolean isReferredByWays(int n) { 109 return false; 110 } 111}