Ja auem escrit abans sus MeteoTrail e sus er agregador d'alèrtas meteorologicas deth govèrn que l'alimente — tostes dus gessècon deth madeish instint: es operadors d'espòrts aquatics an besonh de sàber, damb precision e damb antelacion, quan es condicions se giren en contra. Immersion, caiac, classes de surf — es cinc verticaus que descriuérem en "Un motor de resèrvas, cinc espòrts" — compartissen totes ua dependéncia qu'a penes arrés pense: era nautor reau dera mar en un moment dat. Quauqui punts d'immersion e embarcadors de caiac deth catalòg de Lueira solament son accessibles damb seguretat laguens d'ua fenèstra de marèa concrèta. Atau qu'aguest an bastírem un servici petit, apausadament estret, entà respóner plan a ua soleta question: quau serà era marèa astronomica, en aguest punt, en aguest moment.
1. Ua question estreta e precisa
tides-service ei un servici intèrn en FastAPI. Preditz marèas astronomicas emplegant er atlas globau de marèa oceanica FES2022b, per mejan dera libreria de còdi dubèrt pyfes. Se consomís de maquina a maquina, prumèrament dès eth backend de Lueira, e non ei exposat publicaument. Respon exactament a tres questions:
GET /v1/tides— ua seria temporau de nautors entre dus "timestamps"GET /v1/tides/extremes— es eveniments de plenamar/baishamar d'un dia UTC datGET /v1/locations/check— se aguesta coordenada ei en aigua o en tèrra, e se ei en tèrra, quau ei era cellula banhada mès pròcha laguens d'un radi configurat
Es tres son protegidas damb "Bearer token". CORS ei desactivat per defècte — era madeisha postura de falhar tancat qu'eth requesit d'autentificacion. E dinc qu'er atlas de marèa, de diuèrsi gigabytes, age acabat de cargar-se en memòria en aviar, es dus "endpoints" de prediccion tornen 503 damb ua capçalèra Retry-After e un còs {"code": "model_loading"}. GET /healthz ei er unic "endpoint" dubèrt, e reporte se aqueth atlas a acabat de cargar-se.
Ua responsa simplificada de /v1/tides/extremes:
{
"location": {"lat": 43.283, "lon": -2.170},
"date": "2026-06-19",
"reference": "MSL",
"extremes": [
{"type": "low", "time": "2026-06-19T02:14:00Z", "height_m": 0.62},
{"type": "high", "time": "2026-06-19T08:31:00Z", "height_m": 3.41},
{"type": "low", "time": "2026-06-19T14:42:00Z", "height_m": 0.58},
{"type": "high", "time": "2026-06-19T20:59:00Z", "height_m": 3.55}
],
"attribution": "FES2022 was produced by LEGOS, NOVELTIS and CLS; funded by CNES; distributed by AVISO, DOI 10.24400/527896/A01-2024.004."
}
2. Çò qu'era prediccion de marèa NON te ditz
tides-service preditz solament era marèa astronomica, relativa ath Nivèu Mejan dera Mar. Aquerò ei era nautor que era lua e eth solelh, per mejan dera sua atraccion gravitatòria, produirien en un punt e moment dats se non se passèsse arren mès. Non includís eth temporau costanèr (storm surge), es efèctes dera pression atmosferica, era possada deth vent (wind setup), ne cap auta contribucion non astronomica ath nivèu dera mar observat.
Un sistèma de bàishes pressions prigond pòt aumentar er aigua notablament per dessús de çò que ditz era marèa astronomica. Un vent de component maritim sostiengut amonta aigua contra era còsta per dessús d'açò. Arren d'açò apareish en ua responsa de tides-service, per disenh. Ua foncionalitat de seguretat entà resèrvas d'espòrts aquatics non pòt simplament tractar un numèro de tides-service coma "eth nivèu der aigua" — ei ua dada precisa mès entre vàrias, amassa damb es dades de vent e pression.
3. Redusir un atlas de diuèrsi gigabytes a çò que vertadèrament as besonh
Er atlas globau complèt FES2022b pese diuèrsi gigabytes, e auem licéncia entà emplegar-lo mès non entà redistribuir-lo publicaument segons es tèrmes d'AVISO, atau que víu en un DigitalOcean Space privat. En sòrta de que cada pod baishe er atlas globau complèt en aviar, escriuérem un "script" que retalhe er atlas en ua caisha delimitadora ath entorn dera nòsta zòna d'operacion reau — era peninsula iberica, eth golf de Biscaia e es Illes Canàries. Er aviada passèc de minutas a segondes.
Era part delicada ei qu'er atlas emmagazine era longitud ena convencion de 0–360°. Era nòsta zòna d'operacion trauèrse eth meridian de Greenwich, atau qu'era caisha delimitadora se monte a shivau dera costura 0/360:
REGION_BBOX = {
"lat_min": 27.0, "lat_max": 46.5,
"lon_ranges_0_360": [(342.0, 360.0), (0.0, 4.5)],
}
def crop_region(atlas, bbox):
west, east = bbox["lon_ranges_0_360"]
west_slice = atlas.sel(lon=slice(*west))
east_slice = atlas.sel(lon=slice(*east))
west_slice = west_slice.assign_coords(lon=west_slice.lon - 360)
return xr.concat([west_slice, east_slice], dim="lon").sortby("lon")
Se te trompes en aguesta costura non obtiens un error — obtiens ua prediccion de marèa que ei silenciosament faussa exactament en bòrd occidentau dera region.
4. Verificar eth nòste trabalh contra ua autoritat portuària reau
Ath costat dera "suite" de tèsts abituau, executam tèsts "golden" que comparen es extrèms de marèa predits per tides-service en un lòc reau — Zarautz, ena còsta basca — contra es taules de marèa publicadas per Puertos del Estado. Ei era diferéncia entre "eth nòste modèl ei d'acòrd damb eth madeish" e "eth nòste modèl ei d'acòrd damb era realitat".
Arren d'açò ei un trabalh lusent. Mès ua responsa estreta e precisa a ua soleta question de fisica, onèstament delimitada, vau mès entà ua foncionalitat de seguretat qu'un servici ample de "condicions oceanicas" que confonís silenciosament era marèa astronomica damb tot çò aute qu'afècte ath nivèu dera mar.