# Calculate the percentage of a polygon either side of a line

I have a series of polygons outlining distributions of various fish species around Australia. I am relatively new to GIS.

I am trying to class each species as either tropical or temperate based on the percentage of their distribution above a specified latitude.

I have calculated the area of each polygon as a whole, but need to calculate the area of each polygon above a specified latitude (say, tropic of Capricorn), as to determine a percentage above the latitude.

• Make a line at the latitude of interest, then split the polygon by that line, then do basic maths with full and partial areas.
– Erik
Aug 5, 2022 at 8:11

You can use QGIS expressions to directly calculate the area above a certain latitude in one step without any further geoprocessing. Simply create that part of the polygon that lies north of your latitude, than calculate its area. See below for the expression to use.

To get the part of the polygon above a certain latitude, create a polygon based on this latitude from 180 degrees east to 180 degrees west and up to the north pole (red area in the screenshot), then get the intersection of this with your polygons to get the blue area.

Be aware: For correct area calculations, use an appropriate CRS! I used a world equal area CRS for the layer, code: `ESRI:54034`.

The expression calculates the area in blue: that part of each polygon that is above a certain latitude (=intersects the red area) - here north of 10 degrees south. Use this expression to calculate the part of each polygon north of a certain latitude. The latitude can be freely defined in line 3 (here: -10 = 10 degrees south). On the 5th last line, replace `ESRI:54034` by the code of the CRS of your layer. You might use the variable `@layer_crs`, then you don't have to care about what CRS is used. However, this works only for EPSG-codes (e.g. when using `EPSG:6933`) - this projection here, however, has an ESRI code.

``````area (
with_variable(
'lat',
-10,  -- change this value to match your needs
intersection (
\$geometry,
transform (
make_polygon (
make_line (
make_point (-180, @lat) ,
make_point (180, @lat),
make_point (180, 90),
make_point (-180,90)
)
),
'EPSG:4326',
'ESRI:54034'  -- change this to the CRS of your layer
)
)
)
)
``````

You may be using the line for display purposes, but for analytical work, things are much easier to handle if you make a cover with polygons covering the different classes. Then you can do an intersection between the layers. This will give you a new cover with attributes from both layers.

When making this kind of covers for analysis, you will of cource make sure that the line dividing your areas of interest are accurate, but for the rest of the polygons, you only need to make sure that they are covering the entire fish distribution cover. Also make sure that both covers have the same CRS.