Douglas-Peucker transfer-node elimination on pre-processor level

This commit is contained in:
Arndt Brenschede 2019-08-04 10:22:50 +02:00
parent aa7bb37a99
commit d2aaeb2988
3 changed files with 22 additions and 1 deletions

View file

@ -16,6 +16,25 @@ public class DPFilter
/* /*
* for each node (except first+last), eventually set the DP_SURVIVOR_BIT * for each node (except first+last), eventually set the DP_SURVIVOR_BIT
*/ */
public static void doDPFilter( ArrayList<OsmNodeP> nodes )
{
int first = 0;
int last = nodes.size()-1;
while( first < last && (nodes.get(first+1).bits & OsmNodeP.DP_SURVIVOR_BIT) != 0 )
{
first++;
}
while( first < last && (nodes.get(last-1).bits & OsmNodeP.DP_SURVIVOR_BIT) != 0 )
{
last--;
}
if ( last - first > 1 )
{
doDPFilter( nodes, first, last );
}
}
public static void doDPFilter( ArrayList<OsmNodeP> nodes, int first, int last ) public static void doDPFilter( ArrayList<OsmNodeP> nodes, int first, int last )
{ {
double maxSqDist = -1.; double maxSqDist = -1.;

View file

@ -252,7 +252,7 @@ public class OsmNodeP extends OsmLinkP
mc.writeModeAndDesc( isReverse, link0.descriptionBitmap ); mc.writeModeAndDesc( isReverse, link0.descriptionBitmap );
if ( !isReverse && linkNodes.size() > 2 ) // write geometry for forward links only if ( !isReverse && linkNodes.size() > 2 ) // write geometry for forward links only
{ {
DPFilter.doDPFilter( linkNodes, 0, linkNodes.size()-1 ); DPFilter.doDPFilter( linkNodes );
origin = this; origin = this;
for( int i=1; i<linkNodes.size()-1; i++ ) for( int i=1; i<linkNodes.size()-1; i++ )
{ {

View file

@ -237,6 +237,7 @@ public class WayLinker extends MapCreatorBase
{ {
r.fromLon = n1.ilon; r.fromLon = n1.ilon;
r.fromLat = n1.ilat; r.fromLat = n1.ilat;
n1.bits |= OsmNodeP.DP_SURVIVOR_BIT;
} }
} }
if ( r.toWid == wid ) if ( r.toWid == wid )
@ -245,6 +246,7 @@ public class WayLinker extends MapCreatorBase
{ {
r.toLon = n1.ilon; r.toLon = n1.ilon;
r.toLat = n1.ilat; r.toLat = n1.ilat;
n1.bits |= OsmNodeP.DP_SURVIVOR_BIT;
} }
} }
r = r.next; r = r.next;