Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 63 additions & 11 deletions nlmod/read/regis.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import numpy as np
import pandas as pd
import xarray as xr
from packaging.version import parse as parse_version

from .. import cache
from ..dims.layers import calculate_thickness, remove_layer_dim_from_top
Expand Down Expand Up @@ -163,18 +164,14 @@ def get_regis(
msg = "No data found. Please supply valid extent in the Netherlands in RD-coordinates"
raise (ValueError(msg))

# make sure layer names are regular strings
ds["layer"] = ds["layer"].astype(str)
ds["layer"] = get_layer_names(
ds=ds, rename_layers_to_version_2_2_2=rename_layers_to_version_2_2_2
)

# make sure y is descending
if (ds["y"].diff("y") > 0).all():
ds = ds.isel(y=slice(None, None, -1))

if rename_layers_to_version_2_2_2 and ds.attrs["title"] == "REGIS v02r2s3":
df = get_table_name_changes()
layer = df.set_index("Nieuwe code")["Oude code"].loc[ds.layer]
ds = ds.assign_coords({"layer": layer})

# slice layers
if botm_layer is not None and botm_layer in ds.layer:
ds = ds.sel(layer=slice(botm_layer))
Expand Down Expand Up @@ -345,17 +342,72 @@ def add_geotop_to_regis_layers(
return rg


def get_layer_names():
def extract_version_from_title(version_string):
"""
Extract version number in format X.Y.Z from a string like "REGIS vXXrYsZ".

Parameters
----------
version_string : str
The input string containing version information in format "REGIS vXXrYsZ".

Returns
-------
packaging.version.Version
Extracted version in format "X.Y.Z".

Examples
--------
>>> extract_version("REGIS v02r2s3")
<Version('2.2.3')>
"""
# Extract digits from the string after 'v', 'r', and 's'
parts = version_string.split()
code = parts[1] # Get 'vXXrYsZ' part

# Extract the numbers after v, r, and s
major = (
code[1:3].lstrip("0") or "0"
) # Remove leading zeros, but keep at least one digit
minor = code[code.find("r") + 1 : code.find("s")].lstrip("0") or "0"
patch = code[code.find("s") + 1 :].lstrip("0") or "0"

# Combine into version format
version = f"{major}.{minor}.{patch}"
return parse_version(version)


def get_layer_names(ds=None, rename_layers_to_version_2_2_2=True):
"""Get all the available regis layer names.

Parameters
----------
ds : xarray.Dataset, optional
The regis dataset. If None, a connection is made to the REGIS server.
The default is None.
rename_layers_to_version_2_2_2 : bool, optional
If True, the layer names are renamed to their pre-v2.2.3 names. The default is
True.

Returns
-------
layer_names : np.array
array with names of all the regis layers.
"""
layer_names = xr.open_dataset(REGIS_URL).layer.astype(str).values
if ds is None:
ds = xr.open_dataset(REGIS_URL, decode_times=False, decode_coords=False)

regis_version = extract_version_from_title(ds.attrs["title"])

layer_names = ds.layer.values.astype(str)

return layer_names
if rename_layers_to_version_2_2_2 and regis_version >= parse_version("2.2.3"):
df = get_table_name_changes()
return (
df.set_index("Nieuwe code").loc[layer_names]["Oude code"].values.astype(str)
)
else:
return layer_names


def get_legend(kind="REGIS"):
Expand Down Expand Up @@ -432,7 +484,7 @@ def read_voleg(fname):

def get_table_name_changes():
"""
Get the table with name changes of REGIS
Get the table with name changes of REGIS.

Returns
-------
Expand Down
Loading