fixed duplicate target problems
This commit is contained in:
parent
11871ee4d7
commit
27a4c65e11
2 changed files with 55 additions and 0 deletions
|
@ -7,6 +7,7 @@ package btools.mapcreator;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
import btools.codec.MicroCache;
|
import btools.codec.MicroCache;
|
||||||
import btools.codec.MicroCache1;
|
import btools.codec.MicroCache1;
|
||||||
|
@ -263,6 +264,52 @@ public class OsmNodeP extends OsmLinkP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void checkDuplicateTargets()
|
||||||
|
{
|
||||||
|
HashMap<OsmNodeP,OsmLinkP> targets = new HashMap<OsmNodeP,OsmLinkP>();
|
||||||
|
|
||||||
|
for ( OsmLinkP link0 = getFirstLink(); link0 != null; link0 = link0.getNext( this ) )
|
||||||
|
{
|
||||||
|
OsmLinkP link = link0;
|
||||||
|
OsmNodeP origin = this;
|
||||||
|
OsmNodeP target = null;
|
||||||
|
|
||||||
|
// first pass just to see if that link is consistent
|
||||||
|
while (link != null)
|
||||||
|
{
|
||||||
|
target = link.getTarget( origin );
|
||||||
|
if ( !target.isTransferNode() )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// next link is the one (of two), does does'nt point back
|
||||||
|
for ( link = target.getFirstLink(); link != null; link = link.getNext( target ) )
|
||||||
|
{
|
||||||
|
if ( link.getTarget( target ) != origin )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
origin = target;
|
||||||
|
}
|
||||||
|
if ( link == null ) continue;
|
||||||
|
OsmLinkP oldLink = targets.put( target, link0 );
|
||||||
|
if ( oldLink != null )
|
||||||
|
{
|
||||||
|
unifyLink( oldLink );
|
||||||
|
unifyLink( link0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void unifyLink( OsmLinkP link )
|
||||||
|
{
|
||||||
|
if ( link.isReverse( this ) ) return;
|
||||||
|
OsmNodeP target = link.getTarget( this );
|
||||||
|
if ( target.isTransferNode() )
|
||||||
|
{
|
||||||
|
target.incWayCount();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean writeNodeData2( MicroCache2 mc ) throws IOException
|
public boolean writeNodeData2( MicroCache2 mc ) throws IOException
|
||||||
{
|
{
|
||||||
boolean hasLinks = false;
|
boolean hasLinks = false;
|
||||||
|
|
|
@ -247,6 +247,14 @@ public class WayLinker extends MapCreatorBase
|
||||||
int maxLon = minLon + 5000000;
|
int maxLon = minLon + 5000000;
|
||||||
int maxLat = minLat + 5000000;
|
int maxLat = minLat + 5000000;
|
||||||
|
|
||||||
|
// cleanup duplicate targets
|
||||||
|
for ( OsmNodeP n : nodesList )
|
||||||
|
{
|
||||||
|
if ( n == null || n.getFirstLink() == null || n.isTransferNode() )
|
||||||
|
continue;
|
||||||
|
n.checkDuplicateTargets();
|
||||||
|
}
|
||||||
|
|
||||||
// write segment data to individual files
|
// write segment data to individual files
|
||||||
{
|
{
|
||||||
int nLonSegs = ( maxLon - minLon ) / 1000000;
|
int nLonSegs = ( maxLon - minLon ) / 1000000;
|
||||||
|
|
Loading…
Reference in a new issue