-
Notifications
You must be signed in to change notification settings - Fork 229
Description
Description of the desired feature
Provide access to cloud-free colour images of the Earth! Specifically, the @earth_day_
and @earth_night_
GMT remote data files (see https://docs.generic-mapping-tools.org/6.2/datasets/remote-data.html#global-earth-day-night-images).
Context is that I'm using it at #1437, and it would be good to have some sample RGB images. We might as well have a proper function similar to pygmt.datasets.load_earth_relief
, but for the Blue and Black Marble images instead.
Note that there is a lot of logic from the load_earth_relief
function that could be reused:
pygmt/pygmt/datasets/earth_relief.py
Lines 92 to 140 in ebbb0cc
# earth relief data stored as single grids for low resolutions | |
non_tiled_resolutions = ["01d", "30m", "20m", "15m", "10m", "06m"] | |
# earth relief data stored as tiles for high resolutions | |
tiled_resolutions = ["05m", "04m", "03m", "02m", "01m", "30s", "15s", "03s", "01s"] | |
# resolutions of original land-only SRTM tiles from NASA | |
land_only_srtm_resolutions = ["03s", "01s"] | |
if registration in ("pixel", "gridline", None): | |
# If None, let GMT decide on Pixel/Gridline type | |
reg = f"_{registration[0]}" if registration else "" | |
else: | |
raise GMTInvalidInput( | |
f"Invalid grid registration: '{registration}', should be either " | |
"'pixel', 'gridline' or None. Default is None, where a " | |
"pixel-registered grid is returned unless only the " | |
"gridline-registered grid is available." | |
) | |
if resolution not in non_tiled_resolutions + tiled_resolutions: | |
raise GMTInvalidInput(f"Invalid Earth relief resolution '{resolution}'.") | |
# Check combination of resolution and registration. | |
if (resolution == "15s" and registration == "gridline") or ( | |
resolution in ("03s", "01s") and registration == "pixel" | |
): | |
raise GMTInvalidInput( | |
f"{registration}-registered Earth relief data for " | |
f"resolution '{resolution}' is not supported." | |
) | |
# Choose earth relief data prefix | |
earth_relief_prefix = "earth_relief_" | |
if use_srtm and resolution in land_only_srtm_resolutions: | |
earth_relief_prefix = "srtm_relief_" | |
# different ways to load tiled and non-tiled earth relief data | |
# Known issue: tiled grids don't support slice operation | |
# See https://github.com/GenericMappingTools/pygmt/issues/524 | |
if region is None: | |
if resolution not in non_tiled_resolutions: | |
raise GMTInvalidInput( | |
f"'region' is required for Earth relief resolution '{resolution}'." | |
) | |
fname = which(f"@earth_relief_{resolution}{reg}", download="a") | |
with xr.open_dataarray(fname, engine="netcdf4") as dataarray: | |
grid = dataarray.load() | |
_ = grid.gmt # load GMTDataArray accessor information | |
else: | |
grid = grdcut(f"@{earth_relief_prefix}{resolution}{reg}", region=region) |
These are some ways I'm considering:
Option 1 - rename the earth_relief.py
file to earth_data.py
first, and then separate the re-usable chunk of code into a function called _load_earth_data
or something and have load_earth_relief
/load_earth_day
/load_earth_night
call that. This is similar to what we did for blockmean
and blockmedian
at #1092. Less breakages for users already using load_earth_relief
, but maybe more work for the devs.
Option 2 - have a single function called load_earth_data
which accepts a parameter called 'type' that accepts arguments like 'relief'/'day'/'night'. We could then pretty much re-use the existing load_earth_relief
function though it will need to be renamed to load_earth_data
I guess. This would involve a deprecation notice for users using load_earth_relief
, but less work for the devs in terms of not needing to write a new function?
Option 3 - any other ideas?
Are you willing to help implement and maintain this feature? Best to discuss first.