feat: add rivers overview component and sync lake volume data across the dataset
This commit is contained in:
+36
-6
@@ -38,7 +38,11 @@ export function parseDateString(dateStr: string): string | null {
|
||||
}
|
||||
|
||||
async function scrapeLake(lakeId: string, oid: string, internalId: string) {
|
||||
const URL = `https://www.pvl.cz/portal/nadrze/cz/pc/Mereni.aspx?oid=${oid}&id=${internalId}`;
|
||||
const config = lakesConfig.find(l => l.id === lakeId);
|
||||
const isRiver = config?.type === 'river';
|
||||
const URL = isRiver
|
||||
? `https://www.pvl.cz/portal/sap/cz/pc/Mereni.aspx?oid=${oid}&id=${internalId}`
|
||||
: `https://www.pvl.cz/portal/nadrze/cz/pc/Mereni.aspx?oid=${oid}&id=${internalId}`;
|
||||
const DATA_FILE = path.resolve(`public/data/${internalId}.json`);
|
||||
|
||||
try {
|
||||
@@ -80,7 +84,8 @@ async function scrapeLake(lakeId: string, oid: string, internalId: string) {
|
||||
const records: DataRecord[] = [];
|
||||
let dataTable = null;
|
||||
$('table').each((i, tbl) => {
|
||||
if ($(tbl).text().includes('Datum') && $(tbl).text().includes('Odtok')) {
|
||||
const id = ($(tbl).attr('id') || '').toLowerCase();
|
||||
if (id.includes('datamereni24hgv') || id.includes('datamerenigv')) {
|
||||
dataTable = $(tbl);
|
||||
}
|
||||
});
|
||||
@@ -102,9 +107,7 @@ async function scrapeLake(lakeId: string, oid: string, internalId: string) {
|
||||
records.push({
|
||||
timestamp: parsedDateStr,
|
||||
level: parseFloat(levelStr) || 0,
|
||||
flow: parseFloat(flowStr) || 0,
|
||||
inflow: 0,
|
||||
volume: 0
|
||||
flow: parseFloat(flowStr) || 0
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -143,7 +146,19 @@ async function scrapeLake(lakeId: string, oid: string, internalId: string) {
|
||||
|
||||
const dataMap = new Map<string, DataRecord>();
|
||||
existingData.forEach(item => dataMap.set(item.timestamp, item));
|
||||
records.forEach(item => dataMap.set(item.timestamp, item));
|
||||
records.forEach(item => {
|
||||
const existing = dataMap.get(item.timestamp);
|
||||
if (existing) {
|
||||
dataMap.set(item.timestamp, {
|
||||
...existing,
|
||||
...item,
|
||||
inflow: item.inflow !== undefined ? item.inflow : existing.inflow,
|
||||
volume: item.volume !== undefined ? item.volume : existing.volume
|
||||
});
|
||||
} else {
|
||||
dataMap.set(item.timestamp, item);
|
||||
}
|
||||
});
|
||||
|
||||
const mergedData = Array.from(dataMap.values()).sort((a, b) => {
|
||||
return new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime();
|
||||
@@ -152,6 +167,9 @@ async function scrapeLake(lakeId: string, oid: string, internalId: string) {
|
||||
// Propagate previous values if missing (user requested)
|
||||
let lastKnownTemp: number | null = null;
|
||||
let lastKnownPrecip: number | null = null;
|
||||
let lastKnownInflow: number | undefined = undefined;
|
||||
let lastKnownVolume: number | undefined = undefined;
|
||||
|
||||
mergedData.forEach(item => {
|
||||
if (item.temperature !== undefined && item.temperature !== null) {
|
||||
lastKnownTemp = item.temperature;
|
||||
@@ -164,6 +182,18 @@ async function scrapeLake(lakeId: string, oid: string, internalId: string) {
|
||||
} else if (lastKnownPrecip !== null) {
|
||||
item.precipitation = lastKnownPrecip;
|
||||
}
|
||||
|
||||
if (item.inflow !== undefined && item.inflow !== null) {
|
||||
lastKnownInflow = item.inflow;
|
||||
} else if (lastKnownInflow !== undefined) {
|
||||
item.inflow = lastKnownInflow;
|
||||
}
|
||||
|
||||
if (item.volume !== undefined && item.volume !== null) {
|
||||
lastKnownVolume = item.volume;
|
||||
} else if (lastKnownVolume !== undefined) {
|
||||
item.volume = lastKnownVolume;
|
||||
}
|
||||
});
|
||||
|
||||
fs.mkdirSync(path.dirname(DATA_FILE), { recursive: true });
|
||||
|
||||
Reference in New Issue
Block a user