Add data_visualization/js/api.js

This commit is contained in:
Mika 2026-05-03 02:07:36 +00:00
parent 5f6835cfcc
commit c4394be145

View file

@ -0,0 +1,79 @@
/**
* Modul: Daten-Layer für akustische und Sensordaten der Donau
* Rolle: Laden und Aufbereiten der JSON-Datenquellen für Visualisierung
* © 2026 Donau2Space.de
*/
/**
* @typedef {Object} VisualizationData
* @property {Array<Object>} waterLevels - Zeitverlauf der Wasserstandsdaten
* @property {Array<Object>} vibrationData - Schwingungsdaten der Umgebung
* @property {Array<Object>} frequencyAnalysis - Ergebnisse der Frequenzanalyse
* @property {Array<Object>} aiPatterns - KI-Musteranalysen mit Wahrscheinlichkeiten
*/
/**
* Lädt Sensordaten aus einer lokalen JSON-Datei oder optional aus einem konfigurierten API-Endpunkt.
* @param {Object} [filters={}] - Optionaler Filterparameter (z. B. Datumsbereich, Messparameter)
* @returns {Promise<VisualizationData>} Aufbereitete Daten für Chart.js und andere Visualisierungen
*/
export async function fetchData(filters = {}) {
const localPath = './data/measurements.json';
// Falls eine API vorhanden wäre, könnte hier dynamisch zwischen API und lokaler Quelle unterschieden werden.
try {
const response = await fetch(localPath, { cache: 'no-cache' });
if (!response.ok) {
throw new Error(`Fehler beim Laden der Daten: ${response.status}`);
}
const rawData = await response.json();
// Daten vorsichtig prüfen und filtern
const { waterLevels = [], vibrationData = [], frequencyAnalysis = [], aiPatterns = [] } = rawData || {};
const filteredData = applyFilters({ waterLevels, vibrationData, frequencyAnalysis, aiPatterns }, filters);
return filteredData;
} catch (error) {
console.error('fetchData Fehler:', error);
return {
waterLevels: [],
vibrationData: [],
frequencyAnalysis: [],
aiPatterns: []
};
}
}
/**
* Filtert die Daten basierend auf angegebenen Parametern.
* @param {VisualizationData} data - Originale Daten aus JSON-Datei
* @param {Object} filters - Filterparameter (z. B. { dateFrom, dateTo })
* @returns {VisualizationData} Gefilterte Daten
*/
function applyFilters(data, filters) {
const { dateFrom, dateTo, parameter } = filters;
const withinRange = (entry) => {
if (!dateFrom && !dateTo) return true;
const t = new Date(entry.timestamp).getTime();
const fromValid = dateFrom ? t >= new Date(dateFrom).getTime() : true;
const toValid = dateTo ? t <= new Date(dateTo).getTime() : true;
return fromValid && toValid;
};
const matchesParameter = (entry) => {
if (!parameter) return true;
return Object.keys(entry).some((key) => key.toLowerCase() === parameter.toLowerCase());
};
const filterArray = (arr) => Array.isArray(arr) ? arr.filter((entry) => withinRange(entry) && matchesParameter(entry)) : [];
return {
waterLevels: filterArray(data.waterLevels),
vibrationData: filterArray(data.vibrationData),
frequencyAnalysis: filterArray(data.frequencyAnalysis),
aiPatterns: filterArray(data.aiPatterns)
};
}