Files
davisfe.cz/scripts/buildIndex.ts
T

96 lines
2.9 KiB
TypeScript

import * as fs from 'fs';
import * as path from 'path';
import { lakesConfig } from './lakesConfig';
import { calculateLakeMetrics } from './utils/calculations';
interface DataRecord {
timestamp: string;
level: number;
flow: number;
}
const lakes = lakesConfig.map(lake => {
const [internalId, oid] = lake.id.split('|');
const DATA_FILE = path.resolve(`public/data/${internalId}.json`);
let currentLevel = 0;
let currentFlow = 0;
let sparkline: number[] = Array(12).fill(0);
let capacity = 0;
let volume = 0;
let inflow = 0;
if (fs.existsSync(DATA_FILE)) {
try {
const data: any[] = JSON.parse(fs.readFileSync(DATA_FILE, 'utf-8'));
if (data.length > 0) {
// Find latest valid record or just the last record
const lastValidLevelData = [...data].reverse().find(d => d.level !== null && !isNaN(d.level));
const lastValidFlowData = [...data].reverse().find(d => d.flow !== null && !isNaN(d.flow) && d.flow >= 0);
currentLevel = lastValidLevelData ? lastValidLevelData.level : 0;
currentFlow = lastValidFlowData ? lastValidFlowData.flow : 0;
// Take up to 12 last records for sparkline
const recentData = data.slice(-12);
sparkline = recentData.map(d => (d.level === null || isNaN(d.level) ? 0 : d.level));
// Pad with zeros if less than 12
while (sparkline.length < 12) {
sparkline.unshift(0);
}
const latest = data[data.length - 1];
if (latest.volume && latest.volume > 0) {
volume = latest.volume;
}
if (latest.inflow !== undefined) {
inflow = latest.inflow;
}
}
} catch (e) {
console.error(`Error reading data for ${internalId}`, e);
}
}
const metrics = calculateLakeMetrics(currentLevel, volume, lake);
const cleanText = lake.text.replace(/^VD\s+/, '').replace(/^LG\s+/, '');
const parts = cleanText.split(' - ').map(p => p.trim());
let name = '';
let river = '';
if (parts.length > 1) {
river = parts[parts.length - 1];
name = parts.slice(0, -1).join(' - ');
} else {
name = parts[0];
}
return {
id: lake.id,
name,
river,
priority: lake.priority || false,
level: currentLevel.toFixed(2),
capacity: metrics.capacity,
storageDiff: metrics.storageDiff,
inflow: inflow.toFixed(1),
outflow: currentFlow.toFixed(1),
volume: metrics.volume,
maxVolume: lake.maxVolume || 0,
navigationForbidden: lake.navigationForbidden || false,
lat: lake.coords[0],
lng: lake.coords[1],
sparkline,
type: lake.type || 'lake',
country: lake.country || 'CZ',
area: lake.area || 0,
depth: lake.depth || 0
};
});
const outputPath = path.resolve(process.cwd(), 'public/data/lakes_index.json');
fs.writeFileSync(outputPath, JSON.stringify(lakes, null, 2));
console.log('Real lakes index generated:', lakes.length);