map access layer cleanup

This commit is contained in:
Arndt 2015-09-12 16:12:24 +02:00
parent 2cec35f3cc
commit f8dee5b7d1
7 changed files with 163 additions and 150 deletions

View file

@ -81,16 +81,52 @@ public class OsmNode implements OsmPos
*/
public OsmLink firstlink = null;
public OsmLink firstreverse = null;
public boolean wasProcessed; // whether this node has all it's links resolved
// preliminry in forward order to avoid regressions
public void addLink( OsmLink link )
{
if ( firstlink != null ) link.next = firstlink;
firstlink = link;
if ( firstlink == null )
{
firstlink = link;
}
else
{
OsmLink l = firstlink;
while( l.next != null ) l = l.next;
l.next = link;
}
}
private OsmLink getCompatibleLink( int ilon, int ilat, boolean counterLinkWritten, int state )
{
for( OsmLink l = firstlink; l != null; l = l.next )
{
if ( counterLinkWritten == l.counterLinkWritten && l.state == state )
{
OsmNode t = l.targetNode;
if ( t.ilon == ilon && t.ilat == ilat )
{
l.state = 0;
return l;
}
}
}
// second try ignoring counterLinkWritten
// (border links are written in both directions)
for( OsmLink l = firstlink; l != null; l = l.next )
{
if ( l.state == state )
{
OsmNode t = l.targetNode;
if ( t.ilon == ilon && t.ilat == ilat )
{
l.state = 0;
return l;
}
}
}
return null;
}
public int calcDistance( OsmPos p )
{
double l = (ilat-90000000) * 0.00000001234134;
@ -104,6 +140,10 @@ public class OsmNode implements OsmPos
return (int)(d + 1.0 );
}
public String toString()
{
return "" + getIdFromPos();
}
public void parseNodeBody( MicroCache is, OsmNodesMap hollowNodes, DistanceChecker dc )
{
@ -111,17 +151,12 @@ public class OsmNode implements OsmPos
selev = is.readShort();
OsmLink lastlink = null;
OsmLink firstHollowLink = firstlink;
firstlink = null;
while( is.hasMoreData() )
{
int ilonref = ilon;
int ilatref = ilat;
OsmLink link = new OsmLink();
boolean counterLinkWritten = false;
OsmTransferNode firstTransferNode = null;
OsmTransferNode lastTransferNode = null;
int linklon;
@ -163,10 +198,10 @@ public class OsmNode implements OsmPos
}
if ( (bitField & SKIPDETAILS_BITMASK ) != 0 )
{
link.counterLinkWritten = true;
counterLinkWritten = true;
}
if ( description == null && !link.counterLinkWritten ) throw new IllegalArgumentException( "internal error: missing way description!" );
if ( description == null && !counterLinkWritten ) throw new IllegalArgumentException( "internal error: missing way description!" );
boolean isTransfer = (bitField & TRANSFERNODE_BITMASK ) != 0;
if ( isTransfer )
@ -188,17 +223,16 @@ public class OsmNode implements OsmPos
}
else
{
link.descriptionBitmap = description;
break;
}
}
// performance shortcut: ignore link if out of reach
if ( dc != null && !link.counterLinkWritten )
if ( dc != null && !counterLinkWritten )
{
if ( !dc.isWithinRadius( ilon, ilat, firstTransferNode, linklon, linklat ) )
{
// continue;
continue;
}
}
@ -207,57 +241,46 @@ public class OsmNode implements OsmPos
continue; // skip self-ref
}
if ( lastlink == null )
{
firstlink = link;
}
else
{
lastlink.next = link;
}
lastlink = link;
OsmNode tn = null;
// first check the hollow links for that target
for( OsmLink l = firstHollowLink; l != null; l = l.next )
{
OsmNode t = l.targetNode;
if ( t.ilon == linklon && t.ilat == linklat )
{
tn = t;
break;
}
}
if ( tn == null ) // then check the hollow-nodes
// first check the known links for that target
OsmLink link = getCompatibleLink( linklon, linklat, counterLinkWritten, 2 );
if ( link == null ) // .. not found, then check the hollow nodes
{
long targetNodeId = ((long)linklon)<<32 | linklat;
tn = hollowNodes.get( targetNodeId ); // target node
OsmNode tn = hollowNodes.get( targetNodeId ); // target node
if ( tn == null ) // node not yet known, create a new hollow proxy
{
tn = new OsmNode(linklon, linklat);
tn.setHollow();
hollowNodes.put( targetNodeId, tn );
hollowNodes.put( tn );
}
OsmLink hollowLink = new OsmLink();
hollowLink.targetNode = this;
tn.addLink( hollowLink ); // make us known at the hollow link
link = new OsmLink();
link.targetNode = tn;
link.counterLinkWritten = counterLinkWritten;
link.state = 1;
addLink( link );
}
link.targetNode = tn;
link.encodeFirsttransfer(firstTransferNode);
// compute the reverse link
if ( !link.counterLinkWritten )
// now we have a link with a target node -> get the reverse link
OsmLink rlink = link.targetNode.getCompatibleLink( ilon, ilat, !counterLinkWritten, 1 );
if ( rlink == null ) // .. not found, create it
{
OsmLink rlink = new OsmLink();
byte[] linkDescriptionBitmap = link.descriptionBitmap;
rlink.ilonOrigin = tn.ilon;
rlink.ilatOrigin = tn.ilat;
rlink.targetNode = this;
rlink.descriptionBitmap = linkDescriptionBitmap; // default for no transfer-nodes
rlink = new OsmLink();
rlink.targetNode = this;
rlink.counterLinkWritten = !counterLinkWritten;
rlink.state = 2;
link.targetNode.addLink( rlink );
}
if ( !counterLinkWritten )
{
// we have the data for that link, so fill both the link ..
link.descriptionBitmap = description;
link.encodeFirsttransfer(firstTransferNode);
// .. and the reverse
if ( rlink.counterLinkWritten )
{
rlink.descriptionBitmap = description; // default for no transfer-nodes
OsmTransferNode previous = null;
OsmTransferNode rtrans = null;
for( OsmTransferNode trans = firstTransferNode; trans != null; trans = trans.next )
@ -275,17 +298,18 @@ public class OsmNode implements OsmPos
rtrans.ilat = trans.ilat;
rtrans.selev = trans.selev;
rtrans.next = previous;
rtrans.descriptionBitmap = linkDescriptionBitmap;
rtrans.descriptionBitmap = description;
previous = rtrans;
}
rlink.encodeFirsttransfer(rtrans);
rlink.next = firstreverse;
firstreverse = rlink;
}
}
}
hollowNodes.remove( getIdFromPos() );
if ( dc == null )
{
hollowNodes.remove( this );
}
}
public boolean isHollow()
@ -320,34 +344,20 @@ public class OsmNode implements OsmPos
}
}
public OsmLink getReverseLink( int lon, int lat )
{
for( OsmLink rlink = firstreverse; rlink != null; rlink = rlink.next )
{
if ( rlink.ilonOrigin == lon && rlink.ilatOrigin == lat )
{
unlinkRLink( rlink );
return rlink;
}
}
return null;
}
public void unlinkRLink( OsmLink rlink )
{
if ( rlink == firstreverse )
{
firstreverse = rlink.next;
return;
}
for( OsmLink l = firstreverse; l != null; l = l.next )
{
if ( l.next == rlink )
{
l.next = rlink.next;
return;
}
}
}
@Override
public boolean equals( Object o )
{
if ( o instanceof OsmNode )
{
OsmNode n = (OsmNode)o;
return n.ilon == ilon && n.ilat == ilat;
}
return false;
}
@Override
public int hashCode( )
{
return ilon + ilat;
}
}