Skip to content

Commit 9ffa59c

Browse files
add docstrings, return TCTtracks, move basin GDF
1 parent a72876d commit 9ffa59c

File tree

2 files changed

+43
-20
lines changed

2 files changed

+43
-20
lines changed

climada/hazard/tc_tracks.py

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -286,11 +286,6 @@ class Basin_bounds_storm(Enum):
286286
)
287287

288288

289-
BASINS_GDF = gpd.GeoDataFrame(
290-
{"basin": b, "geometry": b.value} for b in Basin_bounds_storm
291-
)
292-
293-
294289
class TCTracks:
295290
"""Contains tropical cyclone tracks.
296291
@@ -421,6 +416,27 @@ def subset(self, filterdict):
421416
return out
422417

423418
def get_basins(track):
419+
"""Identify the tropical-cyclone basins crossed by a single track.
420+
421+
The function appends the latitude and longitude coordinates of the input track
422+
into a GeoDataFrame of point geometries and performs a spatial join with the
423+
global BASINS_GDF polygons (each representing a tropical-cyclone basin).
424+
It returns the basin name(s) for every point along the track.
425+
426+
Parameters
427+
----------
428+
track : xarray.Dataset
429+
Tropical cyclone track
430+
Returns
431+
-------
432+
pandas.Series
433+
A Series of basin identifiers (e.g., "NA", "EP", "WP", …), one for each
434+
track point. Points that fall outside any basin have a value of ``NaN``.
435+
The index matches the index of the input track coordinates."""
436+
437+
BASINS_GDF = gpd.GeoDataFrame(
438+
{"basin": b, "geometry": b.value} for b in Basin_bounds_storm
439+
)
424440

425441
track_coordinates = gpd.GeoDataFrame(
426442
geometry=gpd.points_from_xy(track.lon, track.lat)
@@ -471,7 +487,14 @@ def subset_by_basin(self, origin: bool = False):
471487
else:
472488
tracks_outside_basin.append(track)
473489

474-
return basins_dict, tracks_outside_basin
490+
# return TCTracks objetcs
491+
for basin in Basin_bounds_storm:
492+
if not basins_dict[basin.name]:
493+
basins_dict[basin.name] = TCTracks([])
494+
else:
495+
basins_dict[basin.name] = TCTracks(basins_dict[basin.name])
496+
497+
return basins_dict, TCTracks(tracks_outside_basin)
475498

476499
def subset_year(
477500
self,

climada/hazard/test/test_tc_tracks.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -883,24 +883,24 @@ def test_subset_basin(self):
883883
# all basin
884884
dict_basins, tracks_outside_basin = tc_test.subset_by_basin(origin=False)
885885

886-
self.assertEqual(len(dict_basins["NA"]), 1)
887-
self.assertEqual(len(dict_basins["EP"]), 2)
888-
self.assertEqual(len(dict_basins["WP"]), 2)
889-
self.assertEqual(len(dict_basins["NI"]), 0)
890-
self.assertEqual(len(dict_basins["SI"]), 1)
891-
self.assertEqual(len(dict_basins["SP"]), 0)
892-
self.assertEqual(len(tracks_outside_basin), 0)
886+
self.assertEqual(len(dict_basins["NA"].data), 1)
887+
self.assertEqual(len(dict_basins["EP"].data), 2)
888+
self.assertEqual(len(dict_basins["WP"].data), 2)
889+
self.assertEqual(len(dict_basins["NI"].data), 0)
890+
self.assertEqual(len(dict_basins["SI"].data), 1)
891+
self.assertEqual(len(dict_basins["SP"].data), 0)
892+
self.assertEqual(len(tracks_outside_basin.data), 0)
893893

894894
# only origin basin
895895
dict_basins, tracks_outside_basin = tc_test.subset_by_basin(origin=True)
896896

897-
self.assertEqual(len(dict_basins["NA"]), 0)
898-
self.assertEqual(len(dict_basins["EP"]), 2)
899-
self.assertEqual(len(dict_basins["WP"]), 2)
900-
self.assertEqual(len(dict_basins["NI"]), 0)
901-
self.assertEqual(len(dict_basins["SI"]), 1)
902-
self.assertEqual(len(dict_basins["SP"]), 0)
903-
self.assertEqual(len(tracks_outside_basin), 0)
897+
self.assertEqual(len(dict_basins["NA"].data), 0)
898+
self.assertEqual(len(dict_basins["EP"].data), 2)
899+
self.assertEqual(len(dict_basins["WP"].data), 2)
900+
self.assertEqual(len(dict_basins["NI"].data), 0)
901+
self.assertEqual(len(dict_basins["SI"].data), 1)
902+
self.assertEqual(len(dict_basins["SP"].data), 0)
903+
self.assertEqual(len(tracks_outside_basin.data), 0)
904904

905905
def test_get_extent(self):
906906
"""Test extent/bounds attributes."""

0 commit comments

Comments
 (0)