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

enter image description here

  • 2
    $\begingroup$ 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. $\endgroup$ – Carl Lange Mar 23 '20 at 17:42
  • 1
    $\begingroup$ Yes, that is a nice tech note, I'm still not sure which projection is the most accurate interm of not distorting "true" sizes. $\endgroup$ – M.R. Mar 23 '20 at 18:16
  • 1
    $\begingroup$ @M.R. I'm not sure which one is the "most accurate", but quite a few of the area preserving projections are supported. $\endgroup$ – rcollyer Mar 23 '20 at 18:46
  • 1
    $\begingroup$ I think this question should have been asked on the GIS SE first. $\endgroup$ – J. M.'s ennui 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:

(* 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:

(* 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:


  • $\begingroup$ 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 $\endgroup$ – M.R. Mar 24 '20 at 17:04
  • 1
    $\begingroup$ 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. $\endgroup$ – 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]

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.