"""
Function to download the Earth relief datasets from the GMT data server, and load as
:class:`xarray.DataArray`.
The grids are available in various resolutions.
"""
from collections.abc import Sequence
from typing import Literal
import xarray as xr
from pygmt.datasets.load_remote_dataset import _load_remote_dataset
from pygmt.exceptions import GMTInvalidInput
__doctest_skip__ = ["load_earth_relief"]
[docs]
def load_earth_relief(
resolution: Literal[
"01d",
"30m",
"20m",
"15m",
"10m",
"06m",
"05m",
"04m",
"03m",
"02m",
"01m",
"30s",
"15s",
"03s",
"01s",
] = "01d",
region: Sequence[float] | str | None = None,
registration: Literal["gridline", "pixel", None] = None,
data_source: Literal["igpp", "gebco", "gebcosi", "synbath"] = "igpp",
use_srtm: bool = False,
) -> xr.DataArray:
r"""
Load the Earth relief datasets (topography and bathymetry) in various resolutions.
.. figure:: https://www.generic-mapping-tools.org/remote-datasets/_images/GMT_earth_gebco.jpg
:width: 80 %
:align: center
Earth relief datasets (topography and bathymetry).
This function downloads the dataset from the GMT data server, caches it in a user
data directory (usually ``~/.gmt/server/earth/earth_relief``,
``~/.gmt/server/earth/earth_gebco``, ``~/.gmt/server/earth/earth_gebcosi``,
``~/.gmt/server/earth/earth_synbath``), and load the dataset as an
:class:`xarray.DataArray`. An internet connection is required the first time around,
but subsequent calls will load the dataset from the local data directory.
The dataset can also be accessed by specifying a file name in any grid processing
function or plotting method, using the following file name format:
**@**\ *earth_relief_type*\_\ *res*\_\ *reg*. *earth_relief_type* is the GMT name
for the dataset. The available options are **earth_relief**\, **earth_gebco**\,
**earth_gebcosi**\, and **earth_synbath**\. *res* is the grid resolution; *reg* is
the grid registration type (**p** for pixel registration, **g** for gridline
registration). If *reg* is omitted (e.g., ``@earth_relief_01d``), the
gridline-registered grid will be loaded for grid processing functions and the
pixel-registered grid willcbe loaded for plotting functions. If *res* is also
omitted (i.e., ``@earth_relief``), GMT automatically selects a suitable resolution
based on the current region and projection settings.
This dataset comes with a color palette table (CPT) file, ``geo``. To use the
dataset-specific CPT when plotting the dataset, explicitly set ``cmap="geo"``,
otherwise GMT's default CPT (*turbo*) will be used. If the dataset is referenced by
the file name in a grid plotting method, the dataset-specific CPT file is used
automatically unless another CPT is specified.
Refer to :gmt-datasets:`earth-relief.html` for more details about available
datasets, including version information and references.
Parameters
----------
resolution
The grid resolution. The suffix ``d``, ``m`` and ``s`` stand for arc-degrees,
arc-minutes, and arc-seconds.
region
The subregion of the grid to load, in the form of a sequence [*xmin*, *xmax*,
*ymin*, *ymax*] or an ISO country code. Required for grids with resolutions
higher than 5 arc-minutes (i.e., ``"05m"``).
registration
Grid registration type. Either ``"pixel"`` for pixel registration or
``"gridline"`` for gridline registration. Default is ``None``, which means
``"gridline"`` for all resolutions except ``"15s"`` which is ``"pixel"``
only.
data_source
Select the source for the Earth relief data. Available options are:
- ``"igpp"``: IGPP Earth Relief. See
:gmt-datasets:`earth-relief.html`.
- ``"synbath"``: IGPP Earth Relief dataset that uses stastical
properties of young seafloor to provide a more realistic relief
of young areas with small seamounts.
- ``"gebco"``: GEBCO Earth Relief with only observed relief and
inferred relief via altimetric gravity. See
:gmt-datasets:`earth-gebco.html`.
- ``"gebcosi"``: GEBCO Earth Relief that gives sub-ice (si) elevations.
use_srtm
By default, the land-only SRTM tiles from NASA are used to generate the
``"03s"`` and ``"01s"`` grids, and the missing ocean values are filled
by up-sampling the SRTM15 tiles which have a resolution of 15
arc-seconds (i.e., ``"15s"``). If True, will only load the original
land-only SRTM tiles. Only works when ``data_source="igpp"``.
Returns
-------
grid
The Earth relief grid. Coordinates are latitude and longitude in
degrees. Relief is in meters.
Note
----
The registration and coordinate system type of the returned
:class:`xarray.DataArray` grid can be accessed via the *gmt* accessor. Refer to
:class:`pygmt.GMTDataArrayAccessor` for detailed explanations and limitations.
Examples
--------
>>> from pygmt.datasets import load_earth_relief
>>> # Load the default grid (gridline-registered 1 arc-degree grid)
>>> grid = load_earth_relief()
>>> # Load the 30 arc-minutes grid with "gridline" registration
>>> grid = load_earth_relief(resolution="30m", registration="gridline")
>>> # Load high-resolution (5 arc-minutes) grid for a specific region
>>> grid = load_earth_relief(
... resolution="05m",
... region=[120, 160, 30, 60],
... registration="gridline",
... )
>>> # Load the original 3 arc-seconds land-only SRTM tiles from NASA
>>> grid = load_earth_relief(
... resolution="03s",
... region=[135, 136, 35, 36],
... registration="gridline",
... use_srtm=True,
... )
"""
# resolutions of original land-only SRTM tiles from NASA
land_only_srtm_resolutions = ["03s", "01s"]
# Map data source to prefix
prefix = {
"igpp": "earth_relief",
"gebco": "earth_gebco",
"gebcosi": "earth_gebcosi",
"synbath": "earth_synbath",
}.get(data_source)
if prefix is None:
msg = (
f"Invalid earth relief data source '{data_source}'. "
"Valid values are 'igpp', 'gebco', 'gebcosi', and 'synbath'."
)
raise GMTInvalidInput(msg)
# Use SRTM or not.
if use_srtm and resolution in land_only_srtm_resolutions:
if data_source != "igpp":
msg = (
f"Option 'use_srtm=True' doesn't work with data source '{data_source}'. "
"Please set 'data_source' to 'igpp'."
)
raise GMTInvalidInput(msg)
prefix = "srtm_relief"
# Choose earth relief dataset
match data_source:
case "igpp" | "synbath":
name = "earth_igpp"
case "gebco" | "gebcosi":
name = "earth_gebco"
grid = _load_remote_dataset(
name=name,
prefix=prefix,
resolution=resolution,
region=region,
registration=registration,
)
return grid