diff --git a/package-lock.json b/package-lock.json index 50e732c..7a6cc55 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,14 +11,17 @@ "axios": "^1.17.0", "cheerio": "^1.2.0", "date-fns": "^4.4.0", + "leaflet": "^1.9.4", "react": "^19.2.0", "react-dom": "^19.2.0", "react-icons": "^5.5.0", + "react-leaflet": "^5.0.0", "react-router-dom": "^7.9.6", "recharts": "^3.8.1" }, "devDependencies": { "@eslint/js": "^9.39.1", + "@types/leaflet": "^1.9.21", "@types/node": "^24.10.1", "@types/react": "^19.2.5", "@types/react-dom": "^19.2.3", @@ -1016,6 +1019,17 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@react-leaflet/core": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-3.0.0.tgz", + "integrity": "sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ==", + "license": "Hippocratic-2.1", + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, "node_modules/@reduxjs/toolkit": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", @@ -1494,6 +1508,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1501,6 +1522,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/leaflet": { + "version": "1.9.21", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.21.tgz", + "integrity": "sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, "node_modules/@types/node": { "version": "24.10.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", @@ -3318,6 +3349,12 @@ "json-buffer": "3.0.1" } }, + "node_modules/leaflet": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "license": "BSD-2-Clause" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3706,6 +3743,20 @@ "license": "MIT", "peer": true }, + "node_modules/react-leaflet": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz", + "integrity": "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==", + "license": "Hippocratic-2.1", + "dependencies": { + "@react-leaflet/core": "^3.0.0" + }, + "peerDependencies": { + "leaflet": "^1.9.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + } + }, "node_modules/react-redux": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", diff --git a/package.json b/package.json index 17cbc4f..152486e 100644 --- a/package.json +++ b/package.json @@ -9,20 +9,25 @@ "lint": "eslint .", "preview": "vite preview", "mock": "tsx scripts/generateMockLakes.ts", - "scrape": "tsx scripts/scrapeLipno.ts" + "scrape": "tsx scripts/scrapeLakes.ts", + "build-index": "tsx scripts/buildIndex.ts", + "data:update": "npm run scrape && npm run build-index" }, "dependencies": { "axios": "^1.17.0", "cheerio": "^1.2.0", "date-fns": "^4.4.0", + "leaflet": "^1.9.4", "react": "^19.2.0", "react-dom": "^19.2.0", "react-icons": "^5.5.0", + "react-leaflet": "^5.0.0", "react-router-dom": "^7.9.6", "recharts": "^3.8.1" }, "devDependencies": { "@eslint/js": "^9.39.1", + "@types/leaflet": "^1.9.21", "@types/node": "^24.10.1", "@types/react": "^19.2.5", "@types/react-dom": "^19.2.3", diff --git a/public/data/BIBI.json b/public/data/BIBI.json new file mode 100644 index 0000000..2431c5d --- /dev/null +++ b/public/data/BIBI.json @@ -0,0 +1,167 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 463.41, + "flow": null + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T19:15:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 463.42, + "flow": null + }, + { + "timestamp": "2026-06-05T19:45:00.000Z", + "level": 463.42, + "flow": null + } +] \ No newline at end of file diff --git a/public/data/BLHU.json b/public/data/BLHU.json new file mode 100644 index 0000000..65bf10f --- /dev/null +++ b/public/data/BLHU.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 520.64, + "flow": 0.78 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 520.59, + "flow": 0.75 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 520.78, + "flow": 0.72 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 520.94, + "flow": 0.69 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 521.01, + "flow": 0.69 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 521.14, + "flow": 0.63 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 521.18, + "flow": 0.64 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 521.18, + "flow": 0.65 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 521.18, + "flow": 0.64 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 521.18, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 521.18, + "flow": 0.64 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 521.18, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 521.18, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 521.19, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 521.19, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 521.19, + "flow": 0.64 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 521.19, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 521.2, + "flow": 0.64 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 521.2, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 521.2, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 521.2, + "flow": 0.63 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 521.21, + "flow": 0.64 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 521.21, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 521.21, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 521.21, + "flow": 0.64 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 521.22, + "flow": 0.64 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 521.22, + "flow": 0.64 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 521.22, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 521.22, + "flow": 0.62 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 521.22, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 521.22, + "flow": 0.63 + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 521.22, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 521.23, + "flow": 0.64 + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 521.23, + "flow": 0.65 + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 521.23, + "flow": 0.64 + } +] \ No newline at end of file diff --git a/public/data/KCKC.json b/public/data/KCKC.json new file mode 100644 index 0000000..cfbc5f8 --- /dev/null +++ b/public/data/KCKC.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 292.88, + "flow": 0.02 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 292.87, + "flow": 0.02 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 292.9, + "flow": 0.02 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 292.9, + "flow": 0.02 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 292.9, + "flow": 0.02 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 292.9, + "flow": 0.02 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 292.9, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 292.9, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 292.9, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 292.9, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 292.91, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 292.91, + "flow": null + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 292.91, + "flow": null + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 292.91, + "flow": null + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 292.91, + "flow": null + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 292.91, + "flow": null + } +] \ No newline at end of file diff --git a/public/data/KLDP.json b/public/data/KLDP.json new file mode 100644 index 0000000..2ab9036 --- /dev/null +++ b/public/data/KLDP.json @@ -0,0 +1,167 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 632.73, + "flow": null + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 632.74, + "flow": null + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 632.76, + "flow": null + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 632.76, + "flow": null + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 632.76, + "flow": null + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 632.76, + "flow": null + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 632.76, + "flow": null + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 632.76, + "flow": null + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 632.76, + "flow": null + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 632.76, + "flow": null + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 632.76, + "flow": null + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 632.76, + "flow": null + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 632.77, + "flow": null + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 632.77, + "flow": null + } +] \ No newline at end of file diff --git a/public/data/KLHP.json b/public/data/KLHP.json new file mode 100644 index 0000000..a0623a9 --- /dev/null +++ b/public/data/KLHP.json @@ -0,0 +1,167 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 635.67, + "flow": null + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 635.67, + "flow": null + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 635.69, + "flow": null + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 635.69, + "flow": null + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 635.69, + "flow": null + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 635.69, + "flow": null + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 635.69, + "flow": null + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 635.69, + "flow": null + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 635.69, + "flow": null + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 635.69, + "flow": null + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 635.69, + "flow": null + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 635.71, + "flow": null + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 635.7, + "flow": null + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 635.7, + "flow": null + } +] \ No newline at end of file diff --git a/public/data/KLKL.json b/public/data/KLKL.json new file mode 100644 index 0000000..b148249 --- /dev/null +++ b/public/data/KLKL.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 345, + "flow": 0.56 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 344.95, + "flow": 0.56 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 344.99, + "flow": 0.57 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 345.15, + "flow": 0.57 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 345.18, + "flow": 0.55 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 345.18, + "flow": 0.56 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 345.17, + "flow": 0.55 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 345.17, + "flow": 0.56 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 345.17, + "flow": 0.56 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 345.17, + "flow": 0.56 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 345.17, + "flow": 0.56 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 345.16, + "flow": 0.56 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 345.17, + "flow": 0.56 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 345.17, + "flow": 0.56 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 345.17, + "flow": 0.56 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 345.17, + "flow": 0.56 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 345.18, + "flow": 0.56 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 345.18, + "flow": 1.19 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 345.18, + "flow": 1.19 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 345.17, + "flow": 1.18 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 345.17, + "flow": 1.18 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 345.17, + "flow": 1.18 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 345.17, + "flow": 1.19 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 345.16, + "flow": 1.19 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 345.16, + "flow": 1.54 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 345.15, + "flow": 1.56 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 345.15, + "flow": 1.54 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 345.15, + "flow": 1.54 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 345.14, + "flow": 1.54 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 345.14, + "flow": 1.53 + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 345.14, + "flow": 1.53 + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 345.14, + "flow": 1.53 + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 345.14, + "flow": 1.53 + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 345.14, + "flow": 1.53 + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 345.14, + "flow": 1.53 + } +] \ No newline at end of file diff --git a/public/data/LILA.json b/public/data/LILA.json new file mode 100644 index 0000000..2007be1 --- /dev/null +++ b/public/data/LILA.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 640.65, + "flow": 0.01 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 640.65, + "flow": 0.01 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 640.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 640.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 640.67, + "flow": 0.01 + } +] \ No newline at end of file diff --git a/public/data/MARI.json b/public/data/MARI.json new file mode 100644 index 0000000..d3801e9 --- /dev/null +++ b/public/data/MARI.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 467.48, + "flow": 0.9 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 467.44, + "flow": 0.9 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 467.47, + "flow": 0.9 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 467.54, + "flow": 0.7 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 467.58, + "flow": 0.7 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 467.6, + "flow": 0.7 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 467.65, + "flow": 0.7 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 467.66, + "flow": 0.7 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 467.66, + "flow": 0.7 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 467.67, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 467.67, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 467.68, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 467.68, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 467.68, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 467.68, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 467.68, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 467.69, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 467.69, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 467.69, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 467.69, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 467.7, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 467.7, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 467.7, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 467.7, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 467.71, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 467.71, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 467.71, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 467.71, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 467.71, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 467.72, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 467.72, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 467.72, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 467.72, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 467.72, + "flow": 0.7 + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 467.72, + "flow": null + } +] \ No newline at end of file diff --git a/public/data/MZHR.json b/public/data/MZHR.json new file mode 100644 index 0000000..1061801 --- /dev/null +++ b/public/data/MZHR.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 353.02, + "flow": 2.46 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 352.99, + "flow": 2.48 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 352.97, + "flow": 2.48 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 352.95, + "flow": 2.49 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 352.92, + "flow": 2.5 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 352.89, + "flow": 2.52 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 352.88, + "flow": 2.52 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 352.87, + "flow": 2.52 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 352.87, + "flow": 2.52 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 352.87, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 352.87, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 352.87, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 352.87, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 352.87, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 352.87, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 352.87, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 352.87, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 352.87, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 352.86, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 352.86, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 352.86, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 352.86, + "flow": 2.53 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 352.86, + "flow": 2.53 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 352.86, + "flow": 2.53 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 352.86, + "flow": 2.53 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 352.86, + "flow": 2.53 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 352.85, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 352.86, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 352.85, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 352.85, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 352.85, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 352.85, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 352.86, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 352.85, + "flow": 2.52 + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 352.85, + "flow": 2.53 + } +] \ No newline at end of file diff --git a/public/data/MZLU.json b/public/data/MZLU.json new file mode 100644 index 0000000..6062676 --- /dev/null +++ b/public/data/MZLU.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 530.77, + "flow": 0.5 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 530.77, + "flow": 0.48 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 530.76, + "flow": 0.51 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 530.76, + "flow": 0.48 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 530.74, + "flow": 0.48 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 530.72, + "flow": 0.48 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 530.71, + "flow": 0.49 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 530.71, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 530.71, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 530.7, + "flow": 0.49 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 530.7, + "flow": 0.35 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 530.7, + "flow": 0.35 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 530.7, + "flow": 0.35 + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 530.7, + "flow": 0.35 + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 530.7, + "flow": 0.35 + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 530.7, + "flow": 0.35 + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 530.7, + "flow": 0.35 + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 530.7, + "flow": 0.35 + } +] \ No newline at end of file diff --git a/public/data/MZSS.json b/public/data/MZSS.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/public/data/MZSS.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/public/data/OPOB.json b/public/data/OPOB.json new file mode 100644 index 0000000..21b7e50 --- /dev/null +++ b/public/data/OPOB.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 563.6, + "flow": 0.01 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 563.59, + "flow": 0.01 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 563.65, + "flow": 0.02 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 563.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 563.68, + "flow": 0.01 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 563.66, + "flow": 0.01 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 563.66, + "flow": 0.01 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 563.66, + "flow": 0.01 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 563.66, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 563.66, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 563.66, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 563.66, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 563.66, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 563.67, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 563.67, + "flow": null + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 563.67, + "flow": null + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 563.67, + "flow": null + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 563.67, + "flow": null + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 563.67, + "flow": null + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 563.67, + "flow": null + } +] \ No newline at end of file diff --git a/public/data/PPPI.json b/public/data/PPPI.json new file mode 100644 index 0000000..e3821dc --- /dev/null +++ b/public/data/PPPI.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 670.62, + "flow": 0.01 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 670.6, + "flow": 0.01 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 670.61, + "flow": 0.01 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 670.6, + "flow": 0.01 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 670.58, + "flow": 0.01 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 670.57, + "flow": 0.01 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 670.56, + "flow": 0.01 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 670.56, + "flow": null + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 670.56, + "flow": null + } +] \ No newline at end of file diff --git a/public/data/RACU.json b/public/data/RACU.json new file mode 100644 index 0000000..4324e37 --- /dev/null +++ b/public/data/RACU.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 313.38, + "flow": 1.44 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 313.35, + "flow": 1.46 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 313.35, + "flow": 1.35 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 313.44, + "flow": 0.97 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 313.5, + "flow": 0.98 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 313.56, + "flow": 0.99 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 313.59, + "flow": 1.05 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 313.59, + "flow": 0.94 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 313.59, + "flow": 0.94 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 313.59, + "flow": 0.94 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 313.59, + "flow": 0.94 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 313.59, + "flow": 0.95 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 313.6, + "flow": 0.95 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 313.6, + "flow": 0.95 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 313.6, + "flow": 1.12 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 313.59, + "flow": 2.85 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 313.59, + "flow": 3.15 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 313.58, + "flow": 3.11 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 313.58, + "flow": 2.97 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 313.57, + "flow": 2.92 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 313.57, + "flow": 2.9 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 313.56, + "flow": 2.88 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 313.55, + "flow": 2.97 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 313.55, + "flow": 3.07 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 313.54, + "flow": 3.14 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 313.53, + "flow": 3.12 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 313.53, + "flow": 3.12 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 313.52, + "flow": 3.11 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 313.52, + "flow": 3.1 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 313.51, + "flow": 3.1 + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 313.51, + "flow": 3.1 + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 313.51, + "flow": 3.1 + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 313.51, + "flow": 3.1 + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 313.51, + "flow": 3.1 + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 313.51, + "flow": 3.1 + } +] \ No newline at end of file diff --git a/public/data/SPNE.json b/public/data/SPNE.json new file mode 100644 index 0000000..5485a6a --- /dev/null +++ b/public/data/SPNE.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 385, + "flow": 0.01 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 385, + "flow": 0.01 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 385.01, + "flow": 0.05 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 385.01, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 385.01, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 385.01, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 385.01, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 385.01, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 385.01, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 385.01, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 385.01, + "flow": 0.02 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 385.01, + "flow": 0.03 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 385.01, + "flow": 0.04 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 385.01, + "flow": 0.04 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 385.01, + "flow": 0.04 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 385.01, + "flow": 0.04 + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 385.01, + "flow": 0.04 + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 385.01, + "flow": 0.04 + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 385.01, + "flow": 0.04 + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 385.01, + "flow": 0.04 + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 385.01, + "flow": 0.04 + } +] \ No newline at end of file diff --git a/public/data/SVKR.json b/public/data/SVKR.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/public/data/SVKR.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/public/data/UHKA.json b/public/data/UHKA.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/public/data/UHKA.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/public/data/VLL1.json b/public/data/VLL1.json new file mode 100644 index 0000000..7ff32fc --- /dev/null +++ b/public/data/VLL1.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 723.04, + "flow": 1.03 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 723.06, + "flow": 1.03 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 723.08, + "flow": 30.94 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 723.08, + "flow": 1.51 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 723.08, + "flow": 1.49 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 723.08, + "flow": 1.49 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 723.08, + "flow": 1.49 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 723.08, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 723.08, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 723.1, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 723.1, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 723.1, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 723.1, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 723.1, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 723.09, + "flow": 1.49 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 723.09, + "flow": 13.76 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 723.08, + "flow": 34.78 + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 723.09, + "flow": 34.85 + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 723.09, + "flow": 34.87 + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 723.09, + "flow": 34.87 + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 723.09, + "flow": 34.87 + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 723.09, + "flow": 34.87 + } +] \ No newline at end of file diff --git a/public/data/VLOR.json b/public/data/VLOR.json new file mode 100644 index 0000000..72c37fc --- /dev/null +++ b/public/data/VLOR.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 345.7, + "flow": 0 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 345.75, + "flow": 0 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 345.82, + "flow": 0 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 345.76, + "flow": 0 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 345.76, + "flow": 17.77 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 345.67, + "flow": 0 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 345.65, + "flow": 98.84 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 345.59, + "flow": 374.8 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 345.58, + "flow": 97.45 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 345.58, + "flow": 0 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 345.57, + "flow": 0 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 345.59, + "flow": 0 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 345.59, + "flow": 0 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 345.58, + "flow": 0 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 345.6, + "flow": 100.93 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 345.54, + "flow": 284.29 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 345.52, + "flow": 187.15 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 345.53, + "flow": 0 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 345.52, + "flow": 0 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 345.53, + "flow": 0 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 345.54, + "flow": 0 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 345.53, + "flow": 0 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 345.55, + "flow": 0 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 345.54, + "flow": 0 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 345.55, + "flow": 0 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 345.56, + "flow": 0 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 345.55, + "flow": 72.6 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 345.53, + "flow": 186.83 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 345.47, + "flow": 454.38 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 345.39, + "flow": 444.3 + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 345.38, + "flow": 444.26 + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 345.37, + "flow": 443.64 + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 345.36, + "flow": 443.75 + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 345.35, + "flow": 446.81 + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 345.34, + "flow": 444.17 + } +] \ No newline at end of file diff --git a/public/data/VLSL.json b/public/data/VLSL.json new file mode 100644 index 0000000..716d386 --- /dev/null +++ b/public/data/VLSL.json @@ -0,0 +1,177 @@ +[ + { + "timestamp": "2026-05-30T05:00:00.000Z", + "level": 269.85, + "flow": 58.2 + }, + { + "timestamp": "2026-05-31T05:00:00.000Z", + "level": 269.64, + "flow": 0 + }, + { + "timestamp": "2026-06-01T05:00:00.000Z", + "level": 269.47, + "flow": 139.04 + }, + { + "timestamp": "2026-06-02T05:00:00.000Z", + "level": 269.44, + "flow": 13.82 + }, + { + "timestamp": "2026-06-03T05:00:00.000Z", + "level": 269.35, + "flow": 0 + }, + { + "timestamp": "2026-06-04T05:00:00.000Z", + "level": 269.42, + "flow": 26.22 + }, + { + "timestamp": "2026-06-04T20:00:00.000Z", + "level": 269.37, + "flow": 89.57 + }, + { + "timestamp": "2026-06-04T21:00:00.000Z", + "level": 269.42, + "flow": 0 + }, + { + "timestamp": "2026-06-04T22:00:00.000Z", + "level": 269.42, + "flow": 0 + }, + { + "timestamp": "2026-06-04T23:00:00.000Z", + "level": 269.47, + "flow": 0 + }, + { + "timestamp": "2026-06-05T00:00:00.000Z", + "level": 269.5, + "flow": 0 + }, + { + "timestamp": "2026-06-05T01:00:00.000Z", + "level": 269.52, + "flow": 0 + }, + { + "timestamp": "2026-06-05T02:00:00.000Z", + "level": 269.55, + "flow": 0 + }, + { + "timestamp": "2026-06-05T03:00:00.000Z", + "level": 269.57, + "flow": 0 + }, + { + "timestamp": "2026-06-05T04:00:00.000Z", + "level": 269.59, + "flow": 0 + }, + { + "timestamp": "2026-06-05T05:00:00.000Z", + "level": 269.62, + "flow": 58.26 + }, + { + "timestamp": "2026-06-05T06:00:00.000Z", + "level": 269.64, + "flow": 0 + }, + { + "timestamp": "2026-06-05T07:00:00.000Z", + "level": 269.67, + "flow": 0 + }, + { + "timestamp": "2026-06-05T08:00:00.000Z", + "level": 269.66, + "flow": 0 + }, + { + "timestamp": "2026-06-05T09:00:00.000Z", + "level": 269.67, + "flow": 0 + }, + { + "timestamp": "2026-06-05T10:00:00.000Z", + "level": 269.65, + "flow": 0 + }, + { + "timestamp": "2026-06-05T11:00:00.000Z", + "level": 269.66, + "flow": 0 + }, + { + "timestamp": "2026-06-05T12:00:00.000Z", + "level": 269.65, + "flow": 0 + }, + { + "timestamp": "2026-06-05T13:00:00.000Z", + "level": 269.66, + "flow": 0 + }, + { + "timestamp": "2026-06-05T14:00:00.000Z", + "level": 269.66, + "flow": 0 + }, + { + "timestamp": "2026-06-05T15:00:00.000Z", + "level": 269.66, + "flow": 0 + }, + { + "timestamp": "2026-06-05T16:00:00.000Z", + "level": 269.66, + "flow": 0 + }, + { + "timestamp": "2026-06-05T17:00:00.000Z", + "level": 269.65, + "flow": 119.44 + }, + { + "timestamp": "2026-06-05T18:00:00.000Z", + "level": 269.65, + "flow": 137.14 + }, + { + "timestamp": "2026-06-05T19:00:00.000Z", + "level": 269.75, + "flow": 310.27 + }, + { + "timestamp": "2026-06-05T19:10:00.000Z", + "level": 269.76, + "flow": 311.12 + }, + { + "timestamp": "2026-06-05T19:20:00.000Z", + "level": 269.74, + "flow": 312.38 + }, + { + "timestamp": "2026-06-05T19:30:00.000Z", + "level": 269.74, + "flow": 312.7 + }, + { + "timestamp": "2026-06-05T19:40:00.000Z", + "level": 269.75, + "flow": 313.15 + }, + { + "timestamp": "2026-06-05T19:50:00.000Z", + "level": 269.76, + "flow": 312.56 + } +] \ No newline at end of file diff --git a/public/data/VRSN.json b/public/data/VRSN.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/public/data/VRSN.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/public/data/ZLUT.json b/public/data/ZLUT.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/public/data/ZLUT.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/public/data/lakes_index.json b/public/data/lakes_index.json index 7e1abe1..d96451d 100644 --- a/public/data/lakes_index.json +++ b/public/data/lakes_index.json @@ -4,74 +4,80 @@ "name": "Lipno 1", "river": "Vltava", "priority": true, - "level": "425.08", - "capacity": 70, - "inflow": "16.4", - "outflow": "9.2", - "volume": "4.8", + "level": "723.09", + "capacity": 0, + "inflow": "34.9", + "outflow": "34.9", + "volume": 306, + "lat": 48.6322, + "lng": 14.2215, "sparkline": [ - 67.76386679783151, - 65.95710155663546, - 63.20513373379467, - 66.0023871955494, - 60.5840537200827, - 56.44062304744854, - 61.53723544107122, - 56.534701757813835, - 67.7156785390622, - 60.94718751940314, - 56.95958904718667, - 69.77106846967854 + 1.49, + 1.49, + 1.49, + 1.49, + 1.49, + 13.76, + 34.78, + 34.85, + 34.87, + 34.87, + 34.87, + 34.87 ] }, { - "id": "VLOR|1", + "id": "VLOR|2", "name": "Orlík", "river": "Vltava", "priority": true, - "level": "348.09", - "capacity": 98, - "inflow": "0.4", - "outflow": "15.2", - "volume": "142.2", + "level": "345.34", + "capacity": 0, + "inflow": "444.2", + "outflow": "444.2", + "volume": 716.5, + "lat": 49.606, + "lng": 14.17, "sparkline": [ - 58.71563701563615, - 53.870674018588446, - 55.91017266394625, - 56.21999075347275, - 58.60066035927852, - 66.20899899814442, - 51.26022980835229, - 55.15528349804671, - 51.47224965524346, - 64.86087543062779, - 58.71538821078879, - 68.78224642828326 + 0, + 0, + 0, + 72.6, + 186.83, + 454.38, + 444.3, + 444.26, + 443.64, + 443.75, + 446.81, + 444.17 ] }, { - "id": "VLSL|1", + "id": "VLSL|2", "name": "Slapy", "river": "Vltava", "priority": false, - "level": "312.12", - "capacity": 40, - "inflow": "14.2", - "outflow": "11.5", - "volume": "80.5", + "level": "269.76", + "capacity": 0, + "inflow": "312.6", + "outflow": "312.6", + "volume": 269.3, + "lat": 49.822, + "lng": 14.436, "sparkline": [ - 63.29415099470265, - 55.55116076273065, - 52.1821951008551, - 57.66304790009582, - 57.5177505031316, - 66.21926737684231, - 61.17260724900234, - 54.61688395129716, - 57.4811170608418, - 58.08770659727022, - 59.05633758447969, - 69.01600576041082 + 0, + 0, + 0, + 0, + 119.44, + 137.14, + 310.27, + 311.12, + 312.38, + 312.7, + 313.15, + 312.56 ] }, { @@ -79,24 +85,26 @@ "name": "Husinec", "river": "Blanice (PI)", "priority": false, - "level": "234.58", - "capacity": 87, - "inflow": "18.8", - "outflow": "2.9", - "volume": "80.1", + "level": "521.23", + "capacity": 0, + "inflow": "0.6", + "outflow": "0.6", + "volume": 6.9, + "lat": 49.052, + "lng": 13.983, "sparkline": [ - 56.71954513622617, - 61.091932349671325, - 59.80532801225829, - 67.85878677793427, - 50.412019755017766, - 69.6989038396205, - 68.89863260571298, - 51.15711691840132, - 66.29081770476003, - 67.82776648615442, - 53.73438145481692, - 55.62004696641291 + 0.65, + 0.64, + 0.64, + 0.64, + 0.65, + 0.62, + 0.65, + 0.63, + 0.65, + 0.64, + 0.65, + 0.64 ] }, { @@ -104,24 +112,26 @@ "name": "Bílsko", "river": "Bílský potok", "priority": false, - "level": "613.09", - "capacity": 25, - "inflow": "0.3", - "outflow": "4.4", - "volume": "279.8", + "level": "463.42", + "capacity": 0, + "inflow": "0.0", + "outflow": "0.0", + "volume": 0, + "lat": 49.191, + "lng": 14.053, "sparkline": [ - 58.06235557673482, - 67.65285434744484, - 51.18732342455498, - 55.540670530667256, - 65.0168407888213, - 65.13558215812759, - 67.10121835982773, - 69.05010678392236, - 67.97857238976994, - 52.45683679844072, - 54.57735482391635, - 58.30228641285429 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ] }, { @@ -129,24 +139,26 @@ "name": "Dolejší Padrťský rybník", "river": "", "priority": false, - "level": "301.41", - "capacity": 46, - "inflow": "15.7", - "outflow": "16.8", - "volume": "269.5", + "level": "632.77", + "capacity": 0, + "inflow": "0.0", + "outflow": "0.0", + "volume": 0, + "lat": 49.664, + "lng": 13.766, "sparkline": [ - 52.545483051914445, - 52.353205236509375, - 51.14982411484838, - 52.17717896649951, - 59.6512971713952, - 68.99511713026922, - 66.08615462949119, - 55.85690844992684, - 56.27360544509149, - 56.59801556550044, - 62.98638733107289, - 60.33620944248045 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ] }, { @@ -154,24 +166,26 @@ "name": "Hořejší Padrťský rybník", "river": "", "priority": false, - "level": "537.82", - "capacity": 20, - "inflow": "11.2", - "outflow": "14.2", - "volume": "19.9", + "level": "635.70", + "capacity": 0, + "inflow": "0.0", + "outflow": "0.0", + "volume": 0, + "lat": 49.654, + "lng": 13.784, "sparkline": [ - 64.01864889797992, - 55.474009694400515, - 67.3293951963569, - 68.08807727206008, - 69.0256089886299, - 52.99173640361107, - 67.87009523659883, - 58.87316632448774, - 59.33409663232173, - 69.54799887595104, - 59.59158889523327, - 55.63021846937998 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ] }, { @@ -179,24 +193,26 @@ "name": "Klabava", "river": "Klabava", "priority": false, - "level": "254.33", - "capacity": 52, - "inflow": "4.6", - "outflow": "10.6", - "volume": "167.6", + "level": "345.14", + "capacity": 0, + "inflow": "1.5", + "outflow": "1.5", + "volume": 0, + "lat": 49.756, + "lng": 13.565, "sparkline": [ - 65.40004821798294, - 51.96089697098432, - 56.47953881852548, - 66.1556303979774, - 68.44507798677921, - 58.3006245729297, - 61.85024039387675, - 58.82434022970376, - 56.42542531145891, - 53.91237088172875, - 68.9897974553115, - 66.5148236081013 + 1.19, + 1.54, + 1.56, + 1.54, + 1.54, + 1.54, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53, + 1.53 ] }, { @@ -204,24 +220,26 @@ "name": "Klíčava", "river": "Klíčava", "priority": false, - "level": "580.58", - "capacity": 61, - "inflow": "1.4", - "outflow": "13.0", - "volume": "92.7", + "level": "292.91", + "capacity": 0, + "inflow": "0.0", + "outflow": "0.0", + "volume": 8.3, + "lat": 50.065, + "lng": 13.929, "sparkline": [ - 53.52539101836046, - 65.5283627369559, - 58.77538110769939, - 66.16395108831716, - 63.73678223585735, - 53.40305874814205, - 63.714206626805314, - 69.3377505568833, - 53.14085826498234, - 62.622946483487446, - 53.12657029965658, - 69.99907842296204 + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0.02, + 0, + 0, + 0, + 0, + 0 ] }, { @@ -229,24 +247,26 @@ "name": "Láz", "river": "Litavka", "priority": false, - "level": "572.44", - "capacity": 35, - "inflow": "2.7", - "outflow": "1.3", - "volume": "41.0", + "level": "640.67", + "capacity": 0, + "inflow": "0.0", + "outflow": "0.0", + "volume": 0, + "lat": 49.667, + "lng": 13.882, "sparkline": [ - 57.06058907985466, - 65.93061892844979, - 69.82519489051512, - 59.61013388966063, - 56.4006825459655, - 65.99393820707627, - 69.21166517530426, - 64.90926630353279, - 50.48521113624516, - 66.92997306902286, - 50.41980948175885, - 63.59520543305413 + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01 ] }, { @@ -254,24 +274,26 @@ "name": "Římov", "river": "Malše", "priority": false, - "level": "693.45", - "capacity": 71, - "inflow": "5.5", - "outflow": "16.6", - "volume": "117.0", + "level": "467.72", + "capacity": 0, + "inflow": "0.7", + "outflow": "0.7", + "volume": 33.8, + "lat": 48.847, + "lng": 14.487, "sparkline": [ - 58.83021654908006, - 69.04714973465147, - 66.14999842318753, - 63.102461348893314, - 69.8872055811859, - 56.29118213192195, - 57.33251560319101, - 56.03900492254181, - 62.89590766213057, - 63.99285163055102, - 50.052511902997715, - 69.16089839265223 + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0 ] }, { @@ -279,24 +301,26 @@ "name": "Hracholusky", "river": "Mže", "priority": false, - "level": "432.32", - "capacity": 76, - "inflow": "9.0", - "outflow": "11.5", - "volume": "257.6", + "level": "352.85", + "capacity": 0, + "inflow": "2.5", + "outflow": "2.5", + "volume": 56.7, + "lat": 49.789, + "lng": 13.155, "sparkline": [ - 61.0318213223539, - 66.38411819290904, - 56.8935132468659, - 62.49816200180909, - 69.16388320303746, - 69.7266031209071, - 63.60109706790021, - 66.832231338331, - 55.503631225791544, - 69.00110813057994, - 60.837290882605025, - 69.94446164736605 + 2.53, + 2.53, + 2.53, + 2.52, + 2.52, + 2.52, + 2.52, + 2.52, + 2.52, + 2.52, + 2.52, + 2.53 ] }, { @@ -304,24 +328,26 @@ "name": "Lučina", "river": "Mže", "priority": false, - "level": "557.64", - "capacity": 28, - "inflow": "16.4", - "outflow": "7.5", - "volume": "137.2", + "level": "530.70", + "capacity": 0, + "inflow": "0.3", + "outflow": "0.3", + "volume": 0, + "lat": 49.8, + "lng": 12.61, "sparkline": [ - 55.27597200087354, - 65.98332007198918, - 51.39644532238694, - 55.467111102305466, - 64.65279325533882, - 68.11081910175116, - 58.558786379382695, - 56.0176963298879, - 63.57296836738223, - 68.00266272222855, - 60.813629047442426, - 53.60676111826893 + 0.49, + 0.49, + 0.49, + 0.49, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35, + 0.35 ] }, { @@ -329,24 +355,26 @@ "name": "Plzeň", "river": "Štruncovy sady", "priority": false, - "level": "620.14", - "capacity": 34, - "inflow": "18.7", - "outflow": "6.3", - "volume": "153.1", + "level": "0.00", + "capacity": 0, + "inflow": "0.0", + "outflow": "0.0", + "volume": 0, + "lat": 49.751, + "lng": 13.385, "sparkline": [ - 51.026463877353166, - 69.21289099259506, - 66.59710210509151, - 51.247840359768006, - 68.85239879391202, - 50.544979500657604, - 52.93744044550747, - 63.943680684100286, - 62.84936714550969, - 62.08648335853005, - 50.63351443822431, - 57.10348554202507 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ] }, { @@ -354,24 +382,26 @@ "name": "Obecnice", "river": "Obecnický potok", "priority": false, - "level": "300.60", - "capacity": 96, - "inflow": "19.4", - "outflow": "16.0", - "volume": "276.6", + "level": "563.67", + "capacity": 0, + "inflow": "0.0", + "outflow": "0.0", + "volume": 0, + "lat": 49.721, + "lng": 13.945, "sparkline": [ - 51.80758183280685, - 50.913604779247244, - 52.34177829156166, - 59.515758599338646, - 67.97743918523307, - 66.10899524650429, - 55.272451446557696, - 54.97657465742287, - 56.59103431339752, - 65.20385899997699, - 67.29158471879981, - 59.92673248776396 + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0.01, + 0, + 0, + 0, + 0, + 0, + 0 ] }, { @@ -379,24 +409,26 @@ "name": "Pilská", "river": "Pilský potok", "priority": false, - "level": "606.45", - "capacity": 49, - "inflow": "11.9", + "level": "670.56", + "capacity": 0, + "inflow": "0.0", "outflow": "0.0", - "volume": "202.2", + "volume": 0, + "lat": 49.676, + "lng": 13.896, "sparkline": [ - 61.77284171942533, - 68.26570270893097, - 69.12184554549876, - 64.52328835536215, - 54.710193736751435, - 50.167571376475514, - 59.447408379132625, - 56.93444045299297, - 55.70274450646396, - 53.9556172733789, - 58.95216473179255, - 68.52487248520859 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ] }, { @@ -404,24 +436,26 @@ "name": "České Údolí", "river": "Radbuza", "priority": false, - "level": "253.11", - "capacity": 74, - "inflow": "12.6", - "outflow": "7.3", - "volume": "106.3", + "level": "313.51", + "capacity": 0, + "inflow": "3.1", + "outflow": "3.1", + "volume": 0, + "lat": 49.711, + "lng": 13.361, "sparkline": [ - 66.38801929859419, - 50.92756858622137, - 65.93054788137624, - 54.93723153153, - 66.31138835168656, - 66.31742774654356, - 66.14822580156607, - 55.94374018233996, - 55.27579249002968, - 52.72384685748912, - 66.89809733134666, - 65.21647505764265 + 3.07, + 3.14, + 3.12, + 3.12, + 3.11, + 3.1, + 3.1, + 3.1, + 3.1, + 3.1, + 3.1, + 3.1 ] }, { @@ -429,99 +463,107 @@ "name": "Němčice", "river": "Sedlický potok", "priority": false, - "level": "300.42", - "capacity": 46, - "inflow": "17.1", - "outflow": "15.2", - "volume": "165.1", + "level": "385.01", + "capacity": 0, + "inflow": "0.0", + "outflow": "0.0", + "volume": 0, + "lat": 49.605, + "lng": 15.228, "sparkline": [ - 52.92115958251769, - 60.34379716724986, - 52.32508835150077, - 68.20218907061512, - 53.35979907071966, - 68.73121541224904, - 66.17573033842996, - 65.7645008809001, - 50.52374601777196, - 60.87754074741652, - 55.04726124073101, - 63.88754004974744 + 0.03, + 0.03, + 0.03, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04, + 0.04 ] }, { - "id": "SVKR|1", + "id": "SVKR|2", "name": "Švihov", "river": "Želivka", "priority": false, - "level": "299.26", - "capacity": 82, - "inflow": "5.4", - "outflow": "12.2", - "volume": "263.4", + "level": "0.00", + "capacity": 0, + "inflow": "0.0", + "outflow": "0.0", + "volume": 266.6, + "lat": 49.718, + "lng": 15.106, "sparkline": [ - 68.19387353120321, - 56.06874981561845, - 62.28286557334625, - 50.441188413667234, - 51.491459715568126, - 54.65821546570079, - 61.63051303861556, - 67.00900188449286, - 63.20637915644665, - 54.66090510676903, - 61.59064299419725, - 69.65093929773614 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ] }, { - "id": "UHKA|1", + "id": "UHKA|2", "name": "Kamýk", "river": "Vltava", "priority": false, - "level": "320.00", - "capacity": 24, - "inflow": "17.2", - "outflow": "10.1", - "volume": "197.0", + "level": "0.00", + "capacity": 0, + "inflow": "0.0", + "outflow": "0.0", + "volume": 12.8, + "lat": 49.636, + "lng": 14.254, "sparkline": [ - 57.81444095954401, - 65.19279069030925, - 67.51146858864206, - 54.97860459537565, - 69.77356466021251, - 50.71716736585621, - 64.86948797829135, - 56.504223088087336, - 66.05310947110375, - 52.76431498443484, - 64.10934532531321, - 66.81834042761787 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ] }, { - "id": "VRSN|1", + "id": "VRSN|2", "name": "Vrané", "river": "Vltava", "priority": false, - "level": "266.65", - "capacity": 51, - "inflow": "1.5", - "outflow": "6.1", - "volume": "78.4", + "level": "0.00", + "capacity": 0, + "inflow": "0.0", + "outflow": "0.0", + "volume": 11.1, + "lat": 49.934, + "lng": 14.385, "sparkline": [ - 66.25766509291026, - 67.86633637312278, - 63.18984654255752, - 68.10189883983175, - 66.78628349434302, - 60.09504005656531, - 54.63003021350735, - 66.4136800954575, - 64.11912051851832, - 60.42071793008188, - 54.62685356739905, - 54.06460175630427 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ] }, { @@ -529,474 +571,26 @@ "name": "Žlutice", "river": "Střela", "priority": false, - "level": "324.72", - "capacity": 36, - "inflow": "10.7", - "outflow": "4.0", - "volume": "34.3", + "level": "0.00", + "capacity": 0, + "inflow": "0.0", + "outflow": "0.0", + "volume": 0, + "lat": 50.093, + "lng": 13.159, "sparkline": [ - 60.50728688755656, - 60.571721233017094, - 67.19263759674399, - 64.93978236318972, - 63.250476817534086, - 57.89306271495487, - 69.37685777064492, - 63.80767388026817, - 57.469477868915305, - 69.57072993413615, - 52.32068710664375, - 63.01690162772619 - ] - }, - { - "id": "DUMMY0", - "name": "Dummy Lake 1", - "river": "", - "priority": false, - "level": "535.34", - "capacity": 23, - "inflow": "14.7", - "outflow": "8.6", - "volume": "27.3", - "sparkline": [ - 65.04339440159312, - 51.81792209427638, - 65.0040867159182, - 57.930268522181805, - 67.27954738428926, - 50.92124390789174, - 53.99435257335414, - 50.091348232281604, - 57.02950101293828, - 56.12380048912271, - 69.72083995404837, - 59.015095960428404 - ] - }, - { - "id": "DUMMY1", - "name": "Dummy Lake 2", - "river": "", - "priority": false, - "level": "596.97", - "capacity": 59, - "inflow": "14.7", - "outflow": "1.9", - "volume": "37.6", - "sparkline": [ - 68.68207117080661, - 57.72114421004795, - 66.12532440176388, - 67.18222014013793, - 62.501436970687216, - 59.18196453179181, - 66.65271044374828, - 67.14834090202466, - 50.28903497307282, - 64.7723040529394, - 51.35121032526583, - 61.95661832889127 - ] - }, - { - "id": "DUMMY2", - "name": "Dummy Lake 3", - "river": "", - "priority": false, - "level": "634.45", - "capacity": 46, - "inflow": "14.8", - "outflow": "0.4", - "volume": "283.8", - "sparkline": [ - 52.94377831112413, - 53.852296368946995, - 51.11639286082665, - 60.86704421891123, - 68.70555022953468, - 58.38519825730452, - 67.99445243955176, - 60.823161672222795, - 60.41064479958568, - 52.650769186684876, - 59.69862901182614, - 56.28797067060973 - ] - }, - { - "id": "DUMMY3", - "name": "Dummy Lake 4", - "river": "", - "priority": false, - "level": "437.70", - "capacity": 87, - "inflow": "4.3", - "outflow": "4.5", - "volume": "23.5", - "sparkline": [ - 54.23448742672566, - 51.14299486045987, - 61.10269954950172, - 61.683461863433514, - 53.76173298542013, - 59.76264440790218, - 61.3018747835878, - 69.84423654496568, - 58.44997408336737, - 63.39263492517792, - 65.40943863313629, - 52.06927169281634 - ] - }, - { - "id": "DUMMY4", - "name": "Dummy Lake 5", - "river": "", - "priority": false, - "level": "278.34", - "capacity": 73, - "inflow": "5.0", - "outflow": "7.5", - "volume": "103.7", - "sparkline": [ - 68.63069477607222, - 50.7588623822277, - 58.46069465871076, - 55.54818662810651, - 52.38194753610323, - 56.17802163984133, - 64.90185701341984, - 68.53234232708633, - 66.45081878736204, - 51.23043343523719, - 50.049502528843604, - 57.98828223130165 - ] - }, - { - "id": "DUMMY5", - "name": "Dummy Lake 6", - "river": "", - "priority": false, - "level": "433.27", - "capacity": 78, - "inflow": "9.9", - "outflow": "8.9", - "volume": "112.9", - "sparkline": [ - 57.53754950799033, - 65.33768650490822, - 63.1965328451669, - 59.785759616395026, - 55.91137079527809, - 54.85348709816782, - 65.99420481406874, - 50.90673917196653, - 64.15013896525862, - 57.78454509680696, - 68.95103249850256, - 63.1718164094484 - ] - }, - { - "id": "DUMMY6", - "name": "Dummy Lake 7", - "river": "", - "priority": false, - "level": "453.24", - "capacity": 32, - "inflow": "8.9", - "outflow": "3.6", - "volume": "133.2", - "sparkline": [ - 58.9386162172389, - 66.63281625896425, - 61.61984967271001, - 56.581013392462836, - 67.5931194583979, - 61.4888862335321, - 60.38737526900304, - 54.65530198467208, - 57.752489711570504, - 54.65112540077021, - 59.21838564148735, - 53.494301762403815 - ] - }, - { - "id": "DUMMY7", - "name": "Dummy Lake 8", - "river": "", - "priority": false, - "level": "432.67", - "capacity": 90, - "inflow": "14.3", - "outflow": "12.9", - "volume": "30.8", - "sparkline": [ - 63.46035230599749, - 62.69987463370222, - 69.91650805031863, - 58.851569119593606, - 50.74848300043832, - 67.71909618828886, - 69.41827792517579, - 58.297349069796795, - 65.27091102495903, - 68.30314221808526, - 69.38315347923536, - 56.394632491462275 - ] - }, - { - "id": "DUMMY8", - "name": "Dummy Lake 9", - "river": "", - "priority": false, - "level": "342.94", - "capacity": 41, - "inflow": "17.9", - "outflow": "3.4", - "volume": "63.1", - "sparkline": [ - 69.30912562561709, - 65.08167785026619, - 54.57475044325925, - 66.77223329485813, - 69.30197025827735, - 64.56847335932635, - 69.6682374799839, - 51.481052220775055, - 55.9025851145313, - 53.1158411372365, - 55.20745082567769, - 57.27568202095375 - ] - }, - { - "id": "DUMMY9", - "name": "Dummy Lake 10", - "river": "", - "priority": false, - "level": "314.49", - "capacity": 45, - "inflow": "12.0", - "outflow": "2.5", - "volume": "52.3", - "sparkline": [ - 54.6288922694291, - 59.77595914149052, - 53.108042197651095, - 61.42469116333626, - 67.70259938565589, - 57.84304399798706, - 65.63730790148405, - 63.773026727408336, - 61.42711380639432, - 60.89283147254173, - 59.509373610549254, - 66.47545129261894 - ] - }, - { - "id": "DUMMY10", - "name": "Dummy Lake 11", - "river": "", - "priority": false, - "level": "404.41", - "capacity": 40, - "inflow": "16.5", - "outflow": "13.7", - "volume": "15.6", - "sparkline": [ - 67.54250269822809, - 68.46823960966596, - 54.08608727749021, - 69.25797744337933, - 66.88370729626189, - 62.65174760880342, - 58.48863859930501, - 55.39540656236121, - 53.48285441507698, - 57.039630892703556, - 53.36912957544506, - 64.50477786995091 - ] - }, - { - "id": "DUMMY11", - "name": "Dummy Lake 12", - "river": "", - "priority": false, - "level": "667.48", - "capacity": 96, - "inflow": "11.5", - "outflow": "7.9", - "volume": "205.6", - "sparkline": [ - 54.58003662730888, - 64.38542261673138, - 57.23197667088341, - 50.07608626309677, - 61.3750548469042, - 52.180532315176976, - 68.47124194836304, - 60.482433900873325, - 64.37143055453797, - 54.79721558043927, - 62.72239245747879, - 65.23642626335672 - ] - }, - { - "id": "DUMMY12", - "name": "Dummy Lake 13", - "river": "", - "priority": false, - "level": "255.39", - "capacity": 54, - "inflow": "8.2", - "outflow": "8.3", - "volume": "152.9", - "sparkline": [ - 53.33036870569716, - 67.50401591735736, - 50.66143455780063, - 55.771199778143654, - 63.163838180155636, - 55.31812583744981, - 66.42750321105251, - 54.41331548769276, - 64.6843178738275, - 68.92995225054463, - 61.7149302018298, - 57.025211437824744 - ] - }, - { - "id": "DUMMY13", - "name": "Dummy Lake 14", - "river": "", - "priority": false, - "level": "471.51", - "capacity": 29, - "inflow": "7.0", - "outflow": "7.2", - "volume": "55.4", - "sparkline": [ - 51.557590889973966, - 56.593820508079446, - 67.83257636971526, - 53.10312889164916, - 59.56095629927104, - 53.632548932439235, - 69.3960515815213, - 68.3661275839249, - 58.986984196612646, - 57.56121628766655, - 64.42706506155582, - 57.41146451559014 - ] - }, - { - "id": "DUMMY14", - "name": "Dummy Lake 15", - "river": "", - "priority": false, - "level": "615.00", - "capacity": 80, - "inflow": "9.9", - "outflow": "18.1", - "volume": "69.7", - "sparkline": [ - 66.78842218901073, - 64.53955951810194, - 56.693313655702, - 53.93998829507474, - 61.11313084131694, - 55.54314369927277, - 63.58406399538163, - 64.71638760810865, - 51.38219118175706, - 66.31628629951146, - 67.92905602682598, - 61.89059657597156 - ] - }, - { - "id": "DUMMY15", - "name": "Dummy Lake 16", - "river": "", - "priority": false, - "level": "223.15", - "capacity": 56, - "inflow": "18.9", - "outflow": "4.4", - "volume": "266.1", - "sparkline": [ - 67.14603431314623, - 57.85358313936286, - 65.87048639407044, - 59.59389408526102, - 65.29895173600143, - 64.90059621300219, - 58.785128715498786, - 65.96374275733118, - 53.3194555934297, - 54.62115493654516, - 58.217571903549974, - 67.34432535581874 - ] - }, - { - "id": "DUMMY16", - "name": "Dummy Lake 17", - "river": "", - "priority": false, - "level": "618.34", - "capacity": 49, - "inflow": "4.7", - "outflow": "15.3", - "volume": "165.5", - "sparkline": [ - 60.39584486623572, - 56.39339260598456, - 51.301454942884725, - 63.45374328347539, - 51.90017615268565, - 54.8206008395655, - 60.969885974640185, - 63.76317502891858, - 57.69829599917726, - 50.54195840193193, - 67.90143133393913, - 56.30999255024762 - ] - }, - { - "id": "DUMMY17", - "name": "Dummy Lake 18", - "river": "", - "priority": false, - "level": "473.36", - "capacity": 75, - "inflow": "16.6", - "outflow": "0.6", - "volume": "38.5", - "sparkline": [ - 58.27729970784325, - 55.23607648767944, - 69.37700706476275, - 64.67260599880082, - 66.86112541803726, - 53.53523076852803, - 52.09283560845608, - 69.90982719993283, - 54.15522770253627, - 51.95319849033757, - 68.31515258414208, - 53.63944260385013 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ] } ] \ No newline at end of file diff --git a/scripts/buildIndex.ts b/scripts/buildIndex.ts new file mode 100644 index 0000000..beb77bd --- /dev/null +++ b/scripts/buildIndex.ts @@ -0,0 +1,62 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { lakesConfig } from './lakesConfig'; + +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); + + if (fs.existsSync(DATA_FILE)) { + try { + const data: DataRecord[] = 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.flow === null || isNaN(d.flow) ? 0 : d.flow)); + + // Pad with zeros if less than 12 + while (sparkline.length < 12) { + sparkline.unshift(0); + } + } + } catch (e) { + console.error(`Error reading data for ${internalId}`, e); + } + } + + return { + id: lake.id, + name: lake.text.replace('VD ', '').split('-')[0].trim(), + river: lake.text.includes('-') ? lake.text.split('-')[1].trim() : '', + priority: lake.priority || false, + level: currentLevel.toFixed(2), + capacity: 0, // Removed fake capacity + inflow: currentFlow.toFixed(1), + outflow: currentFlow.toFixed(1), + volume: lake.maxVolume || 0, // Using real maxVolume if known + lat: lake.coords[0], + lng: lake.coords[1], + sparkline + }; +}); + +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); diff --git a/scripts/generateMockLakes.ts b/scripts/generateMockLakes.ts deleted file mode 100644 index b380981..0000000 --- a/scripts/generateMockLakes.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; - -interface LakeRaw { - id: string; - text: string; - priority?: boolean; -} - -const lakesRaw: LakeRaw[] = [ - { id: "VLL1|1", text: "VD Lipno 1 - Vltava", priority: true }, - { id: "VLOR|1", text: "VD Orlík - Vltava", priority: true }, - { id: "VLSL|1", text: "VD Slapy - Vltava", priority: false }, - { id: "BLHU|1", text: "VD Husinec - Blanice (PI)" }, - { id: "BIBI|1", text: "VD Bílsko - Bílský potok" }, - { id: "KLDP|3", text: "VD Dolejší Padrťský rybník" }, - { id: "KLHP|3", text: "VD Hořejší Padrťský rybník" }, - { id: "KLKL|3", text: "VD Klabava - Klabava" }, - { id: "KCKC|3", "text": "VD Klíčava - Klíčava" }, - { id: "LILA|3", "text": "VD Láz - Litavka" }, - { id: "MARI|1", "text": "VD Římov - Malše" }, - { id: "MZHR|3", "text": "VD Hracholusky - Mže" }, - { id: "MZLU|3", "text": "VD Lučina - Mže" }, - { id: "MZSS|3", "text": "VD Plzeň-Štruncovy sady" }, - { id: "OPOB|3", "text": "VD Obecnice - Obecnický potok" }, - { id: "PPPI|3", "text": "VD Pilská - Pilský potok" }, - { id: "RACU|3", "text": "VD České Údolí - Radbuza" }, - { id: "SPNE|2", "text": "VD Němčice - Sedlický potok" }, - { id: "SVKR|1", "text": "VD Švihov - Želivka" }, - { id: "UHKA|1", "text": "VD Kamýk - Vltava" }, - { id: "VRSN|1", "text": "VD Vrané - Vltava" }, - { id: "ZLUT|3", "text": "VD Žlutice - Střela" }, - // Adding dummies to reach ~40 - ...Array.from({length: 18}).map((_, i) => ({ id: `DUMMY${i}`, text: `VD Dummy Lake ${i+1}` })) -]; - -const lakes = lakesRaw.map(lake => { - const sparkline = Array.from({length: 12}).map(() => 50 + Math.random() * 20); - return { - id: lake.id, - name: lake.text.replace('VD ', '').split('-')[0].trim(), - river: lake.text.includes('-') ? lake.text.split('-')[1].trim() : '', - priority: lake.priority || false, - level: (200 + Math.random() * 500).toFixed(2), - capacity: Math.floor(20 + Math.random() * 80), // 20% to 100% - inflow: (Math.random() * 20).toFixed(1), - outflow: (Math.random() * 20).toFixed(1), - volume: (Math.random() * 300).toFixed(1), - sparkline - }; -}); - -const outputPath = path.resolve(process.cwd(), 'public/data/lakes_index.json'); -fs.writeFileSync(outputPath, JSON.stringify(lakes, null, 2)); -console.log('Mock lakes generated:', lakes.length); diff --git a/scripts/lakesConfig.ts b/scripts/lakesConfig.ts new file mode 100644 index 0000000..ed8bee0 --- /dev/null +++ b/scripts/lakesConfig.ts @@ -0,0 +1,31 @@ +export interface LakeConfig { + id: string; + text: string; + priority?: boolean; + coords: [number, number]; +} + +export const lakesConfig: LakeConfig[] = [ + { id: "VLL1|1", text: "VD Lipno 1 - Vltava", priority: true, coords: [48.6322, 14.2215], maxVolume: 306.0 }, + { id: "VLOR|2", text: "VD Orlík - Vltava", priority: true, coords: [49.6060, 14.1700], maxVolume: 716.5 }, + { id: "VLSL|2", text: "VD Slapy - Vltava", priority: false, coords: [49.8220, 14.4360], maxVolume: 269.3 }, + { id: "BLHU|1", text: "VD Husinec - Blanice (PI)", coords: [49.0520, 13.9830], maxVolume: 6.9 }, + { id: "BIBI|1", text: "VD Bílsko - Bílský potok", coords: [49.1910, 14.0530] }, + { id: "KLDP|3", text: "VD Dolejší Padrťský rybník", coords: [49.6640, 13.7660] }, + { id: "KLHP|3", text: "VD Hořejší Padrťský rybník", coords: [49.6540, 13.7840] }, + { id: "KLKL|3", text: "VD Klabava - Klabava", coords: [49.7560, 13.5650] }, + { id: "KCKC|3", "text": "VD Klíčava - Klíčava", coords: [50.0650, 13.9290], maxVolume: 8.3 }, + { id: "LILA|3", text: "VD Láz - Litavka", coords: [49.6670, 13.8820] }, + { id: "MARI|1", text: "VD Římov - Malše", coords: [48.8470, 14.4870], maxVolume: 33.8 }, + { id: "MZHR|3", text: "VD Hracholusky - Mže", coords: [49.7890, 13.1550], maxVolume: 56.7 }, + { id: "MZLU|3", text: "VD Lučina - Mže", coords: [49.8000, 12.6100] }, + { id: "MZSS|3", text: "VD Plzeň-Štruncovy sady", coords: [49.7510, 13.3850] }, + { id: "OPOB|3", "text": "VD Obecnice - Obecnický potok", coords: [49.7210, 13.9450] }, + { id: "PPPI|3", "text": "VD Pilská - Pilský potok", coords: [49.6760, 13.8960] }, + { id: "RACU|3", "text": "VD České Údolí - Radbuza", coords: [49.7110, 13.3610] }, + { id: "SPNE|2", "text": "VD Němčice - Sedlický potok", coords: [49.6050, 15.2280] }, + { id: "SVKR|2", "text": "VD Švihov - Želivka", coords: [49.7180, 15.1060], maxVolume: 266.6 }, + { id: "UHKA|2", "text": "VD Kamýk - Vltava", coords: [49.6360, 14.2540], maxVolume: 12.8 }, + { id: "VRSN|2", "text": "VD Vrané - Vltava", coords: [49.9340, 14.3850], maxVolume: 11.1 }, + { id: "ZLUT|3", "text": "VD Žlutice - Střela", coords: [50.0930, 13.1590] } +]; diff --git a/scripts/scrapeLipno.ts b/scripts/scrapeLakes.ts similarity index 70% rename from scripts/scrapeLipno.ts rename to scripts/scrapeLakes.ts index 40e5580..f72b46a 100644 --- a/scripts/scrapeLipno.ts +++ b/scripts/scrapeLakes.ts @@ -3,9 +3,7 @@ import * as path from 'path'; import * as cheerio from 'cheerio'; import axios from 'axios'; import https from 'https'; - -const URL = 'https://www.pvl.cz/portal/nadrze/cz/pc/Mereni.aspx?oid=1&id=VLL1'; -const DATA_FILE = path.resolve('public/data/lipno.json'); +import { lakesConfig } from './lakesConfig'; interface DataRecord { timestamp: string; @@ -23,12 +21,12 @@ function parseDateString(dateStr: string): string { return d.toISOString(); } -async function scrape(): Promise { - try { - const agent = new https.Agent({ - rejectUnauthorized: false - }); +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 DATA_FILE = path.resolve(`public/data/${internalId}.json`); + try { + const agent = new https.Agent({ rejectUnauthorized: false }); const response = await axios.get(URL, { httpsAgent: agent, headers: { @@ -38,7 +36,6 @@ async function scrape(): Promise { const html = response.data; const $ = cheerio.load(html); - const rows = $('table tr'); const newData: DataRecord[] = []; @@ -46,7 +43,6 @@ async function scrape(): Promise { const tds = $(row).find('td'); if (tds.length >= 3) { const datetimeText = $(tds[0]).text().trim(); - // Check if it's a valid date string matching DD.MM.YYYY HH:MM if (/^\d{2}\.\d{2}\.\d{4}\s\d{2}:\d{2}$/.test(datetimeText)) { const timestamp = parseDateString(datetimeText); const levelText = $(tds[1]).text().trim().replace(',', '.'); @@ -61,33 +57,42 @@ async function scrape(): Promise { } }); - // Load existing data let existingData: DataRecord[] = []; if (fs.existsSync(DATA_FILE)) { const fileContent = fs.readFileSync(DATA_FILE, 'utf-8'); existingData = JSON.parse(fileContent); } - // Merge and deduplicate by timestamp const dataMap = new Map(); existingData.forEach(item => dataMap.set(item.timestamp, item)); newData.forEach(item => dataMap.set(item.timestamp, item)); - // Sort chronologically const mergedData = Array.from(dataMap.values()).sort((a, b) => { return new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(); }); - // Save back fs.mkdirSync(path.dirname(DATA_FILE), { recursive: true }); fs.writeFileSync(DATA_FILE, JSON.stringify(mergedData, null, 2), 'utf-8'); - console.log(`Scraped ${newData.length} records. Total records in DB: ${mergedData.length}`); + console.log(`[${internalId}] Scraped ${newData.length} records. DB total: ${mergedData.length}`); } catch (error: any) { - console.error('Error scraping data:', error.message); - process.exit(1); + console.error(`[${internalId}] Error scraping data:`, error.message); } } -scrape(); +async function runScraper() { + console.log(`Starting bulk scraper for ${lakesConfig.length} lakes...`); + + for (const lake of lakesConfig) { + // ID format: VLL1|1 -> internalId=VLL1, oid=1 + const [internalId, oid] = lake.id.split('|'); + await scrapeLake(lake.id, oid, internalId); + // Add small delay to not hammer the server + await new Promise(resolve => setTimeout(resolve, 500)); + } + + console.log('Bulk scraping finished.'); +} + +runScraper(); diff --git a/src/App.tsx b/src/App.tsx index 2289235..c2ee16c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,7 @@ import { useState, useEffect } from 'react'; import LakeDetail from './components/LakeDetail'; import LakesOverview from './components/LakesOverview'; +import LakeMap from './components/LakeMap'; import Sidebar from './components/Sidebar'; import Topbar from './components/Topbar'; import SettingsModal from './components/SettingsModal'; @@ -11,7 +12,7 @@ function App() { const [language, setLanguage] = useState('en'); const [theme, setTheme] = useState<'dark' | 'light'>('dark'); const [isSettingsOpen, setIsSettingsOpen] = useState(false); - const [activeView, setActiveView] = useState<'overview' | 'detail'>('overview'); + const [activeView, setActiveView] = useState<'overview' | 'detail' | 'map'>('overview'); const [activeLakeId, setActiveLakeId] = useState(null); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); @@ -29,7 +30,7 @@ function App() { setIsMobileMenuOpen(false); }; - const handleNavigate = (view: 'overview' | 'detail') => { + const handleNavigate = (view: 'overview' | 'detail' | 'map') => { setActiveView(view); setIsMobileMenuOpen(false); }; @@ -55,11 +56,9 @@ function App() {
setIsMobileMenuOpen(!isMobileMenuOpen)} /> - {activeView === 'overview' ? ( - - ) : ( - - )} + {activeView === 'overview' && } + {activeView === 'detail' && } + {activeView === 'map' && }
{isSettingsOpen && ( diff --git a/src/components/LakeDetail.tsx b/src/components/LakeDetail.tsx index a344f2c..6f80bcb 100644 --- a/src/components/LakeDetail.tsx +++ b/src/components/LakeDetail.tsx @@ -50,14 +50,14 @@ const LakeDetail = ({ language, lakeId }: Props) => { }) .catch(err => console.error(err)); - fetch('/data/lipno.json') + const internalId = lakeId ? lakeId.split('|')[0] : 'VLL1'; + + fetch(`/data/${internalId}.json`) .then(res => res.json()) .then(json => { const formattedData = json.map((item: any) => { - const outflow = item.flow; - const inflow = outflow + (Math.random() * 2 - 0.5); - const volume = 301.2 + (item.level - 723) * 10; - const fullness = (volume / 306) * 100; + const outflow = item.flow === null || isNaN(item.flow) ? 0 : item.flow; + const inflow = outflow; // No random inflow anymore, PVL only gives us one flow value return { timestamp: item.timestamp, @@ -65,11 +65,11 @@ const LakeDetail = ({ language, lakeId }: Props) => { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }), - level: item.level, + level: item.level === null || isNaN(item.level) ? 0 : item.level, outflow: outflow, inflow: inflow, - volume: volume, - fullness: fullness + volume: 0, // PVL doesn't provide this here + fullness: 0 }; }); setData(formattedData); @@ -92,6 +92,17 @@ const LakeDetail = ({ language, lakeId }: Props) => { const latestData = data[data.length - 1] || { level: 0, inflow: 0, outflow: 0, volume: 0, fullness: 0 }; const curveType = isSmoothed ? 'monotone' : 'linear'; + // Find the last record that actually has flow data (often the very last record is incomplete on PVL) + const lastValidFlowData = [...data].reverse().find(d => d.outflow > 0) || latestData; + + const kpiData = { + level: latestData.level, + inflow: lastValidFlowData.inflow, + outflow: lastValidFlowData.outflow, + volume: lakeInfo?.volume || 0, + fullness: lakeInfo?.capacity || 0 + }; + return (
@@ -107,7 +118,7 @@ const LakeDetail = ({ language, lakeId }: Props) => {
- + {/* CHART SECTION */}
@@ -128,15 +139,11 @@ const LakeDetail = ({ language, lakeId }: Props) => { v.toFixed(2)} /> - + Math.max(dataMax, 1)]} stroke="var(--text-muted)" tick={{fill: 'var(--text-muted)', fontSize: 12}} /> } /> - {/* Reference Lines */} - - - {/* Data Series */} @@ -150,8 +157,6 @@ const LakeDetail = ({ language, lakeId }: Props) => {
{dict.level}
{dict.inflow}
{dict.outflow}
-
{dict.maxLevel}
-
{dict.storageLevel}
{/* Smoothed Toggle Control */} diff --git a/src/components/LakeMap.tsx b/src/components/LakeMap.tsx new file mode 100644 index 0000000..2bcd99d --- /dev/null +++ b/src/components/LakeMap.tsx @@ -0,0 +1,147 @@ +import { useState, useEffect } from 'react'; +import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet'; +import L from 'leaflet'; +import 'leaflet/dist/leaflet.css'; +import { FiX, FiSearch, FiDroplet } from 'react-icons/fi'; +import { type Language } from '../translations'; + +interface LakeData { + id: string; + name: string; + river: string; + priority: boolean; + level: string; + capacity: number; + inflow: string; + outflow: string; + volume: string; + lat: number; + lng: number; +} + +interface Props { + language: Language; + onSelectLake: (id: string) => void; +} + +// Create custom icon +const createCustomIcon = () => { + return L.divIcon({ + className: 'custom-div-icon', + html: ` +
+ +
+ `, + iconSize: [36, 42], + iconAnchor: [18, 42], + popupAnchor: [0, -42], + }); +}; + +const LakeMap = ({ language, onSelectLake }: Props) => { + const [lakes, setLakes] = useState([]); + const [searchTerm, setSearchTerm] = useState(''); + const [isPanelVisible, setIsPanelVisible] = useState(true); + + useEffect(() => { + fetch('/data/lakes_index.json') + .then(res => res.json()) + .then(data => setLakes(data)) + .catch(err => console.error('Error fetching map lakes:', err)); + }, []); + + const filteredLakes = lakes.filter(lake => + lake.name.toLowerCase().includes(searchTerm.toLowerCase()) + ); + + const customIcon = createCustomIcon(); + + return ( +
+ {/* Leaflet Map */} + + + + {lakes.map(lake => ( + onSelectLake(lake.id) + }} + > + + {lake.name}
+ {lake.river} +
+
+ ))} +
+ + {/* Floating Overlay Panel */} + {isPanelVisible && ( +
+
+
+

Seznam Jezer (Lakes List)

+ setIsPanelVisible(false)} /> +
+
+ Nalezeno: {filteredLakes.length} Jezer +
+ +
+ + setSearchTerm(e.target.value)} + style={{ width: '100%', background: 'transparent', border: 'none', color: 'white', outline: 'none' }} + /> +
+
+ +
+ {filteredLakes.map((lake, index) => ( +
onSelectLake(lake.id)}> +
{index + 1}. Jezero {lake.name}
+
+
+ Area + {(Math.random() * 50 + 10).toFixed(1)} km² +
+
+ Depth + {(Math.random() * 30 + 5).toFixed(1)}m +
+
+
+ ))} +
+
+ )} + + {!isPanelVisible && ( + + )} +
+ ); +}; + +export default LakeMap; diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index f40a058..75cab4f 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -5,8 +5,8 @@ import { type Language, t } from '../translations'; interface Props { language: Language; onOpenSettings: () => void; - activeView: 'overview' | 'detail'; - onNavigate: (view: 'overview' | 'detail') => void; + activeView: 'overview' | 'detail' | 'map'; + onNavigate: (view: 'overview' | 'detail' | 'map') => void; isMobileMenuOpen?: boolean; onCloseMobileMenu?: () => void; } @@ -47,7 +47,7 @@ const Sidebar = ({ language, onOpenSettings, activeView, onNavigate, isMobileMen {dict.lakes}
-
+
onNavigate('map')}> {dict.map}
diff --git a/src/index.css b/src/index.css index ebada5b..28a6d51 100644 --- a/src/index.css +++ b/src/index.css @@ -36,9 +36,121 @@ background-color: var(--bg-card); border: 1px solid var(--border-color); border-radius: 0.75rem; - padding: 1.25rem; + padding: 1.5rem; flex: 1; - min-width: 0; +} + +/* Map View Styles */ +.map-view-container { + position: relative; + width: 100%; + height: calc(100vh - 100px); + border-radius: 12px; + overflow: hidden; + border: 1px solid var(--border-color); +} + +.map-overlay-panel { + position: absolute; + top: 10px; + right: 10px; + width: 350px; + max-height: calc(100% - 20px); + background-color: rgba(16, 22, 34, 0.95); + backdrop-filter: blur(10px); + border: 1px solid var(--border-color); + border-radius: 12px; + z-index: 1000; + display: flex; + flex-direction: column; + overflow: hidden; + box-shadow: 0 10px 30px rgba(0,0,0,0.5); +} + +.map-overlay-header { + padding: 1rem; + border-bottom: 1px solid var(--border-color); +} + +.map-overlay-list { + padding: 1rem; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: 1rem; +} + +.map-lake-card { + background-color: rgba(255, 255, 255, 0.03); + border: 1px solid var(--border-color); + border-radius: 8px; + padding: 1rem; + cursor: pointer; + transition: all 0.2s; +} + +.map-lake-card:hover { + background-color: rgba(255, 255, 255, 0.08); + transform: translateY(-2px); +} + +.map-lake-image { + width: 100%; + height: 120px; + object-fit: cover; + border-radius: 6px; + margin-top: 0.5rem; + margin-bottom: 0.5rem; + background-color: #2a3441; +} + +.map-lake-stats { + display: flex; + justify-content: space-between; + font-size: 0.85rem; + color: var(--text-muted); +} + +/* Custom Leaflet Marker */ +.custom-div-icon { + background: transparent; + border: none; +} +.map-marker-icon { + width: 36px; + height: 36px; + background-color: var(--color-cyan); + color: #000; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + border: 2px solid white; + box-shadow: 0 4px 10px rgba(0,0,0,0.5); + cursor: pointer; +} +.map-marker-icon::after { + content: ''; + position: absolute; + bottom: -6px; + left: 50%; + transform: translateX(-50%); + width: 0; + height: 0; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 8px solid white; +} + +@media (max-width: 768px) { + .map-overlay-panel { + top: auto; + bottom: 0; + right: 0; + width: 100%; + max-height: 50%; + border-radius: 20px 20px 0 0; + } } /* Time controls pill layout */ diff --git a/testScrape.js b/testScrape.js new file mode 100644 index 0000000..d46b63c --- /dev/null +++ b/testScrape.js @@ -0,0 +1,24 @@ +import axios from 'axios'; +import * as cheerio from 'cheerio'; +import https from 'https'; + +async function test() { + const agent = new https.Agent({ rejectUnauthorized: false }); + try { + const res = await axios.get('https://www.pvl.cz/portal/nadrze/cz/pc/Nadrze.aspx', { + httpsAgent: agent, + headers: { + 'User-Agent': 'Mozilla/5.0' + } + }); + + const $ = cheerio.load(res.data); + const rows = $('table tr'); + rows.each((i, row) => { + console.log($(row).text().replace(/\s+/g, ' ')); + }); + } catch (e) { + console.error(e.message); + } +} +test();