geoidundolation und export

This commit is contained in:
2026-02-06 21:01:48 +01:00
parent 4340205f45
commit 75d41bd21b
5 changed files with 343 additions and 365 deletions

116
Export.py
View File

@@ -1,5 +1,6 @@
import csv
from datetime import datetime
from Koordinatentransformationen import Transformationen
import numpy as np
import os
import pandas as pd
@@ -61,6 +62,83 @@ class Export:
zeile_als_text.append(eintrag_text)
writer.writerow(zeile_als_text)
@staticmethod
def erzeuge_ergebnis_datenframes(
pfad_datenbank,
pfad_tif_quasigeoidundulation,
dict_koordinaten_ausgleichungsergebnis
):
"""
Erzeugt Ergebnis-DataFrames für ausgeglichene Koordinaten in ECEF (XYZ) und UTM.
Die Funktion nimmt ein Dictionary mit ausgeglichenen geozentrisch-kartesischen Koordinaten
(ECEF/XYZ) entgegen, transformiert diese über die Transformationen-Klasse nach ETRS89/UTM
(inkl. Höhenangabe; optional unter Nutzung einer Quasigeoidundulations-Datei) und erstellt
zwei tabellarische Ergebnisdarstellungen:
- df_x_final: Geozentrische Koordinaten X/Y/Z [m],
- df_utm_final: UTM-Koordinaten (Rechtswert/Hochwert/Höhe) [m].
:param pfad_datenbank: Pfad zur SQLite-Datenbank (für Koordinaten-/Transformationszugriffe).
:type pfad_datenbank: str
:param pfad_tif_quasigeoidundulation: Pfad zu Quasigeoidundulationsdaten als GeoTIFF (optional, für Höhen/PROJ).
:type pfad_tif_quasigeoidundulution: str | None
:param dict_koordinaten_ausgleichungsergebnis: Dictionary der ausgeglichenen ECEF-Koordinaten je Punkt.
:type dict_koordinaten_ausgleichungsergebnis: dict
:return: Tuple aus DataFrame der ECEF-Koordinaten (XYZ) und DataFrame der UTM-Koordinaten.
:rtype: tuple[pandas.DataFrame, pandas.DataFrame]
"""
# Transformation initialisieren
trafos = Transformationen(pfad_datenbank)
dict_koordinaten_utm = trafos.ecef_to_utm(
dict_koordinaten_ausgleichungsergebnis,
pfad_tif_quasigeoidundulation
)
namen = list(dict_koordinaten_ausgleichungsergebnis.keys())
# SymPy-Matrizen zu Liste
koordinaten_liste = []
for k in namen:
matrix_werte = dict_koordinaten_ausgleichungsergebnis[k]
koordinaten_liste.append([
float(matrix_werte[0]),
float(matrix_werte[1]),
float(matrix_werte[2])
])
# DataFrame geozentrisch
df_x_final = pd.DataFrame(
koordinaten_liste,
columns=['X [m]', 'Y [m]', 'Z [m]'],
index=namen
)
df_x_final.index.name = 'Punktnummer'
# DataFrame UTM
utm_flach = {
k: np.array(v).flatten().tolist()
for k, v in dict_koordinaten_utm.items()
}
df_utm_final = pd.DataFrame.from_dict(
utm_flach,
orient='index',
columns=['Rechtswert [m]', 'Hochwert [m]', 'Höhe [m]']
)
df_utm_final.index.name = 'Punktnummer'
# Zahlenformatierung
df_x_final = df_x_final.map(lambda val: f"{val:.4f}")
df_utm_final = df_utm_final.map(lambda val: f"{val:.4f}")
return df_x_final, df_utm_final
def speichere_html_protokoll(metadaten: dict, ergebnisse: dict) -> None:
"""Erzeugt ein HTML-Protokoll der Ausgleichungsergebnisse und speichert es als Datei.
@@ -79,7 +157,6 @@ class Export:
:return: None
:rtype: None
"""
for key in ergebnisse:
wert = ergebnisse[key]
@@ -92,7 +169,7 @@ class Export:
elif isinstance(wert, dict):
ergebnisse[key] = pd.DataFrame([wert])
# Pfad für den Ordner erstellen
# Pfad für den Ordner
ordner = "Protokolle"
if not os.path.exists(ordner):
os.makedirs(ordner)
@@ -100,7 +177,7 @@ class Export:
dateiname = f"{ordner}/Protokoll_{metadaten['projekt']}.html"
abs_path = os.path.abspath(dateiname)
# HTML Inhalt zusammenbauen
# HTML Inhalt
html_content = f"""
<!DOCTYPE html>
<html lang="de">
@@ -211,39 +288,6 @@ class Export:
<h3 id="koordinaten_utm">13. Koordinaten UTM</h3>
{ergebnisse['df_koordinaten_utm'].to_html(index=True)}
<h3>1. Globaltest</h3>
{ergebnisse['df_globaltest'].to_html(index=False)}
<h3>2. Redundanzanteile</h3>
{ergebnisse['df_redundanz'].to_html(index=False)}
<h3>2. Lokaltest (data snooping)</h3>
{ergebnisse['df_lokaltest'].to_html(index=False)}
<h3>2. Varianzkomponentenschätzung</h3>
{ergebnisse['df_vks'].to_html(index=False)}
<h3>2. Äussere Zuverlässigkeit</h3>
{ergebnisse['df_aeussere_zuver'].to_html(index=False)}
<h3>2. Standardabweichungen und Helmert'scher Punktfehler</h3>
{ergebnisse['df_punktfehler'].to_html(index=False)}
<h3>3. Standardellipsen</h3>
{ergebnisse['df_ellipsen'].to_html(index=False)}
<h3>3. Konfidenzellipsen</h3>
{ergebnisse['df_konfidenzellipsen'].to_html(index=False)}
<h3>3. Konfidenzellipsen im ENU-System</h3>
{ergebnisse['df_konfidenzellipsen_enu'].to_html(index=False)}
<h3>3. Koordinaten Geozentrisch Kartesisch</h3>
{ergebnisse['df_koordinaten_geozentrisch_kartesisch'].to_html(index=True)}
<h3>3. Koordinaten UTM</h3>
{ergebnisse['df_koordinaten_utm'].to_html(index=True)}
<div class="footer">
Erstellt automatisch am {datetime.now().strftime('%d.%m.%Y um %H:%M:%S')}
</div>