Files
MapLibreParticleLab/integration/react-native/MapLibreParticleRNTestHost/src/realWeatherDataset.ts
OpenAI Codex a91e3601f3
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
feat: add STEP-062 real weather test map
2026-09-09 09:13:03 +08:00

41 lines
2.3 KiB
TypeScript

import { Asset } from "expo-asset";
export type RealWeatherFrame = Readonly<{
label: "T0" | "T1" | "T2" | "T3";
cycle: "2026080700" | "2026080706" | "2026080712" | "2026080718";
metadataJson: string;
validTime: number;
generation: number;
payloadModule: number;
}>;
type CanonicalMetadata = Readonly<{ validTime: number; generation: number }>;
// Static requires register all four raw .f32 assets with Metro/Expo; payload bytes never enter JS memory.
const metadataT0 = require("../assets/weather/ecmwf-hres-wind-20260807/2026080700/metadata.json") as CanonicalMetadata;
const metadataT1 = require("../assets/weather/ecmwf-hres-wind-20260807/2026080706/metadata.json") as CanonicalMetadata;
const metadataT2 = require("../assets/weather/ecmwf-hres-wind-20260807/2026080712/metadata.json") as CanonicalMetadata;
const metadataT3 = require("../assets/weather/ecmwf-hres-wind-20260807/2026080718/metadata.json") as CanonicalMetadata;
function frame(label: RealWeatherFrame["label"], cycle: RealWeatherFrame["cycle"], metadata: CanonicalMetadata, payloadModule: number): RealWeatherFrame {
return { label, cycle, metadataJson: JSON.stringify(metadata), validTime: metadata.validTime, generation: metadata.generation, payloadModule };
}
export const realWeatherFrames = [
frame("T0", "2026080700", metadataT0, require("../assets/weather/ecmwf-hres-wind-20260807/2026080700/field.f32")),
frame("T1", "2026080706", metadataT1, require("../assets/weather/ecmwf-hres-wind-20260807/2026080706/field.f32")),
frame("T2", "2026080712", metadataT2, require("../assets/weather/ecmwf-hres-wind-20260807/2026080712/field.f32")),
frame("T3", "2026080718", metadataT3, require("../assets/weather/ecmwf-hres-wind-20260807/2026080718/field.f32")),
] as const;
export async function materializeRealWeatherFrames(): Promise<ReadonlyArray<RealWeatherFrame & { payloadFileUri: string }>> {
return Promise.all(realWeatherFrames.map(async (weatherFrame) => {
const asset = Asset.fromModule(weatherFrame.payloadModule);
await asset.downloadAsync();
if (asset.localUri == null || !asset.localUri.startsWith("file://")) {
throw new Error(`${weatherFrame.label} Asset.downloadAsync did not provide a local file:// URI`);
}
return { ...weatherFrame, payloadFileUri: asset.localUri };
}));
}