package aimax.osm.data.impl; import java.util.ArrayList; import java.util.Collections; import java.util.List; import aimax.osm.data.EntityVisitor; import aimax.osm.data.entities.MapNode; import aimax.osm.data.entities.MapWay; import aimax.osm.data.entities.WayRef; /** * Default implementation of a node. * @author Ruediger Lunde */ public class DefaultMapNode extends DefaultMapEntity implements MapNode { private float lat; private float lon; private List<WayRef> ways; public DefaultMapNode(long id) { this.id = id; this.lat = Float.NaN; this.lon = Float.NaN; } /** {@inheritDoc} */ @Override public boolean hasPosition() { return !Float.isNaN(lat) && !Float.isNaN(lon); } /** {@inheritDoc} */ @Override public void setPosition(float lat, float lon) { this.lat = lat; this.lon = lon; } /** {@inheritDoc} */ @Override public float getLat() { return lat; } /** {@inheritDoc} */ @Override public float getLon() { return lon; } /** Provides read-only access to the maintained list of way references. */ @Override public List<WayRef> getWayRefs() { if (ways == null) return Collections.emptyList(); else return Collections.unmodifiableList(ways); } /** Adds the information to the node that it is part of the specified way. */ public void addWayRef(MapWay way, int nodeIdx) { if (ways == null) ways = new ArrayList<WayRef>(2); // be careful with closed ways (begin == end) if (ways.isEmpty() || ways.get(0) != way) ways.add(new DefaultWayRef(way, (short) nodeIdx)); } /** {@inheritDoc} */ @Override public void accept(EntityVisitor visitor) { visitor.visitMapNode(this); } @Override public String toString() { return "Node(" + id + ")"; } ///////////////////////////////////////////////////////////////// // extensions for KDTree /** {@inheritDoc} */ @Override public int compareLatitude(float lat) { if (this.lat < lat) return -1; else if (this.lat > lat) return 1; else return 0; } /** {@inheritDoc} */ @Override public int compareLongitude(float lon) { if (this.lon < lon) return -1; else if (this.lon > lon) return 1; else return 0; } }