10

I have two polygon layers, 'model' and 'ntem', whose features overlap and intersect one another.

I would like to calculate the proportion of the area of the 'model' polygons which fit within each 'ntem' polygon. Some 'model' features fully fit within 'ntem' features, others overlap multiple 'ntem' features. Both layers are in CRS OSGB:1936.

model layer

ntem layer

both layers

For example, 'model' feature 50209 falls partly in each of the three 'ntem' features 2202, 2205, 2206 and I'd eventually like to know the proportion of 50209's area in each 'ntem' area.

From initial research, I understand that the Vector > Geoprocessing Tools > Intersect function should do what I want, however I get a completely blank layer of results when I attempt this. (shapefile is created, empty attribute table, no features!)

Can anyone either point out if I am doing something wrong and suggest an alternative method of achieving the area proportion calculation?

2
  • Please, do not forget about "What should I do when someone answers my question?"
    – Taras
    Commented Oct 26, 2021 at 12:07
  • Since your approach unexpectedly generated zero output records, there is the possibility that one or both of your input layers contains geometry errors. Suspect data such as yours can be easily and quickly cleaned with the Fix Geometries tool.
    – Stu Smith
    Commented Oct 26, 2021 at 14:17

2 Answers 2

11

Take your model layer and in the attribute table, add a new field called area_mod for example.

Note that there are two ways to generate area:

  • $area is an ellipsoid based calculation using not just the area units but also factors in the projects spatial reference system (SRS) ellipsoid
  • area($geometry) is planimetric where is uses only the area units of the projects SRS

Next run the union tool found in the top menu by going to Vector > Geoprocessing Tools > Union...

Where your Input Layer could be set to ntem and the Overlay layer set to model.

  • Note that the order of the inputs in the union model don't change the result, but only the order of the fields in the attribute table for the resulting union'd layer

Consider saving to a file or other format, instead of [Create temporary layer].


Now you have a new layer in your layer list where you can open the attribute table, enter edit mode and calculate the percentage of overlap compared to the entire area of the model layer.

For example, create a new field in this new union'd layer called area_pct. Then use something like:

($area/"area_mod") * 100

Note that in this case, I used $area to derive area, but in your case be sure to remain consistent and use the same method you used to generate the area in the first step.


You'll have attributes from both inputs used for the union. You'll want to look for the field in the new union'd layer that has a value for your ntem layer - a unique identifier of some sort. Where this value is blank, those are areas from the model layer that fall outside the ntem layer.

3
  • Nice answer. I was actually wondering, how would you describe the delta between area($geometry) and $area? Is it about technology or methodology?
    – Taras
    Commented May 7, 2019 at 5:55
  • 2
    $area returns the area of the polygon considering the ellipsoid, while area($geometry) generates the planimetric area, that is, only considering the coordinates. For small surfaces you could use area($geometry) but for large areas (in your case) it is recommended to use $area.
    – Luis Perez
    Commented Oct 26, 2021 at 12:17
  • What is the difference between a small area and a large area? In other words, at what map scale should a person use switch over from area($geometry) to $area?
    – Stu Smith
    Commented Oct 26, 2021 at 14:08
8

The tool you are looking for is Vector > Geoprocessing Tools > Union. This cuts the input polygon into pieces. Then you can calculate the percentage of individual pieces as area of given piece divided by area of original unit (best to add as attribute beforehand, it will be preserved during Union).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.