Contrato de datos (consumido)¶
El contrato lo posee y congela nexrad-l3-pipeline: schema D1 en db/migrations/ de ese repo + convención de claves R2. Este proyecto lo lee y no lo cambia; cualquier cambio necesario es una migración negociada del lado del pipeline. Los contract tests de este repo (F1) asertan las formas de las que el viewer depende y fallan CI ante drift.
Esta página es la vista del consumidor: qué lee el viewer de cada tabla y qué asume. La fuente de verdad es el SQL del pipeline.
Convenciones globales¶
- Timestamps
TEXTISO-8601 UTC sin sufijo de zona (YYYY-MM-DDTHH:MM:SS), comparables lexicográficamente. - Retención: 72 h — el viewer nunca asume historia más allá de 3 días.
- Calibración raster:
físico = nivel · value_scale + value_offsetpara niveles ≥ 2; nivel 0 = below threshold (nodata), 1 = range folded.
D1¶
radars — catálogo dinámico¶
| Columna | Uso en el viewer |
|---|---|
site_id |
id de 3 chars del feed (AMX, JUA); clave de todas las consultas |
icao |
display (KAMX, TJUA) cuando existe |
lat, lon, height_m |
centrado de vista, círculo de cobertura, cálculos VWP |
proj4 |
definición AEQD registrada tal cual con proj4.defs — el viewer no construye proyecciones |
last_seen_at |
frescura ("minutos desde el último scan"), semáforo de estado por radar |
Sin radares hardcodeados en ninguno de los dos proyectos: lo que hay en la tabla es lo que el viewer ofrece.
products — descriptores mínimos¶
code (NEXRAD, p.ej. 153), mnemonic (N0B), unit, kind (raster | phenomena | vwp). Nombre display, categoría, rango y paleta no están aquí: viven en el catálogo estático del viewer keyed por code (decisión 5).
rasters — metadata de cada COG¶
Consultas del viewer: lista de datetimes por (site_id, product_code, día), más-cercano / siguiente / anterior a un instante (sobre vol_time, índice idx_rasters_lookup). Columnas usadas: r2_key (→ URL del COG), vol_time, value_scale/value_offset, max_level (recorte de leyenda), width/height/cell_m (extensión), el_angle, vcp.
phenomena — celdas, meso, TVS, granizo¶
Una fila por (site, vol_time, kind, cell_id) con lat/lon, azimuth_deg/range_km y attrs JSON. Consultas del viewer: por (site_id, vol_time) para el overlay del frame mostrado, y por (site_id, cell_id) cross-volumen para las series de tendencia de los charts (el cell_id del RPG es estable entre volúmenes).
Claves de attrs (parte del contrato)¶
Estado actual del parser + extensión acordada (marcada ⏳, tarea del lado pipeline, prerequisito de la fase F4 del viewer):
kind |
Clave | Estado | Contenido |
|---|---|---|---|
storm_cell |
azran_nm |
✅ | [az_deg, range_nm] posición radar-céntrica |
storm_cell |
movement_deg, movement_kt |
✅ | vector de movimiento |
storm_cell |
new |
✅ | celda nueva en este volumen |
storm_cell |
past, forecast |
⏳ | arrays de posiciones [[x_km, y_km], …] de los packets 23/24 (SCIT) |
storm_cell |
vil_kg_m2, dbz_max, top_kft |
⏳ | del tabular "STORM CELL ATTRIBUTES" de NST |
storm_cell |
poh_pct, posh_pct, hail_size_in |
⏳ | probabilidad/tamaño de granizo, mismo tabular |
meso |
radius_km + tabular NMD |
✅ parcial | atributos del mesociclón; columna TVS del NMD señala TVS |
Cuando la extensión aterrice, esta tabla se actualiza y los contract tests del viewer asertan las claves ⏳.
vwp — perfiles de viento¶
Una fila por (site_id, vol_time, height_ft): wind_dir_deg, wind_speed_kt, rms_kt. El viewer deriva u/v en cliente; no hay componente vertical w en el contrato.
R2¶
- Convención de claves:
{site}/{mnemo}/{YYYY}/{MM}/{DD}/{site}_{mnemo}_{YYYYMMDD_HHMMSS}.tif— pero el viewer no construye claves: usarasters.r2_keyliteral. - COG: niveles crudos uint8, scale/offset también embebidos en el TIFF, CRS proj4 AEQD, overviews internos. Peor caso 3680×3680 (N0B) — bajo el cap de textura WebGL de 4096.
- Acceso: lectura pública (dominio custom o
r2.dev) con CORS habilitado para el origen del viewer y soporte de range requests (nativo en R2). El viewer descarga solo tiles/overviews del viewport.
Requisitos de setup fuera del código (una vez)¶
- CORS en el bucket R2 para el origen de Pages (y
localhostpara desarrollo). - Acceso público de lectura al bucket (dominio custom recomendado sobre
r2.dev). - Binding D1 del proyecto Pages del viewer a la base
nexrad-l3(misma cuenta). - Binding a la base
nexrad-l3-testpara previews/CI si aplica.
Puntos de coordinación abiertos con el pipeline¶
- ⏳ Extensión de
attrsde NST/NMD (arriba) — acordada, pendiente de implementación en el repo del pipeline. - Documentar formalmente las claves de
attrsendb/README.mddel pipeline (hoyattrses caja negra en su doc). - Verificación opcional: barrido del bucket por 62/NSS (storm structure) — solo si las series de tendencia por
cell_idresultaran insuficientes; no bloquea nada.