# How to plot countries with accurate area?

Are there any projections that use the true size of countries, like this?

• Have a read of the documentation for GeoProjection and GeoProjectionData, and the tutorial for GeoGraphics at tutorial/GeoGraphics#175265542. There are many projections that will help you achieve whatever you're looking for. Commented Mar 23, 2020 at 17:42
• Yes, that is a nice tech note, I'm still not sure which projection is the most accurate interm of not distorting "true" sizes.
– M.R.
Commented Mar 23, 2020 at 18:16
• @M.R. I'm not sure which one is the "most accurate", but quite a few of the area preserving projections are supported. Commented Mar 23, 2020 at 18:46
• I think this question should have been asked on the GIS SE first. Commented Mar 24, 2020 at 1:30

The area-preserving projections are listed in GeoProjectionData["EqualArea"]. Most of these projections have formulas for the sphere only, but some of them, like "Albers" or "LambertAzimuthal" in WL 12.1 are prepared to handle the ellipsoidal case too, so those should be the most precise ones available.

For example, let us work with the polygon of the US:

pol = Entity["Country", "UnitedStates"]["Polygon"];


This is its area in square meters, found via GeoArea, which uses precise geodesic computations:

QuantityMagnitude[GeoArea[pol], "Meters"^2]
(* 7.93556*10^12 *)


Now project the polygon using the Albers projection on the "ITRF00" ellipsoid, which is the default ellipsoid used by GeoArea:

projpol = GeoGridPosition[pol, {"Albers", "ReferenceModel" -> "ITRF00"}];


In version 12.1 you can use Area directly on the projected polygon, which gives a result in square meters. Note how close it is. The difference is related to the fact that in the projected polygon the edges are straight lines, not geodesics:

Area[projpol]
(* 7.93544*10^12 *)


This uses a spherical approximation, with a sphere of mean radius (mean in the sense of (a+a+b)/3 for the semiaxes a,b of "ITRF00"):

radius = GeodesyData["ITRF00", "MeanRadius"]
(* Quantity[6.37101*10^6, "Meters"] *)

projpolsph = GeoGridPosition[pol, {"Albers", "ReferenceModel" -> radius}];


Now the result is close, but not so much as before:

Area[projpolsph]
(* 7.92844*10^12 *)


Compare with the GeoArea computation on the same sphere:

QuantityMagnitude[GeoArea[pol, GeoModel -> radius], "Meters"^2]
(* 7.92855*10^12 *)


Finally, note that one of the web examples for WL 12 did precisely what you show in your image above:

https://www.wolfram.com/language/12/new-in-geography/country-polygon-distortion-in-the-mercator-projection.html

• Thanks! Follow up: is there a way to interpolate between projections? Check out this link - which I was reading originally when I asked the question: visualcapitalist.com/mercator-map-true-size-of-countries
– M.R.
Commented Mar 24, 2020 at 17:04
• We don't have a built-in way of interpolating between two projections, but it can be done manually, by interpolating between the first arguments of the GeoGridPosition objects with two different projections. The important thing is to make sure that both projections have the same "ReferenceModel" value, so that scales are consistent.
– jose
Commented Mar 25, 2020 at 1:40

Perhaps you can extract the boundary of each country from an equal-area projection, such as this:

GeoGraphics[{}, GeoRange -> "World", GeoProjection -> "Hammer",
GeoGridLines -> Automatic]


and re-plot each country centered on its associated location determined by the countries in this:

GeoGraphics[{}, GeoRange -> "World", GeoGridLines -> Automatic]