1

I have a dataset with polygons of administrative areas for the whole world (https://www.gadm.org/download_world.html). I want to have the area size of each polygon in square kilometers. I saved the GADM file with the CRS "EPSG:54032 - World_Azimuthal_Equidistant - Projected" and used the $area function in the Field Calculator so far. Doing it with "Vector -> Geometry Tools -> Add Geometry Attributes" results in the same outcomes. Even though the results seem to be relatively close to actual area sizes for some units (when comparing them e.g. with area size information from google or Wikipedia), they deviate alot for others.

Am I using the wrong projection or is there another way to calculate area size correctly?

I am using QGIS 3.4.

  • 2
    Why are you doing this? There are lots of lists of world country areas that will be much more accurate. – Ian Turton Jun 24 at 12:35
  • @Ian Turton: Are you aware where to find such data? Because I didn't so far. – philsch Jun 25 at 9:12
  • en.wikipedia.org/wiki/… from a cursuory google – Ian Turton Jun 25 at 9:28
  • well, yes. It is not hard to find area sizes of countries listed. For sub-division 2 administrative units I could not find such a list though. Sub-division 2 corresponds to counties in the U.S. e.g. – philsch Jun 25 at 9:33
  • 1
    in that case you need to use a local projection for that region. – Ian Turton Jun 25 at 10:14
6

First, you should be aware that an equidistant projection will not preserve the area of polygons (it preserves the distances along a set of straight lines). therefore you should use a projection of the "equal area" family (which does represent polygon with their undistorted area over their domain of application). Examples of such projections are sinusoidal (e.g. EPSG:6842) or cylindrical equal area (e.g. EPSG:9834).

In theory, the area of the polygons is computed according to the projection of the dataset. However, it seems that the QGIS3.4 field calculator uses the coordinate system of the datframe by default. The safest method therefore consist in stipulating your coordinate system when you compute the area of your polygon.

area(transform($geometry, 'EPSG:54032','EPSG:9834')) 

Remarks : 1) I don't know what you mean by "google results", but if you mean the Web Mercator projection of Google Earth it is not an equal area projection. 2) If you have a very large polygon with only a few vertices, you should densify it before running the projection.

2

I agree with radouxju. Because the projection you have chosen is meant to preserve distance and not area, you're getting dramatic exaggeration of areas the further out you go from the center point. Choosing an equal area CRS and being sure it's defined before you calculate the area should fix it.

If you prefer an azimuthal projection, you can use NAD 83 Lambert Azimuthal and see this for further reference: What is the proj4string of the Lambert azimuthal equal-area projection?

1

To get accurate area calculations, use a local CRS. Since you're making these calculations for the entire world, you'll need to use many hundreds of different local CRS's.

The most efficient way would be to add a "local_CRS" field, and enter the EPSG code of the best local CRS available for each area. Eg, for the USA, each state is covered by between one and four State Plane CRS's. That's a total of between 50 and 200 for the USA alone. Make sure all of your chosen CRS's have the same base units.

Then you can run the area calculation as explained by radouxju, but using the "local_CRS" field for the second transformation value. Assuming your CRS's use meters as their base units, convert from square meters to square kilometers by dividing by 1000000.

area(transform($geometry, 'EPSG:54032',concat('EPSG:',"local_CRS"))) / 1000000

As others have pointed out, these calculations have already been done by others. The challenge is finding the data, but it's still probably easier (not to mention less error-rone) to find pre-calculated information than to do this yourself. Try looking on Open Data Stackexchange to see if this data has already been shared. If not, post a new question.

  • a local CRS will provide the highest fidelity if you look at all properties of the projected polygons (distance, area, azimuth and angles), but local CRS are nevertheless specialized for a single feature (e.g. they will be conformal OR equal-area OR equidistant ). Because they are local, the distortions of the features that are not the main feature will be usually very small. However, a local conformal projection will be inaccurate for the areas (of course you will not notice it if you work in square kilometers, because the error will usually be very small). – radouxju Jun 26 at 6:59
  • Thanks for all the help! One question regarding the "local_CRS" field: Is there some automated way, e.g. using Python code, to loop over local CRS? Thus, can you tell QGIS to automatically do this calculation with the respective local CRS? – philsch Jun 27 at 12:28
  • Nope. You have to use your own judgement to choose the best local CRS. Refer to radouju's comment for additional considerations. Another approach is to do the entire calculation at once in a worldwide "equal area" CRS. Compute the margin of error compared to some known areas (be sure to look at the error for features at a variety of different latitudes), and decide if that margin or error is acceptable to you. – csk Jun 27 at 16:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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