11

My data: 1 polygon layer + 1 point layer
My target: Calculate the number of points and the sum of a field within each polygon using the aggregate function in the QGIS field calculator.

I know I can simply use the QGIS functions "Join attributes by location (summary)" or "Count points in polygon" but I'm interested in the aggregate function in the field calculator since I don´t understand exactly its meaning.

Using

aggregate('hh', 'sum', "sum_pop")

'hh' - the name of the point layer
'sum_pop' - the name of the attribute field from the hh layer (sum of the population of a point)

I get the sum of the whole field in the attribute table, so each feature has the same value.

aggregate_result_nok

How can I change the code for the aggregate function to calculate the sum of a value based on the number of points in each polygon feature and the number of features within a polygon so I get different values for each polygon?

example1

ecample2

evaluation error

Taras
  • 32,823
  • 4
  • 66
  • 137
Mapos
  • 567
  • 4
  • 12
  • 1
    You need to add a group_by parameter. Does the point layer have a polygon_ID field that tells you which polygon each point belongs to? If so, use "polygon_ID" as the group_by parameter. – csk Jul 29 '19 at 17:54
  • @csk The point layer does not have a field with the polygon affiliation. But using the function Join attributes by location this field can be generated. – Mapos Jul 30 '19 at 09:03

2 Answers2

12

This expression will count the number of populated places for each country:

aggregate(layer:='ne_110m_populated_places',
          aggregate:='count',
          expression:=name,
          filter:=contains(geometry(@parent), $geometry)
          )

you can use the same expression to get the sum, just change the aggregate to 'sum' and the expression to the field name to summarize.

Taras
  • 32,823
  • 4
  • 66
  • 137
eurojam
  • 10,762
  • 1
  • 13
  • 27
  • Thank you for your quick response. For point counts the expression functions well (the expression parameter as string needs to be in parentheses). Although I don´t exactly understand the meaning of this expression parameter (in this case "sub expression") since I can write there whatever I want but ok. For 'sum' I just get NULL values (changing the expression parameter to "pop_sum" as the field name) or an error (see above). pop_sum field is integer. – Mapos Jul 30 '19 at 09:16
  • aggregate(layer:= 'hh', aggregate:= 'sum', expression:= 'sum_pop_in', filter:= contains(geometry(@parent), $geometry)) – Mapos Jul 30 '19 at 09:16
  • 1
    the expression should be without any quotation marks: expression:= sum_pop_in – eurojam Jul 30 '19 at 17:38
8

Since QGIS 3.16 (see the Changelog) there is also a possibility using the overlay_contains() function

With the following expression, it is possible to count the number of features within another feature (see example below)

array_length(overlay_contains('random_points_test', expression:=1))

example

Taras
  • 32,823
  • 4
  • 66
  • 137