/** * Container for an osm node (pre-pocessor version) * * @author ab */ package btools.memrouter; import btools.mapaccess.OsmPos; import btools.util.CheapRuler; public class OsmNodeP extends OsmLinkP implements Comparable, OsmPos { public OsmNodeP( double dlon, double dlat ) { ilon = (int)(dlon * 1000000 + 180000000); ilat = (int)(dlat * 1000000 + 90000000); } public OsmNodeP() { } /** * The latitude */ public int ilat; /** * The longitude */ public int ilon; /** * The elevation */ public short selev; public final static int NO_BRIDGE_BIT = 1; public final static int NO_TUNNEL_BIT = 2; public byte wayBits = 0; // interface OsmPos @Override public int getILat() { return ilat; } @Override public int getILon() { return ilon; } @Override public short getSElev() { // if all bridge or all tunnel, elevation=no-data return ( wayBits & NO_BRIDGE_BIT ) == 0 || ( wayBits & NO_TUNNEL_BIT ) == 0 ? Short.MIN_VALUE : selev; } @Override public double getElev() { return selev / 4.; } // populate and return the inherited link, if available, // else create a new one public OsmLinkP createLink( OsmNodeP source ) { if ( sourceNode == null && targetNode == null ) { // inherited instance is available, use this sourceNode = source; targetNode = this; source.addLink( this ); return this; } OsmLinkP link = new OsmLinkP( source, this ); addLink( link ); source.addLink( link ); return link; } // memory-squeezing-hack: OsmLinkP's "previous" also used as firstlink.. public void addLink( OsmLinkP link ) { link.setNext( previous, this ); previous = link; } public OsmLinkP getFirstLink() { return sourceNode == null && targetNode == null ? previous : this; } // interface OsmPos @Override public int calcDistance( OsmPos p ) { return (int)(CheapRuler.distance(ilon, ilat, p.getILon(), p.getILat()) + 1.0 ); } @Override public long getIdFromPos() { return ((long)ilon)<<32 | ilat; } public byte[] getNodeDecsription() { return null; } public String toString2() { return (ilon-180000000) + "_" + (ilat-90000000) + "_" + (selev/4); } /** * Compares two OsmNodes for position ordering. * * @return -1,0,1 depending an comparson result */ public int compareTo( OsmNodeP n ) { long id1 = getIdFromPos(); long id2 = n.getIdFromPos(); if ( id1 < id2 ) return -1; if ( id1 > id2 ) return 1; return 0; } public OffsetSet filterAndCloseNode( OffsetSet in, boolean modifyGate ) { return in; // do nothing (StationNode overrides) } public String getName() { return ""; } }