import csv from datetime import datetime import numpy as np import os import pandas as pd import sympy as sp import webbrowser class Export: """Hilfsfunktionen zum Exportieren von Ergebnissen und Protokollen. Die Klasse stellt Methoden zur Verfügung für: - Export von Matrizen in CSV-Dateien, - Export von Ausgleichungsergebnissen (Skalare und Matrizen) in CSV-Dateien, - Erzeugung und Speicherung eines HTML-Protokolls inklusive automatischem Öffnen im Browser. """ @staticmethod def matrix_to_csv(dateiname: str, liste_spaltenbeschriftung: list, liste_zeilenbeschriftung: list, Matrix: np.matrix | sp.Matrix, beschriftung_kopfzeile: object = "") -> None: """Schreibt eine Matrix mit Zeilen- und Spaltenbeschriftungen in eine CSV-Datei. Die Ausgabe erfolgt mit Semikolon als Trennzeichen. Die Kopfzeile enthält optional eine zusätzliche Beschriftung sowie Spaltenbeschriftungen. Zudem werden Zeilenbeschriftungen durchgeführt. :param dateiname: Pfad zu schreibenden CSV-Datei. :type dateiname: str :param liste_spaltenbeschriftung: Liste der Spaltenbeschriftungen. :type liste_spaltenbeschriftung: list :param liste_zeilenbeschriftung: Liste der Zeilenbeschriftungen. :type liste_zeilenbeschriftung: list :param Matrix: Zu exportierende Matrix. :type Matrix: np.matrix | sp.Matrix :param beschriftung_kopfzeile: Optionaler Eintrag in der linken oberen Zelle der Kopfzeile. :type beschriftung_kopfzeile: object :return: None :rtype: None """ with open(dateiname, "w", newline="", encoding="utf-8") as csvfile: writer = csv.writer(csvfile, delimiter=";") kopfzeile = [beschriftung_kopfzeile] for spaltenbeschriftung in liste_spaltenbeschriftung: kopfzeile.append(str(spaltenbeschriftung)) writer.writerow(kopfzeile) for zeilenbeschriftung, zeile in zip(liste_zeilenbeschriftung, Matrix.tolist()): zeile_als_text = [zeilenbeschriftung] for eintrag in zeile: try: # Dezimaltrenner von Punkt in Komma ändern, weil Python und Excel andere Konventionen vertreten. eintrag_text = str(eintrag).replace(".", ",") try: eintrag_text = float(eintrag_text) except: eintrag_text = eintrag_text except Exception: eintrag_text = str(eintrag) zeile_als_text.append(eintrag_text) writer.writerow(zeile_als_text) def speichere_html_protokoll(metadaten: dict, ergebnisse: dict) -> None: """Erzeugt ein HTML-Protokoll der Ausgleichungsergebnisse und speichert es als Datei. Es wird der Unterordner Protokolle angelegt, falls dieser noch nicht existiert. Das Protokoll wird als HTML-Datei gespeichert und anschließend im Browser geöffnet. Erwartete Schlüssel in metadaten sind u. a. "projekt", "bearbeiter" und "datum". Erwartete Schlüssel in ergebnisse sind u. a. "df_globaltest", "df_redundanz", "df_ellipsen", "df_konfidenzellipsen", "df_koordinaten_geozentrisch_kartesisch" und "df_koordinaten_utm". Die zugehörigen Werte müssen die Methode to_html bereitstellen. :param metadaten: Dictionary mit Metadaten zum Protokoll. :type metadaten: dict :param ergebnisse: Dictionary mit Ergebnisobjekten (z. B. DataFrames) zur HTML-Ausgabe. :type ergebnisse: dict :return: None :rtype: None """ for key in ergebnisse: wert = ergebnisse[key] if isinstance(wert, tuple): if len(wert) > 0 and isinstance(wert[0], pd.DataFrame): ergebnisse[key] = wert[0] else: ergebnisse[key] = pd.DataFrame(list(wert)) elif isinstance(wert, dict): ergebnisse[key] = pd.DataFrame([wert]) # Pfad für den Ordner erstellen ordner = "Protokolle" if not os.path.exists(ordner): os.makedirs(ordner) dateiname = f"{ordner}/Protokoll_{metadaten['projekt']}.html" abs_path = os.path.abspath(dateiname) # HTML Inhalt zusammenbauen html_content = f"""
Netzplot im ENU-System mit Konfidenzellipsen - Gesamtes Netz
Netzplot im ENU-System mit Konfidenzellipsen - Ausschnitt