28QString QgsRandomPointsExtentAlgorithm::name()
const
30 return QStringLiteral(
"randompointsinextent" );
33QString QgsRandomPointsExtentAlgorithm::displayName()
const
35 return QObject::tr(
"Random points in extent" );
38QStringList QgsRandomPointsExtentAlgorithm::tags()
const
40 return QObject::tr(
"random,points,extent,create" ).split(
',' );
43QString QgsRandomPointsExtentAlgorithm::group()
const
45 return QObject::tr(
"Vector creation" );
48QString QgsRandomPointsExtentAlgorithm::groupId()
const
50 return QStringLiteral(
"vectorcreation" );
53void QgsRandomPointsExtentAlgorithm::initAlgorithm(
const QVariantMap & )
57 addParameter(
new QgsProcessingParameterDistance( QStringLiteral(
"MIN_DISTANCE" ), QObject::tr(
"Minimum distance between points" ), 0, QStringLiteral(
"TARGET_CRS" ),
true, 0 ) );
58 addParameter(
new QgsProcessingParameterCrs( QStringLiteral(
"TARGET_CRS" ), QObject::tr(
"Target CRS" ), QStringLiteral(
"ProjectCrs" ),
false ) );
60 auto maxAttempts_param = std::make_unique<QgsProcessingParameterNumber>( QStringLiteral(
"MAX_ATTEMPTS" ), QObject::tr(
"Maximum number of search attempts given the minimum distance" ),
Qgis::ProcessingNumberParameterType::Integer, 200,
true, 1 );
62 addParameter( maxAttempts_param.release() );
67QString QgsRandomPointsExtentAlgorithm::shortHelpString()
const
69 return QObject::tr(
"This algorithm creates a new point layer with a given "
70 "number of random points, all of them within a given extent. "
71 "A distance factor can be specified, to avoid points being "
72 "too close to each other. If the minimum distance between points "
73 "makes it impossible to create new points, either "
74 "distance can be decreased or the maximum number of attempts may be "
79QString QgsRandomPointsExtentAlgorithm::shortDescription()
const
81 return QObject::tr(
"Creates a point layer with a given number of random points, all of them within a given extent." );
84QgsRandomPointsExtentAlgorithm *QgsRandomPointsExtentAlgorithm::createInstance()
const
86 return new QgsRandomPointsExtentAlgorithm();
91 mCrs = parameterAsCrs( parameters, QStringLiteral(
"TARGET_CRS" ), context );
92 mExtent = parameterAsExtent( parameters, QStringLiteral(
"EXTENT" ), context, mCrs );
93 mNumPoints = parameterAsInt( parameters, QStringLiteral(
"POINTS_NUMBER" ), context );
94 mDistance = parameterAsDouble( parameters, QStringLiteral(
"MIN_DISTANCE" ), context );
95 mMaxAttempts = parameterAsInt( parameters, QStringLiteral(
"MAX_ATTEMPTS" ), context );
103 fields.
append(
QgsField( QStringLiteral(
"id" ), QMetaType::Type::LongLong ) );
106 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, dest, fields,
Qgis::WkbType::Point, mCrs ) );
111 std::random_device random_device;
112 const std::mt19937 mersenne_twister( random_device() );
114 std::uniform_real_distribution<double> x_distribution( mExtent.xMinimum(), mExtent.xMaximum() );
115 std::uniform_real_distribution<double> y_distribution( mExtent.yMinimum(), mExtent.yMaximum() );
117 if ( mDistance == 0 )
120 while ( i < mNumPoints )
125 const double rx = x_distribution( random_device );
126 const double ry = y_distribution( random_device );
135 feedback->
setProgress(
static_cast<int>(
static_cast<double>( i ) /
static_cast<double>( mNumPoints ) * 100 ) );
141 int distCheckIterations = 0;
144 while ( i < mNumPoints )
149 const double rx = x_distribution( random_device );
150 const double ry = y_distribution( random_device );
154 if ( neighbors.empty() )
163 distCheckIterations = 0;
164 feedback->
setProgress(
static_cast<int>(
static_cast<double>( i ) /
static_cast<double>( mNumPoints ) * 100 ) );
168 if ( distCheckIterations == mMaxAttempts )
170 throw QgsProcessingException( QObject::tr(
"%1 of %2 points have been successfully created, but no more random points could be found "
171 "due to the given minimum distance between points. Either choose a larger extent, "
172 "lower the minimum distance between points or try increasing the number "
173 "of attempts for searching new points." )
175 .arg( mNumPoints ) );
179 distCheckIterations++;
189 outputs.insert( QStringLiteral(
"OUTPUT" ), dest );
@ VectorPoint
Vector point layers.
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
bool isCanceled() const
Tells whether the operation has been canceled already.
void setProgress(double progress)
Sets the current progress for the feedback object.
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
A geometry is the spatial representation of a feature.
Point geometry type, with support for z-dimension and m-values.
Contains information about the context in which a processing algorithm is executed.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
A coordinate reference system parameter for processing algorithms.
A double numeric parameter for distance values.
A rectangular map extent parameter for processing algorithms.
A feature sink output for processing algorithms.
A numeric parameter for processing algorithms.
A spatial index for QgsFeature objects.
QList< QgsFeatureId > nearestNeighbor(const QgsPointXY &point, int neighbors=1, double maxDistance=0) const
Returns nearest neighbors to a point.
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) override
Adds a feature to the index.