Skip to content

Commit 08e70a3

Browse files
authored
Update regis.get_layer_names() to return pre 2.2.3 names (#433)
* Update regis.get_layer_names() to return pre 2.2.3 names * Renaming regis layer names if version > 2.2.3 If regis version would receive a small version bump, the origional code would crash. With the proposed changes less likely so. * formatting * Refactor get_layer_names function to accept dataset as an argument and streamline layer name assignment in get_regis function. * Remove unused import of 'get' from the arrow module in regis.py * Removed trainling white space
1 parent a3e41c7 commit 08e70a3

File tree

1 file changed

+63
-11
lines changed

1 file changed

+63
-11
lines changed

nlmod/read/regis.py

Lines changed: 63 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import numpy as np
66
import pandas as pd
77
import xarray as xr
8+
from packaging.version import parse as parse_version
89

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

166-
# make sure layer names are regular strings
167-
ds["layer"] = ds["layer"].astype(str)
167+
ds["layer"] = get_layer_names(
168+
ds=ds, rename_layers_to_version_2_2_2=rename_layers_to_version_2_2_2
169+
)
168170

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

173-
if rename_layers_to_version_2_2_2 and ds.attrs["title"] == "REGIS v02r2s3":
174-
df = get_table_name_changes()
175-
layer = df.set_index("Nieuwe code")["Oude code"].loc[ds.layer]
176-
ds = ds.assign_coords({"layer": layer})
177-
178175
# slice layers
179176
if botm_layer is not None and botm_layer in ds.layer:
180177
ds = ds.sel(layer=slice(botm_layer))
@@ -345,17 +342,72 @@ def add_geotop_to_regis_layers(
345342
return rg
346343

347344

348-
def get_layer_names():
345+
def extract_version_from_title(version_string):
346+
"""
347+
Extract version number in format X.Y.Z from a string like "REGIS vXXrYsZ".
348+
349+
Parameters
350+
----------
351+
version_string : str
352+
The input string containing version information in format "REGIS vXXrYsZ".
353+
354+
Returns
355+
-------
356+
packaging.version.Version
357+
Extracted version in format "X.Y.Z".
358+
359+
Examples
360+
--------
361+
>>> extract_version("REGIS v02r2s3")
362+
<Version('2.2.3')>
363+
"""
364+
# Extract digits from the string after 'v', 'r', and 's'
365+
parts = version_string.split()
366+
code = parts[1] # Get 'vXXrYsZ' part
367+
368+
# Extract the numbers after v, r, and s
369+
major = (
370+
code[1:3].lstrip("0") or "0"
371+
) # Remove leading zeros, but keep at least one digit
372+
minor = code[code.find("r") + 1 : code.find("s")].lstrip("0") or "0"
373+
patch = code[code.find("s") + 1 :].lstrip("0") or "0"
374+
375+
# Combine into version format
376+
version = f"{major}.{minor}.{patch}"
377+
return parse_version(version)
378+
379+
380+
def get_layer_names(ds=None, rename_layers_to_version_2_2_2=True):
349381
"""Get all the available regis layer names.
350382
383+
Parameters
384+
----------
385+
ds : xarray.Dataset, optional
386+
The regis dataset. If None, a connection is made to the REGIS server.
387+
The default is None.
388+
rename_layers_to_version_2_2_2 : bool, optional
389+
If True, the layer names are renamed to their pre-v2.2.3 names. The default is
390+
True.
391+
351392
Returns
352393
-------
353394
layer_names : np.array
354395
array with names of all the regis layers.
355396
"""
356-
layer_names = xr.open_dataset(REGIS_URL).layer.astype(str).values
397+
if ds is None:
398+
ds = xr.open_dataset(REGIS_URL, decode_times=False, decode_coords=False)
399+
400+
regis_version = extract_version_from_title(ds.attrs["title"])
401+
402+
layer_names = ds.layer.values.astype(str)
357403

358-
return layer_names
404+
if rename_layers_to_version_2_2_2 and regis_version >= parse_version("2.2.3"):
405+
df = get_table_name_changes()
406+
return (
407+
df.set_index("Nieuwe code").loc[layer_names]["Oude code"].values.astype(str)
408+
)
409+
else:
410+
return layer_names
359411

360412

361413
def get_legend(kind="REGIS"):
@@ -432,7 +484,7 @@ def read_voleg(fname):
432484

433485
def get_table_name_changes():
434486
"""
435-
Get the table with name changes of REGIS
487+
Get the table with name changes of REGIS.
436488
437489
Returns
438490
-------

0 commit comments

Comments
 (0)