Make projection selection flexible by reading directly from config

This commit is contained in:
Koen van Greevenbroek 2024-01-25 14:34:03 +01:00
parent 9aa154bd04
commit 03c914bef1
4 changed files with 14 additions and 22 deletions

View File

@ -773,7 +773,13 @@ plotting:
color_geomap:
ocean: white
land: white
projection: "EqualEarth"
projection:
name: "EqualEarth"
# See https://scitools.org.uk/cartopy/docs/latest/reference/projections.html for alternatives, for example:
# name: "LambertConformal"
# central_longitude: 10.
# central_latitude: 50.
# standard_parallels: [35, 65]
eu_node_location:
x: -5.5
y: 46.

View File

@ -1,7 +1,9 @@
,Unit,Values,Description
map,,,
-- boundaries,°,"[x1,x2,y1,y2]",Boundaries of the map plots in degrees latitude (y) and longitude (x)
projection,--,"{EqualEarth, EuroPP, LambertAzimuthalEqualArea, LambertConformal, Orthographic}",Projection to use for maps; default is EqualEarth. LambertConformal is recommended by the European Environmental Agency.
projection,,,,
-- name,--,"Valid Cartopy projection name","See https://scitools.org.uk/cartopy/docs/latest/reference/projections.html for list of available projections."
-- args,--,--,"Other entries under 'projection' are passed as keyword arguments to the projection constructor, e.g. ``central_longitude: 10.``."
costs_max,bn Euro,float,Upper y-axis limit in cost bar plots.
costs_threshold,bn Euro,float,Threshold below which technologies will not be shown in cost bar plots.
energy_max,TWh,float,Upper y-axis limit in energy bar plots.

Can't render this file because it has a wrong number of fields in line 4.

View File

@ -35,7 +35,7 @@ Upcoming Release
* Add support for the linopy ``io_api`` option; set to ``"direct"`` to increase model reading and writing performance for the highs and gurobi solvers.
* Add several map projection options for plotting.
* Add the option to customise map projection in plotting config.
PyPSA-Eur 0.9.0 (5th January 2024)

View File

@ -1081,25 +1081,9 @@ if __name__ == "__main__":
if map_opts["boundaries"] is None:
map_opts["boundaries"] = regions.total_bounds[[0, 2, 1, 3]] + [-1, 1, -1, 1]
proj_str = snakemake.params.plotting.get("projection", "EqualEarth")
central_coords = dict(central_longitude=10.0, central_latitude=50.0)
if proj_str == "EqualEarth":
# Equal area but large distortions towards the poles.
proj = ccrs.EqualEarth()
elif proj_str == "EuroPP":
# UTM Zone 32 projection
proj = ccrs.EuroPP()
elif proj_str == "LambertConformal":
# The European Environment Agency recommends using this
# projection for conformal pan-European mapping
proj = ccrs.LambertConformal(standard_parallels=(35, 65), **central_coords)
elif proj_str == "Orthographic":
proj = ccrs.Orthographic(**central_coords)
else:
logger.warning(
f"Plotting project {proj_str} not recognised; falling back on EqualEarth"
)
proj = ccrs.EqualEarth()
proj_kwargs = snakemake.params.plotting.get("projection", dict(name="EqualEarth"))
proj_func = getattr(ccrs, proj_kwargs.pop("name"))
proj = proj_func(**proj_kwargs)
if snakemake.params["foresight"] == "perfect":
plot_map_perfect(