How to count points within the current Print composer atlas feature in QGIS 2.8?
This works for me: use the
aggregate() expression in a text label, with
within($geometry,@atlas_geometry) as a filter for points within your atlas feature.
The full syntax in your text label would be
[% aggregate('LAYER_NAME','count',"UNIQUE_NON_NULL_ATTRIBUTE_FOR_COUNTING",within($geometry,@atlas_geometry)) %]
That will count all the points in your specified layer - by an unique non-null attribute, so each point is distinct - but only if the point geometry is within the atlas geometry.
The [% %] is required to make the expression work. And note the quotation marks - you must use double quotes for the attribute name.
As a bonus you can add further filters, so to address one of the comments above, you can modify the filter to say
within($geometry,@atlas_geometry) AND "village" = 'A', or whatever combination.
I haven't extensively tested this out, especially on large/complex datasets, but it seems to do the job.
You need to create a script counting point within the current atlas geometry.
In the expression function editor add this code:
from qgis.core import * from qgis.gui import * from qgis.utils import iface @qgsfunction(args="auto", group='Custom') def countPointsInCurrentAltlasFeature(pointLayerName, geomAtlas, feature, parent): # If point geom is empty, return 0 if (geomAtlas is None): return 0 # Get point layer reference from layername pointLayer = QgsMapLayerRegistry.instance().mapLayersByName(pointLayerName) # Raise if layer not found if pointLayer is None: raise Exception("Layer not found: " + pointLayerName) # Count point within current Atlas feature countPoint = 0 for pointFeature in pointLayer.getFeatures(): pointGeom = pointFeature.geometry() if (pointGeom is None): continue if pointGeom.within(geomAtlas): countPoint += 1 return countPoint
Use the new function as an expression for a Print Composer label like:
Villages in province: [% countPointsInCurrentAltlasFeature( 'Villages', $atlasgeometry)%]