Merge pull request #1509 from ahuarte47/Issue_10767

Fix bug #10767: Simplified rendering causing boxes to appear instead
This commit is contained in:
Martin Dobias 2014-09-26 13:11:40 +02:00
commit eaacb125c4

View File

@ -222,6 +222,9 @@ bool QgsMapToPixelSimplifier::simplifyWkbGeometry(
double* ptr = ( double* )targetWkb; double* ptr = ( double* )targetWkb;
map2pixelTol *= map2pixelTol; //-> Use mappixelTol for 'LengthSquare' calculations. map2pixelTol *= map2pixelTol; //-> Use mappixelTol for 'LengthSquare' calculations.
bool isaUngenerizableSegment;
bool hasUngenerizableSegments = false; //-> To avoid replace the simplified geometry by its BBOX when there are 'long' segments.
// Check whether the LinearRing is really closed. // Check whether the LinearRing is really closed.
if ( isaLinearRing ) if ( isaLinearRing )
{ {
@ -246,14 +249,21 @@ bool QgsMapToPixelSimplifier::simplifyWkbGeometry(
memcpy( &x, sourceWkb, sizeof( double ) ); sourceWkb += sizeOfDoubleX; memcpy( &x, sourceWkb, sizeof( double ) ); sourceWkb += sizeOfDoubleX;
memcpy( &y, sourceWkb, sizeof( double ) ); sourceWkb += sizeOfDoubleY; memcpy( &y, sourceWkb, sizeof( double ) ); sourceWkb += sizeOfDoubleY;
isaUngenerizableSegment = false;
if ( i == 0 || if ( i == 0 ||
!isGeneralizable || !isGeneralizable ||
calculateLengthSquared2D( x, y, lastX, lastY ) > map2pixelTol || ( isaUngenerizableSegment = ( calculateLengthSquared2D( x, y, lastX, lastY ) > map2pixelTol ) ) ||
( !isaLinearRing && ( i == 1 || i >= numPoints - 2 ) ) ) ( !isaLinearRing && ( i == 1 || i >= numPoints - 2 ) ) )
{ {
memcpy( ptr, &x, sizeof( double ) ); lastX = x; ptr++; memcpy( ptr, &x, sizeof( double ) ); lastX = x; ptr++;
memcpy( ptr, &y, sizeof( double ) ); lastY = y; ptr++; memcpy( ptr, &y, sizeof( double ) ); lastY = y; ptr++;
numTargetPoints++; numTargetPoints++;
if ( isaUngenerizableSegment && !hasUngenerizableSegments )
{
hasUngenerizableSegments = true;
}
} }
r.combineExtentWith( x, y ); r.combineExtentWith( x, y );
@ -261,7 +271,7 @@ bool QgsMapToPixelSimplifier::simplifyWkbGeometry(
targetWkb = wkb2 + 4; targetWkb = wkb2 + 4;
// Fix the topology of the geometry // Fix the topology of the geometry
if ( numTargetPoints <= ( isaLinearRing ? 2 : 1 ) ) if ( numTargetPoints <= ( isaLinearRing ? 2 : 1 ) && !hasUngenerizableSegments )
{ {
unsigned char* targetTempWkb = targetWkb; unsigned char* targetTempWkb = targetWkb;
int targetWkbTempSize = targetWkbSize; int targetWkbTempSize = targetWkbSize;