Source code for huracanpy.diags.translation_speed

"""
Module containing functions to compute translation speed
"""

from haversine import haversine
import numpy as np
import xarray as xr


[docs] def translation_speed(data): """ Compute translation speed along tracks Parameters ---------- data : xarray.Dataset Returns ------- xarray.Dataset Translation speeds. Output is stored for points that correspond to the middle of two consecutive points in the initial dataset. """ data = data.sortby(["track_id", "time"]) V, lat, lon, t, tid = [], [], [], [], [] # To store results temporarily dims = data.time.dims assert len(dims) == 1 dim = dims[0] for i in range(len(data[dim]) - 1): p = data.isel(**{dim: i}) # Current point q = data.isel(**{dim: i + 1}) # Next point if p.track_id == q.track_id: # If both points belong to the same track dt = np.timedelta64((q.time - p.time).values, "s") # Temporal interval in s dx = haversine( (p.lat.values[()], p.lon.values[()]), (q.lat.values[()], q.lon.values[()]), unit="m", ) # Displacement in m v = dx / dt.astype(float) # translation speed in m/s V.append(v) # Results will be stored with coordinates corresponding to the middle of p and q lat.append((p.lat + q.lat).values / 2) lon.append((p.lon + q.lon).values / 2) t.append((p.time + (q.time - p.time) / 2).values) tid.append(p.track_id.values) # Transform into clean dataset V = xr.DataArray(V, dims="mid_record", coords={"mid_record": np.arange(len(V))}) lon = xr.DataArray( lon, dims="mid_record", coords={"mid_record": np.arange(len(lon))} ) lat = xr.DataArray( lat, dims="mid_record", coords={"mid_record": np.arange(len(lat))} ) t = xr.DataArray(t, dims="mid_record", coords={"mid_record": np.arange(len(t))}) tid = xr.DataArray( tid, dims="mid_record", coords={"mid_record": np.arange(len(tid))} ) return xr.Dataset( {"lon": lon, "lat": lat, "time": t, "track_id": tid, "translation_speed": V} )