Are there any projections that use the true size of countries, like this?
2 Answers
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:
-
$\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, 2020 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$– joseMar 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]
GeoProjection
andGeoProjectionData
, and the tutorial forGeoGraphics
at tutorial/GeoGraphics#175265542. There are many projections that will help you achieve whatever you're looking for. $\endgroup$