20#include <QRandomGenerator> 
   30  return QObject::tr( 
"Natural Breaks (Jenks)" );
 
 
   35  return QStringLiteral( 
"Jenks" );
 
 
   40  auto c = std::make_unique< QgsClassificationJenks >();
 
 
   51QList<double> QgsClassificationJenks::calculateBreaks( 
double &minimum, 
double &maximum,
 
   52    const QList<double> &values, 
int nclasses, QString &error )
 
   65  if ( values.isEmpty() )
 
   66    return QList<double>();
 
   70    return QList<double>() <<  maximum;
 
   73  if ( nclasses >= values.size() )
 
   78  QVector<double> sample;
 
   79  QVector<double> sorted;
 
   82  if ( values.size() > mMaximumSize )
 
   88    sample.resize( std::max( mMaximumSize, 
static_cast<int>( values.size() ) / 10 ) );
 
   90    QgsDebugMsgLevel( QStringLiteral( 
"natural breaks (jenks) sample size: %1" ).arg( sample.size() ), 2 );
 
   93    sample[ 0 ] = minimum;
 
   94    sample[ 1 ] = maximum;
 
   96    sorted = values.toVector();
 
   97    std::sort( sorted.begin(), sorted.end() );
 
  105    for ( 
int i = 1; i < sorted.size() - 2; i++ )
 
  107      if ( ( i * ( mMaximumSize - 2 ) / ( sorted.size() - 2 ) ) > j )
 
  110        sample[ j + 2 ] = sorted[ i ];
 
  116    sample = values.toVector();
 
  119  const int n = sample.size();
 
  122  std::sort( sample.begin(), sample.end() );
 
  124  QVector< QVector<int> > matrixOne( n + 1 );
 
  125  QVector< QVector<double> > matrixTwo( n + 1 );
 
  127  for ( 
int i = 0; i <= n; i++ )
 
  129    matrixOne[i].resize( nclasses + 1 );
 
  130    matrixTwo[i].resize( nclasses + 1 );
 
  133  for ( 
int i = 1; i <= nclasses; i++ )
 
  137    matrixTwo[0][i] = 0.0;
 
  138    for ( 
int j = 2; j <= n; j++ )
 
  140      matrixTwo[j][i] = std::numeric_limits<double>::max();
 
  144  for ( 
int l = 2; l <= n; l++ )
 
  152    for ( 
int m = 1; m <= l; m++ )
 
  154      const int i3 = l - m + 1;
 
  156      const double val = sample[ i3 - 1 ];
 
  162      v = s2 - ( s1 * s1 ) / 
static_cast< double >( w );
 
  163      const int i4 = i3 - 1;
 
  166        for ( 
int j = 2; j <= nclasses; j++ )
 
  168          if ( matrixTwo[l][j] >= v + matrixTwo[i4][j - 1] )
 
  170            matrixOne[l][j] = i4;
 
  171            matrixTwo[l][j] = v + matrixTwo[i4][j - 1];
 
  180  QVector<double> breaks( nclasses );
 
  181  breaks[nclasses - 1] = sample[n - 1];
 
  183  for ( 
int j = nclasses, k = n; j >= 2; j-- )
 
  185    const int id = matrixOne[k][j] - 1;
 
  186    breaks[j - 2] = sample[
id];
 
  187    k = matrixOne[k][j] - 1;
 
  190  return breaks.toList();
 
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
 
QIcon icon() const override
The icon of the method.
 
QString name() const override
The readable and translate name of the method.
 
std::unique_ptr< QgsClassificationMethod > clone() const override
Returns a clone of the method.
 
QString id() const override
The id of the method as saved in the project, must be unique in registry.
 
An abstract class for implementations of classification methods.
 
void copyBase(QgsClassificationMethod *c) const
Copy the parameters (shall be used in clone implementation)
 
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
 
#define QgsDebugMsgLevel(str, level)