29  : mSimplifyFlags( simplifyFlags )
 
   30  , mSimplifyAlgorithm( simplifyAlgorithm )
 
   31  , mTolerance( tolerance )
 
 
   40  const float vx = 
static_cast< float >( x2 - x1 );
 
   41  const float vy = 
static_cast< float >( y2 - y1 );
 
   43  return ( vx * vx ) + ( vy * vy );
 
 
   48  const int grid_x1 = std::round( ( x1 - gridOriginX ) * gridInverseSizeXY );
 
   49  const int grid_x2 = std::round( ( x2 - gridOriginX ) * gridInverseSizeXY );
 
   50  if ( grid_x1 != grid_x2 ) 
return false;
 
   52  const int grid_y1 = std::round( ( y1 - gridOriginY ) * gridInverseSizeXY );
 
   53  const int grid_y2 = std::round( ( y2 - gridOriginY ) * gridInverseSizeXY );
 
   54  return grid_y1 == grid_y2;
 
 
   64#include "simplify/effectivearea.h" 
   69static std::unique_ptr< QgsAbstractGeometry > generalizeWkbGeometryByBoundingBox(
 
   82    return std::unique_ptr< QgsAbstractGeometry >( geometry.
clone() );
 
   85  const double x1 = envelope.
xMinimum();
 
   86  const double y1 = envelope.
yMinimum();
 
   87  const double x2 = envelope.
xMaximum();
 
   88  const double y2 = envelope.
yMaximum();
 
   93    return std::make_unique< QgsLineString >( QVector<double>() << x1 << x2, QVector<double>() << y1 << y2 );
 
   97    auto ext = std::make_unique< QgsLineString >(
 
   98                 QVector< double >() << x1
 
  103                 QVector< double >() << y1
 
  109      return std::move( ext );
 
  112      auto polygon = std::make_unique< QgsPolygon >();
 
  113      polygon->setExteriorRing( ext.release() );
 
  114      return std::move( polygon );
 
  119std::unique_ptr< QgsAbstractGeometry > QgsMapToPixelSimplifier::simplifyGeometry( 
int simplifyFlags,
 
  124  bool isGeneralizable = 
true;
 
  132    return generalizeWkbGeometryByBoundingBox( wkbType, geometry, envelope, isaLinearRing );
 
  136    isGeneralizable = 
false;
 
  144    const int numPoints = srcCurve.
numPoints();
 
  146    std::unique_ptr<QgsCurve> output;
 
  148    QVector< double > lineStringX;
 
  149    QVector< double > lineStringY;
 
  150    QVector< double > lineStringZ;
 
  151    QVector< double > lineStringM;
 
  156      lineStringX.reserve( numPoints );
 
  157      lineStringY.reserve( numPoints );
 
  159      if ( geometry.
is3D() )
 
  160        lineStringZ.reserve( numPoints );
 
  163        lineStringM.reserve( numPoints );
 
  170    double x = 0.0, y = 0.0, z = 0.0, m = 0.0, lastX = 0.0, lastY = 0.0;
 
  172    if ( numPoints <= ( isaLinearRing ? 4 : 2 ) )
 
  173      isGeneralizable = false;
 
  176    bool hasLongSegments = 
false; 
 
  177    const bool is3D = geometry.
is3D();
 
  178    const bool isMeasure = geometry.
isMeasure();
 
  192        const double gridOriginX = envelope.
xMinimum();
 
  193        const double gridOriginY = envelope.
yMinimum();
 
  196        const float gridInverseSizeXY = map2pixelTol != 0 ? ( float )( 1.0f / ( 0.8 * map2pixelTol ) ) : 0.0f;
 
  198        const double *xData = 
nullptr;
 
  199        const double *yData = 
nullptr;
 
  200        const double *zData = 
nullptr;
 
  201        const double *mData = 
nullptr;
 
  204          xData = qgsgeometry_cast< const QgsLineString * >( &srcCurve )->xData();
 
  205          yData = qgsgeometry_cast< const QgsLineString * >( &srcCurve )->yData();
 
  208            zData = qgsgeometry_cast< const QgsLineString * >( &srcCurve )->zData();
 
  211            mData = qgsgeometry_cast< const QgsLineString * >( &srcCurve )->mData();
 
  214        for ( 
int i = 0; i < numPoints; ++i )
 
  216          if ( xData && yData )
 
  223            x = srcCurve.
xAt( i );
 
  224            y = srcCurve.
yAt( i );
 
  228            z = zData ? *zData++ : srcCurve.
zAt( i );
 
  231            m = mData ? *mData++ : srcCurve.
mAt( i );
 
  235               !
equalSnapToGrid( x, y, lastX, lastY, gridOriginX, gridOriginY, gridInverseSizeXY ) ||
 
  236               ( !isaLinearRing && ( i == 1 || i >= numPoints - 2 ) ) )
 
  242              lineStringX.append( x );
 
  243              lineStringY.append( y );
 
  246                lineStringZ.append( z );
 
  249                lineStringM.append( m );
 
  260        output.reset( qgsgeometry_cast< QgsCurve * >( srcCurve.
snappedToGrid( map2pixelTol, map2pixelTol ) ) );
 
  266        map2pixelTol *= map2pixelTol; 
 
  268        EFFECTIVE_AREAS ea( srcCurve );
 
  270        const int set_area = 0;
 
  271        ptarray_calc_areas( &ea, isaLinearRing ? 4 : 2, set_area, map2pixelTol );
 
  273        for ( 
int i = 0; i < numPoints; ++i )
 
  275          if ( ea.res_arealist[ i ] > map2pixelTol )
 
  278              output->insertVertex( 
QgsVertexId( 0, 0, output->numPoints() ), ea.inpts.at( i ) );
 
  281              lineStringX.append( ea.inpts.at( i ).x() );
 
  282              lineStringY.append( ea.inpts.at( i ).y() );
 
  285                lineStringZ.append( ea.inpts.at( i ).z() );
 
  288                lineStringM.append( ea.inpts.at( i ).m() );
 
  297        map2pixelTol *= map2pixelTol; 
 
  299        const double *xData = 
nullptr;
 
  300        const double *yData = 
nullptr;
 
  303          xData = qgsgeometry_cast< const QgsLineString * >( &srcCurve )->xData();
 
  304          yData = qgsgeometry_cast< const QgsLineString * >( &srcCurve )->yData();
 
  307        for ( 
int i = 0; i < numPoints; ++i )
 
  309          if ( xData && yData )
 
  316            x = srcCurve.
xAt( i );
 
  317            y = srcCurve.
yAt( i );
 
  320          isLongSegment = 
false;
 
  325               ( !isaLinearRing && ( i == 1 || i >= numPoints - 2 ) ) )
 
  331              lineStringX.append( x );
 
  332              lineStringY.append( y );
 
  337            hasLongSegments |= isLongSegment;
 
  345      output = std::make_unique< QgsLineString >( lineStringX, lineStringY, lineStringZ, lineStringM );
 
  347    if ( output->numPoints() < ( isaLinearRing ? 4 : 2 ) )
 
  350      if ( !hasLongSegments )
 
  354        return generalizeWkbGeometryByBoundingBox( wkbType, geometry, envelope, isaLinearRing );
 
  361        return std::unique_ptr< QgsAbstractGeometry >( geometry.
clone() );
 
  370        output->insertVertex( 
QgsVertexId( 0, 0, output->numPoints() ), 
QgsPoint( output->xAt( 0 ), output->yAt( 0 ) ) );
 
  374    return std::move( output );
 
  379    auto polygon = std::make_unique<QgsPolygon>();
 
  381    polygon->setExteriorRing( qgsgeometry_cast<QgsCurve *>( extRing.release() ) );
 
  386      polygon->addInteriorRing( qgsgeometry_cast<QgsCurve *>( ring.release() ) );
 
  388    return std::move( polygon );
 
  395    collection->reserve( numGeoms );
 
  396    for ( 
int i = 0; i < numGeoms; ++i )
 
  400      collection->addGeometry( part.release() );
 
  402    return std::move( collection );
 
  404  return std::unique_ptr< QgsAbstractGeometry >( geometry.
clone() );
 
  412  return envelope.
width() < map2pixelTol && envelope.
height() < map2pixelTol;
 
 
  437  if ( numPoints <= ( isaLinearRing ? 6 : 3 ) )
 
 
  481  if ( numPoints <= ( isaLinearRing ? 6 : 3 ) )
 
 
VectorSimplificationAlgorithm
Simplification algorithms for vector features.
 
@ Distance
The simplification uses the distance between points to remove duplicate points.
 
@ SnappedToGridGlobal
Snap to a global grid based on the tolerance. Good for consistent results for incoming vertices,...
 
@ SnapToGrid
The simplification uses a grid (similar to ST_SnapToGrid) to remove duplicate points.
 
@ Visvalingam
The simplification gives each point in a line an importance weighting, so that least important points...
 
WkbType
The WKB type describes the number of dimensions a geometry has.
 
@ CircularString
CircularString.
 
Abstract base class for all geometries.
 
virtual QgsAbstractGeometry * snappedToGrid(double hSpacing, double vSpacing, double dSpacing=0, double mSpacing=0, bool removeRedundantPoints=false) const =0
Makes a new geometry with all the points or vertices snapped to the closest point of the grid.
 
bool isMeasure() const
Returns true if the geometry contains m values.
 
virtual QgsRectangle boundingBox() const
Returns the minimal bounding box for the geometry.
 
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
 
virtual QgsAbstractGeometry * createEmptyWithSameType() const =0
Creates a new geometry with the same class and same WKB type as the original and transfers ownership.
 
virtual int nCoordinates() const
Returns the number of nodes contained in the geometry.
 
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
 
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
 
int numInteriorRings() const
Returns the number of interior rings contained with the curve polygon.
 
const QgsCurve * exteriorRing() const
Returns the curve polygon's exterior ring.
 
const QgsCurve * interiorRing(int i) const
Retrieves an interior ring from the curve polygon.
 
Abstract base class for curved geometry type.
 
virtual int numPoints() const =0
Returns the number of points in the curve.
 
virtual double xAt(int index) const =0
Returns the x-coordinate of the specified node in the line string.
 
virtual double zAt(int index) const =0
Returns the z-coordinate of the specified node in the line string.
 
virtual double mAt(int index) const =0
Returns the m-coordinate of the specified node in the line string.
 
virtual double yAt(int index) const =0
Returns the y-coordinate of the specified node in the line string.
 
QgsGeometryCollection * createEmptyWithSameType() const override
Creates a new geometry with the same class and same WKB type as the original and transfers ownership.
 
int numGeometries() const
Returns the number of geometries within the collection.
 
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
 
A geometry is the spatial representation of a feature.
 
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
 
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
 
Qgis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
 
double mTolerance
Distance tolerance for the simplification.
 
static float calculateLengthSquared2D(double x1, double y1, double x2, double y2)
Returns the squared 2D-distance of the vector defined by the two points specified.
 
static bool isGeneralizableByMapBoundingBox(const QgsRectangle &envelope, double map2pixelTol)
Returns whether the envelope can be replaced by its BBOX when is applied the specified map2pixel cont...
 
int simplifyFlags() const
Gets the simplification hints of the vector layer managed.
 
Qgis::VectorSimplificationAlgorithm mSimplifyAlgorithm
Current algorithm.
 
@ NoFlags
No simplification can be applied.
 
@ SimplifyEnvelope
The geometries can be fully simplified by its BoundingBox.
 
@ SimplifyGeometry
The geometries can be simplified using the current map2pixel context state.
 
int mSimplifyFlags
Current simplification flags.
 
static bool equalSnapToGrid(double x1, double y1, double x2, double y2, double gridOriginX, double gridOriginY, float gridInverseSizeXY)
Returns whether the points belong to the same grid.
 
QgsGeometry simplify(const QgsGeometry &geometry) const override
Returns a simplified version the specified geometry.
 
Qgis::VectorSimplificationAlgorithm simplifyAlgorithm() const
Gets the local simplification algorithm of the vector layer managed.
 
QgsMapToPixelSimplifier(int simplifyFlags, double tolerance, Qgis::VectorSimplificationAlgorithm simplifyAlgorithm=Qgis::VectorSimplificationAlgorithm::Distance)
Constructor.
 
Point geometry type, with support for z-dimension and m-values.
 
A rectangle specified with double values.
 
static bool isMultiType(Qgis::WkbType type)
Returns true if the WKB type is a multi type.
 
static Qgis::WkbType singleType(Qgis::WkbType type)
Returns the single type for a WKB type.
 
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
Utility class for identifying a unique vertex within a geometry.