26 void QgsPointsInPolygonAlgorithm::initParameters( 
const QVariantMap &configuration )
 
   28   mIsInPlace = configuration.value( QStringLiteral( 
"IN_PLACE" ) ).toBool();
 
   39                   QObject::tr( 
"Count field" ), QStringLiteral( 
"NUMPOINTS" ), inputParameterName() ) );
 
   44                   QObject::tr( 
"Count field name" ), QStringLiteral( 
"NUMPOINTS" ) ) );
 
   48 QString QgsPointsInPolygonAlgorithm::name()
 const 
   50   return QStringLiteral( 
"countpointsinpolygon" );
 
   53 QString QgsPointsInPolygonAlgorithm::displayName()
 const 
   55   return QObject::tr( 
"Count points in polygon" );
 
   58 QStringList QgsPointsInPolygonAlgorithm::tags()
 const 
   60   return QObject::tr( 
"extract,filter,intersects,intersecting,disjoint,touching,within,contains,overlaps,relation" ).split( 
',' );
 
   63 QString QgsPointsInPolygonAlgorithm::svgIconPath()
 const 
   68 QIcon QgsPointsInPolygonAlgorithm::icon()
 const 
   73 QString QgsPointsInPolygonAlgorithm::group()
 const 
   75   return QObject::tr( 
"Vector analysis" );
 
   78 QString QgsPointsInPolygonAlgorithm::groupId()
 const 
   80   return QStringLiteral( 
"vectoranalysis" );
 
   83 QString QgsPointsInPolygonAlgorithm::shortHelpString()
 const 
   85   return QObject::tr( 
"This algorithm takes a points layer and a polygon layer and counts the number of points from " 
   86                       "the first one in each polygons of the second one.\n\n" 
   87                       "A new polygons layer is generated, with the exact same content as the input polygons layer, but " 
   88                       "containing an additional field with the points count corresponding to each polygon.\n\n" 
   89                       "An optional weight field can be used to assign weights to each point. If set, the count generated " 
   90                       "will be the sum of the weight field for each point contained by the polygon.\n\n" 
   91                       "Alternatively, a unique class field can be specified. If set, points are classified based on " 
   92                       "the selected attribute, and if several points with the same attribute value are within the polygon, " 
   93                       "only one of them is counted. The final count of the point in a polygon is, therefore, the count of " 
   94                       "different classes that are found in it.\n\n" 
   95                       "Both the weight field and unique class field cannot be specified. If they are, the weight field will " 
   96                       "take precedence and the unique class field will be ignored." );
 
   99 QString QgsPointsInPolygonAlgorithm::shortDescription()
 const 
  101   return QObject::tr( 
"Counts point features located within polygon features." );
 
  104 QgsPointsInPolygonAlgorithm *QgsPointsInPolygonAlgorithm::createInstance()
 const 
  106   return new QgsPointsInPolygonAlgorithm();
 
  109 QList<int> QgsPointsInPolygonAlgorithm::inputLayerTypes()
 const 
  125 QString QgsPointsInPolygonAlgorithm::inputParameterName()
 const 
  127   return QStringLiteral( 
"POLYGONS" );
 
  130 QString QgsPointsInPolygonAlgorithm::inputParameterDescription()
 const 
  132   return QObject::tr( 
"Polygons" );
 
  135 QString QgsPointsInPolygonAlgorithm::outputName()
 const 
  137   return QObject::tr( 
"Count" );
 
  142   mFieldName = parameterAsString( parameters, QStringLiteral( 
"FIELD" ), context );
 
  143   mWeightFieldName = parameterAsString( parameters, QStringLiteral( 
"WEIGHT" ), context );
 
  144   mClassFieldName = parameterAsString( parameters, QStringLiteral( 
"CLASSFIELD" ), context );
 
  145   mPointSource.reset( parameterAsSource( parameters, QStringLiteral( 
"POINTS" ), context ) );
 
  149   if ( !mWeightFieldName.isEmpty() )
 
  151     mWeightFieldIndex = mPointSource->fields().lookupField( mWeightFieldName );
 
  152     if ( mWeightFieldIndex == -1 )
 
  154     mPointAttributes.append( mWeightFieldIndex );
 
  157   if ( !mClassFieldName.isEmpty() )
 
  159     mClassFieldIndex = mPointSource->fields().lookupField( mClassFieldName );
 
  160     if ( mClassFieldIndex == -1 )
 
  162     mPointAttributes.append( mClassFieldIndex );
 
  166     feedback->
pushWarning( QObject::tr( 
"No spatial index exists for points layer, performance will be severely degraded" ) );
 
  177     if ( mDestFieldIndex < 0 )
 
  180       attrs[mDestFieldIndex] = 0;
 
  182     return QList< QgsFeature > () << outputFeature;
 
  188     engine->prepareGeometry();
 
  191     QSet< QVariant> classes;
 
  206         if ( mWeightFieldIndex >= 0 )
 
  208           const QVariant weight = pointFeature.
attribute( mWeightFieldIndex );
 
  209           double pointWeight = weight.toDouble( &ok );
 
  212             count += pointWeight;
 
  214             feedback->
reportError( QObject::tr( 
"Weight field value “%1” is not a numeric value" ).arg( weight.toString() ) );
 
  216         else if ( mClassFieldIndex >= 0 )
 
  218           const QVariant pointClass = pointFeature.
attribute( mClassFieldIndex );
 
  219           classes.insert( pointClass );
 
  231     if ( mClassFieldIndex >= 0 )
 
  232       score = classes.size();
 
  236     if ( mDestFieldIndex < 0 )
 
  237       attrs.append( score );
 
  239       attrs[mDestFieldIndex] = score;
 
  242     return QList< QgsFeature >() << outputFeature;
 
  246 QgsFields QgsPointsInPolygonAlgorithm::outputFields( 
const QgsFields &inputFields )
 const 
  250     mDestFieldIndex = inputFields.
lookupField( mFieldName );
 
  256     mDestFieldIndex = inputFields.
lookupField( mFieldName );
 
  257     if ( mDestFieldIndex < 0 )
 
  265 bool QgsPointsInPolygonAlgorithm::supportInPlaceEdit( 
const QgsMapLayer *layer )
 const 
  267   if ( 
const QgsVectorLayer *vl = qobject_cast< const QgsVectorLayer * >( layer ) )
 
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
static QString iconPath(const QString &iconFile)
Returns path to the desired icon file.
This class represents a coordinate reference system (CRS).
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsFeatureRequest & setDestinationCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets the destination crs for feature's geometries.
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
@ SpatialIndexNotPresent
No spatial index exists for the source.
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.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
bool isCanceled() const SIP_HOLDGIL
Tells whether the operation has been canceled already.
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine representing the specified geometry.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
Base class for all map layer types.
Contains information about the context in which a processing algorithm is executed.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
virtual void pushWarning(const QString &warning)
Pushes a warning informational message from the algorithm.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
An input feature source (such as vector layers) parameter for processing algorithms.
A vector layer or feature source field parameter for processing algorithms.
A string parameter for processing algorithms.
SourceType
Data source types enum.
@ TypeVectorPolygon
Vector polygon layers.
@ TypeVectorPoint
Vector point layers.
Represents a vector layer which manages a vector based data sets.
QList< QgsFeature > QgsFeatureList
const QgsCoordinateReferenceSystem & outputCrs