|
5 | 5 | import numpy as np |
6 | 6 | import pandas as pd |
7 | 7 | import xarray as xr |
| 8 | +from packaging.version import parse as parse_version |
8 | 9 |
|
9 | 10 | from .. import cache |
10 | 11 | from ..dims.layers import calculate_thickness, remove_layer_dim_from_top |
@@ -163,18 +164,14 @@ def get_regis( |
163 | 164 | msg = "No data found. Please supply valid extent in the Netherlands in RD-coordinates" |
164 | 165 | raise (ValueError(msg)) |
165 | 166 |
|
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 | + ) |
168 | 170 |
|
169 | 171 | # make sure y is descending |
170 | 172 | if (ds["y"].diff("y") > 0).all(): |
171 | 173 | ds = ds.isel(y=slice(None, None, -1)) |
172 | 174 |
|
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 | | - |
178 | 175 | # slice layers |
179 | 176 | if botm_layer is not None and botm_layer in ds.layer: |
180 | 177 | ds = ds.sel(layer=slice(botm_layer)) |
@@ -345,17 +342,72 @@ def add_geotop_to_regis_layers( |
345 | 342 | return rg |
346 | 343 |
|
347 | 344 |
|
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): |
349 | 381 | """Get all the available regis layer names. |
350 | 382 |
|
| 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 | +
|
351 | 392 | Returns |
352 | 393 | ------- |
353 | 394 | layer_names : np.array |
354 | 395 | array with names of all the regis layers. |
355 | 396 | """ |
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) |
357 | 403 |
|
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 |
359 | 411 |
|
360 | 412 |
|
361 | 413 | def get_legend(kind="REGIS"): |
@@ -432,7 +484,7 @@ def read_voleg(fname): |
432 | 484 |
|
433 | 485 | def get_table_name_changes(): |
434 | 486 | """ |
435 | | - Get the table with name changes of REGIS |
| 487 | + Get the table with name changes of REGIS. |
436 | 488 |
|
437 | 489 | Returns |
438 | 490 | ------- |
|
0 commit comments