# 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. Mar 23 '20 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.
Mar 23 '20 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. Mar 23 '20 at 18:46
• I think this question should have been asked on the GIS SE first. Mar 24 '20 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.
Mar 24 '20 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
Mar 25 '20 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]