101 lines
2.6 KiB
Java
101 lines
2.6 KiB
Java
/**
|
|
* Container for link between two Osm nodes
|
|
*
|
|
* @author ab
|
|
*/
|
|
package btools.mapaccess;
|
|
|
|
import btools.util.ByteDataReader;
|
|
|
|
|
|
public class OsmLink
|
|
{
|
|
/**
|
|
* The description bitmap is mainly the way description
|
|
* used to calculate the costfactor
|
|
*/
|
|
public byte[] descriptionBitmap;
|
|
|
|
public OsmNode targetNode;
|
|
|
|
public OsmLink next;
|
|
|
|
public OsmLinkHolder firstlinkholder = null;
|
|
|
|
public byte[] geometry;
|
|
|
|
public boolean counterLinkWritten;
|
|
|
|
public boolean hasNewGeometry; // preliminary
|
|
|
|
public byte state;
|
|
|
|
public void setGeometry( byte[] geometry )
|
|
{
|
|
this.geometry = geometry;
|
|
hasNewGeometry = true;
|
|
}
|
|
|
|
final public OsmTransferNode decodeFirsttransfer( OsmNode sourceNode )
|
|
{
|
|
if ( geometry == null ) return null;
|
|
if ( hasNewGeometry )
|
|
{
|
|
OsmTransferNode firstTransferNode = null;
|
|
OsmTransferNode lastTransferNode = null;
|
|
OsmNode startnode = counterLinkWritten ? targetNode : sourceNode;
|
|
ByteDataReader r = new ByteDataReader( geometry );
|
|
int olon = startnode.ilon;
|
|
int olat = startnode.ilat;
|
|
int oselev = startnode.selev;
|
|
while ( r.hasMoreData() )
|
|
{
|
|
OsmTransferNode trans = new OsmTransferNode();
|
|
trans.ilon = olon + r.readVarLengthSigned();
|
|
trans.ilat = olat + r.readVarLengthSigned();
|
|
trans.descriptionBitmap = descriptionBitmap;
|
|
trans.selev = (short)(oselev + r.readVarLengthSigned());
|
|
olon = trans.ilon;
|
|
olat = trans.ilat;
|
|
oselev = trans.selev;
|
|
if ( counterLinkWritten ) // reverse chaining
|
|
{
|
|
trans.next = firstTransferNode;
|
|
firstTransferNode = trans;
|
|
}
|
|
else
|
|
{
|
|
if ( lastTransferNode == null )
|
|
{
|
|
firstTransferNode = trans;
|
|
}
|
|
else
|
|
{
|
|
lastTransferNode.next = trans;
|
|
}
|
|
lastTransferNode = trans;
|
|
}
|
|
}
|
|
return firstTransferNode;
|
|
}
|
|
return OsmTransferNode.decode( geometry );
|
|
}
|
|
|
|
final public void encodeFirsttransfer( OsmTransferNode firsttransfer )
|
|
{
|
|
if ( firsttransfer == null ) geometry = null;
|
|
else geometry = OsmTransferNode.encode( firsttransfer );
|
|
}
|
|
|
|
final public void addLinkHolder( OsmLinkHolder holder )
|
|
{
|
|
if ( firstlinkholder != null ) { holder.setNextForLink( firstlinkholder ); }
|
|
firstlinkholder = holder;
|
|
}
|
|
|
|
public String toString()
|
|
{
|
|
return "Link(target=" + targetNode.getIdFromPos() + " counterLinkWritten=" + counterLinkWritten + " state=" + state + ")";
|
|
}
|
|
}
|