177 lines
4 KiB
Java
177 lines
4 KiB
Java
/**
|
|
* Container for link between two Osm nodes
|
|
*
|
|
* @author ab
|
|
*/
|
|
package btools.mapaccess;
|
|
|
|
|
|
|
|
public class OsmLink
|
|
{
|
|
/**
|
|
* The description bitmap contains the waytags (valid for both directions)
|
|
*/
|
|
public byte[] descriptionBitmap;
|
|
|
|
/**
|
|
* The geometry contains intermediate nodes, null for none (valid for both directions)
|
|
*/
|
|
public byte[] geometry;
|
|
|
|
// a link logically knows only its target, but for the reverse link, source and target are swapped
|
|
protected OsmNode n1;
|
|
protected OsmNode n2;
|
|
|
|
// same for the next-link-for-node pointer: previous applies to the reverse link
|
|
protected OsmLink previous;
|
|
protected OsmLink next;
|
|
|
|
private OsmLinkHolder reverselinkholder = null;
|
|
private OsmLinkHolder firstlinkholder = null;
|
|
|
|
protected OsmLink()
|
|
{
|
|
}
|
|
|
|
public OsmLink( OsmNode source, OsmNode target )
|
|
{
|
|
n1 = source;
|
|
n2 = target;
|
|
}
|
|
|
|
/**
|
|
* Get the relevant target-node for the given source
|
|
*/
|
|
public final OsmNode getTarget( OsmNode source )
|
|
{
|
|
return n2 != source && n2 != null ? n2 : n1;
|
|
/* if ( n2 != null && n2 != source )
|
|
{
|
|
return n2;
|
|
}
|
|
else if ( n1 != null && n1 != source )
|
|
{
|
|
return n1;
|
|
}
|
|
else
|
|
{
|
|
new Throwable( "ups" ).printStackTrace();
|
|
throw new IllegalArgumentException( "internal error: getTarget: unknown source; " + source + " n1=" + n1 + " n2=" + n2 );
|
|
} */
|
|
}
|
|
|
|
/**
|
|
* Get the relevant next-pointer for the given source
|
|
*/
|
|
public final OsmLink getNext( OsmNode source )
|
|
{
|
|
return n2 != source && n2 != null ? next : previous;
|
|
/* if ( n2 != null && n2 != source )
|
|
{
|
|
return next;
|
|
}
|
|
else if ( n1 != null && n1 != source )
|
|
{
|
|
return previous;
|
|
}
|
|
else
|
|
{
|
|
throw new IllegalArgumentException( "internal error: gextNext: unknown source" );
|
|
} */
|
|
}
|
|
|
|
/**
|
|
* Reset this link for the given direction
|
|
*/
|
|
protected final OsmLink clear( OsmNode source )
|
|
{
|
|
OsmLink n;
|
|
if ( n2 != null && n2 != source )
|
|
{
|
|
n = next;
|
|
next = null;
|
|
n2 = null;
|
|
firstlinkholder = null;
|
|
}
|
|
else if ( n1 != null && n1 != source )
|
|
{
|
|
n = previous;
|
|
previous = null;
|
|
n1 = null;
|
|
reverselinkholder = null;
|
|
}
|
|
else
|
|
{
|
|
throw new IllegalArgumentException( "internal error: setNext: unknown source" );
|
|
}
|
|
if ( n1 == null && n2 == null )
|
|
{
|
|
descriptionBitmap = null;
|
|
geometry = null;
|
|
}
|
|
return n;
|
|
}
|
|
|
|
public final void setFirstLinkHolder( OsmLinkHolder holder, OsmNode source )
|
|
{
|
|
if ( n2 != null && n2 != source )
|
|
{
|
|
firstlinkholder = holder;
|
|
}
|
|
else if ( n1 != null && n1 != source )
|
|
{
|
|
reverselinkholder = holder;
|
|
}
|
|
else
|
|
{
|
|
throw new IllegalArgumentException( "internal error: setFirstLinkHolder: unknown source" );
|
|
}
|
|
}
|
|
|
|
public final OsmLinkHolder getFirstLinkHolder( OsmNode source )
|
|
{
|
|
if ( n2 != null && n2 != source )
|
|
{
|
|
return firstlinkholder;
|
|
}
|
|
else if ( n1 != null && n1 != source )
|
|
{
|
|
return reverselinkholder;
|
|
}
|
|
else
|
|
{
|
|
throw new IllegalArgumentException( "internal error: getFirstLinkHolder: unknown source" );
|
|
}
|
|
}
|
|
|
|
public final boolean isReverse( OsmNode source )
|
|
{
|
|
return n1 != source && n1 != null;
|
|
/* if ( n2 != null && n2 != source )
|
|
{
|
|
return false;
|
|
}
|
|
else if ( n1 != null && n1 != source )
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
throw new IllegalArgumentException( "internal error: isReverse: unknown source" );
|
|
} */
|
|
}
|
|
|
|
public final boolean isBidirectional()
|
|
{
|
|
return n1 != null && n2 != null;
|
|
}
|
|
|
|
public final void addLinkHolder( OsmLinkHolder holder, OsmNode source )
|
|
{
|
|
OsmLinkHolder firstHolder = getFirstLinkHolder( source );
|
|
if ( firstHolder != null ) { holder.setNextForLink( firstHolder ); }
|
|
setFirstLinkHolder( holder, source );
|
|
}
|
|
|
|
}
|