zusammenfügen 02.2.
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -405,9 +405,10 @@ class ENU:
|
|||||||
:rtype: tuple[float, float]
|
:rtype: tuple[float, float]
|
||||||
"""
|
"""
|
||||||
XYZ = np.array(list(dict_xyz.values()), dtype=float)
|
XYZ = np.array(list(dict_xyz.values()), dtype=float)
|
||||||
X0, Y0, Z0 = XYZ.mean(axis=0)
|
mittelwerte = XYZ.mean(axis=0)
|
||||||
B0 = float(berechnungen.B(X0, Y0, Z0))
|
X0, Y0, Z0 = mittelwerte[0], mittelwerte[1], mittelwerte[2]
|
||||||
L0 = float(berechnungen.L(X0, Y0))
|
B0 = float(np.asarray(berechnungen.B(X0, Y0, Z0)).item())
|
||||||
|
L0 = float(np.asarray(berechnungen.L(X0, Y0)).item())
|
||||||
return B0, L0
|
return B0, L0
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
112
Export.py
112
Export.py
@@ -2,6 +2,7 @@ import csv
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import os
|
import os
|
||||||
|
import pandas as pd
|
||||||
import sympy as sp
|
import sympy as sp
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
|
||||||
@@ -78,6 +79,19 @@ class Export:
|
|||||||
:return: None
|
:return: None
|
||||||
:rtype: 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
|
# Pfad für den Ordner erstellen
|
||||||
ordner = "Protokolle"
|
ordner = "Protokolle"
|
||||||
if not os.path.exists(ordner):
|
if not os.path.exists(ordner):
|
||||||
@@ -97,6 +111,19 @@ class Export:
|
|||||||
h1 {{ color: #2c3e50; border-bottom: 2px solid #2c3e50; }}
|
h1 {{ color: #2c3e50; border-bottom: 2px solid #2c3e50; }}
|
||||||
h3 {{ color: #2980b9; margin-top: 30px; }}
|
h3 {{ color: #2980b9; margin-top: 30px; }}
|
||||||
.metadata {{ background: #f9f9f9; padding: 15px; border-radius: 5px; border-left: 5px solid #2980b9; }}
|
.metadata {{ background: #f9f9f9; padding: 15px; border-radius: 5px; border-left: 5px solid #2980b9; }}
|
||||||
|
|
||||||
|
/* Styling für das Inhaltsverzeichnis */
|
||||||
|
.toc {{ background: #fff; border: 1px solid #ddd; padding: 15px; border-radius: 5px; display: inline-block; min-width: 300px; }}
|
||||||
|
.toc ul {{ list-style: none; padding-left: 0; }}
|
||||||
|
.toc li {{ margin: 5px 0; }}
|
||||||
|
.toc a {{ text-decoration: none; color: #2980b9; font-weight: bold; }}
|
||||||
|
.toc a:hover {{ text-decoration: underline; }}
|
||||||
|
|
||||||
|
/* Styling für Bilder */
|
||||||
|
.plot-container {{ margin-top: 20px; text-align: center; background: #fff; padding: 10px; border: 1px solid #ddd; }}
|
||||||
|
.plot-img {{ width: 100%; max-width: 1000px; height: auto; border: 1px solid #eee; }}
|
||||||
|
.plot-caption {{ font-style: italic; color: #666; margin-top: 5px; }}
|
||||||
|
|
||||||
table {{ border-collapse: collapse; width: 100%; margin-top: 10px; }}
|
table {{ border-collapse: collapse; width: 100%; margin-top: 10px; }}
|
||||||
th, td {{ text-align: left; padding: 8px; border-bottom: 1px solid #ddd; }}
|
th, td {{ text-align: left; padding: 8px; border-bottom: 1px solid #ddd; }}
|
||||||
tr:nth-child(even) {{ background-color: #f2f2f2; }}
|
tr:nth-child(even) {{ background-color: #f2f2f2; }}
|
||||||
@@ -112,20 +139,105 @@ class Export:
|
|||||||
<p><strong>Bearbeiter:</strong> {metadaten['bearbeiter']}</p>
|
<p><strong>Bearbeiter:</strong> {metadaten['bearbeiter']}</p>
|
||||||
<p><strong>Datum:</strong> {metadaten['datum']}</p>
|
<p><strong>Datum:</strong> {metadaten['datum']}</p>
|
||||||
<p><strong>Ausgleichungsmodus:</strong> Methode der kleinsten Quadrate (L2-Norm)</p>
|
<p><strong>Ausgleichungsmodus:</strong> Methode der kleinsten Quadrate (L2-Norm)</p>
|
||||||
|
<p><strong>Koordinatenreferenzsystem:</strong> {metadaten['koordinatenreferenzsystem']}</p>
|
||||||
|
<p><strong>Datumsfestlegung:</strong> {metadaten['datumsfestlegung']}</p>
|
||||||
|
<p><strong>Dimension:</strong> 3D</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="toc">
|
||||||
|
<strong>Inhaltsverzeichnis</strong>
|
||||||
|
<ul>
|
||||||
|
<li><a href="#globaltest">1. Globaltest</a></li>
|
||||||
|
<li><a href="#redundanz">2. Redundanzanteile</a></li>
|
||||||
|
<li><a href="#lokaltest">3. Lokaltest</a></li>
|
||||||
|
<li><a href="#vks">4. Varianzkomponentenschätzung</a></li>
|
||||||
|
<li><a href="#aeussere_zuver">5. Äussere Zuverlässigkeit</a></li>
|
||||||
|
<li><a href="#Helmertscher_Punktfehler">6. Standardabweichungen und Helmert'scher Punktfehler</a></li>
|
||||||
|
<li><a href="#standardellipsen">7. Standardellipsen</a></li>
|
||||||
|
<li><a href="#konfidenzellipsen">8. Konfidenzellipsen</a></li>
|
||||||
|
<li><a href="#Konfidenzellipse_ENU">9. Konfidenzellipsen im ENU-System</a></li>
|
||||||
|
<li><a href="#netzplot_gesamt">10. Netzplot im ENU-System mit Konfidenzellipsen - Gesamtes Netz</a></li>
|
||||||
|
<li><a href="#netzplot_zoom">11. Netzplot im ENU-System mit Konfidenzellipsen - Ausschnitt</a></li>
|
||||||
|
<li><a href="#koordinaten_xyz">12. Koordinaten Geozentrisch</a></li>
|
||||||
|
<li><a href="#koordinaten_utm">13. Koordinaten UTM</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 id="globaltest">1. Globaltest</h3>
|
||||||
|
{ergebnisse['df_globaltest'].to_html(index=False)}
|
||||||
|
|
||||||
|
<h3 id="redundanz">2. Redundanzanteile</h3>
|
||||||
|
{ergebnisse['df_redundanz'].to_html(index=False)}
|
||||||
|
|
||||||
|
<h3 id="lokaltest">3. Lokaltest</h3>
|
||||||
|
{ergebnisse['df_lokaltest'].to_html(index=False)}
|
||||||
|
|
||||||
|
<h3 id="vks">4. Varianzkomponentenschätzung</h3>
|
||||||
|
{ergebnisse['df_vks'].to_html(index=False)}
|
||||||
|
|
||||||
|
<h3 id="aeussere_zuver">5. Äussere Zuverlässigkeit</h3>
|
||||||
|
{ergebnisse['df_aeussere_zuver'].to_html(index=False)}
|
||||||
|
|
||||||
|
<h3 id="Helmertscher_Punktfehler">6. Standardabweichungen und Helmert'scher Punktfehler</h3>
|
||||||
|
{ergebnisse['df_punktfehler'].to_html(index=False)}
|
||||||
|
|
||||||
|
<h3 id="standardellipsen">7. Standardellipsen</h3>
|
||||||
|
{ergebnisse['df_ellipsen'].to_html(index=False)}
|
||||||
|
|
||||||
|
<h3 id="konfidenzellipsen">8. Konfidenzellipsen</h3>
|
||||||
|
{ergebnisse['df_konfidenzellipsen'].to_html(index=False)}
|
||||||
|
|
||||||
|
<h3 id="Konfidenzellipse_ENU">9. Konfidenzellipsen im ENU-System</h3>
|
||||||
|
{ergebnisse['df_konfidenzellipsen_enu'].to_html(index=False)}
|
||||||
|
|
||||||
|
<h3 id="netzplot_gesamt">10. Plots: Konfidenzellipsen im ENU-System (Gesamtes Netz)</h3>
|
||||||
|
<div class="plot-container">
|
||||||
|
<h4>Gesamtnetz</h4>
|
||||||
|
<img src="../Netzqualitaet/netzplot_ellipsen_volle_ausdehnung.png" class="plot-img" alt="Gesamtes Netz">
|
||||||
|
<p class="plot-caption">Netzplot im ENU-System mit Konfidenzellipsen - Gesamtes Netz</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 id="netzplot_zoom">11. Plots: Konfidenzellipsen im ENU-System (Auschnitt) </h3>
|
||||||
|
<div class="plot-container">
|
||||||
|
<h4>Detailansicht (Zoom)</h4>
|
||||||
|
<img src="../Netzqualitaet/netzplot_ellipsen_zoom_ansicht.png" class="plot-img" alt="2Netzplot im ENU-System mit Konfidenzellipsen - Gesamtes Netz">
|
||||||
|
<p class="plot-caption">Netzplot im ENU-System mit Konfidenzellipsen - Ausschnitt</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 id="koordinaten_xyz">12. Koordinaten Geozentrisch Kartesisch</h3>
|
||||||
|
{ergebnisse['df_koordinaten_geozentrisch_kartesisch'].to_html(index=True)}
|
||||||
|
|
||||||
|
<h3 id="koordinaten_utm">13. Koordinaten UTM</h3>
|
||||||
|
{ergebnisse['df_koordinaten_utm'].to_html(index=True)}
|
||||||
|
|
||||||
<h3>1. Globaltest</h3>
|
<h3>1. Globaltest</h3>
|
||||||
{ergebnisse['df_globaltest'].to_html(index=False)}
|
{ergebnisse['df_globaltest'].to_html(index=False)}
|
||||||
|
|
||||||
<h3>2. Redundanzanteile</h3>
|
<h3>2. Redundanzanteile</h3>
|
||||||
{ergebnisse['df_redundanz'].to_html(index=False)}
|
{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>
|
<h3>3. Standardellipsen</h3>
|
||||||
{ergebnisse['df_ellipsen'].to_html(index=False)}
|
{ergebnisse['df_ellipsen'].to_html(index=False)}
|
||||||
|
|
||||||
<h3>3. Konfidenzellipsen</h3>
|
<h3>3. Konfidenzellipsen</h3>
|
||||||
{ergebnisse['df_konfidenzellipsen'].to_html(index=False)}
|
{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>
|
<h3>3. Koordinaten Geozentrisch Kartesisch</h3>
|
||||||
{ergebnisse['df_koordinaten_geozentrisch_kartesisch'].to_html(index=True)}
|
{ergebnisse['df_koordinaten_geozentrisch_kartesisch'].to_html(index=True)}
|
||||||
|
|
||||||
|
|||||||
44
Import.py
44
Import.py
@@ -103,7 +103,7 @@ class Import:
|
|||||||
# Abbruch des Imports und Ausgabe einer Fehlermeldung, wenn ein Punkt doppelt in der Importdatei vorhanden ist.
|
# Abbruch des Imports und Ausgabe einer Fehlermeldung, wenn ein Punkt doppelt in der Importdatei vorhanden ist.
|
||||||
if row[0] in liste_punktnummern_vorher:
|
if row[0] in liste_punktnummern_vorher:
|
||||||
Import_abbrechen = True
|
Import_abbrechen = True
|
||||||
print(f"Der Import wurde abgebrochen, weil in der Datei {pfad_datei} Punktnummern doppelt vorhanden sind. Bitte in der Datei ändern und Import wiederholen.")
|
print(f"❌ Der Import wurde abgebrochen, weil in der Datei {pfad_datei} Punktnummern doppelt vorhanden sind. Bitte in der Datei ändern und Import wiederholen.")
|
||||||
break
|
break
|
||||||
|
|
||||||
liste_punktnummern_vorher.append(row[0])
|
liste_punktnummern_vorher.append(row[0])
|
||||||
@@ -111,7 +111,7 @@ class Import:
|
|||||||
# Abbruch des Imports und Ausgabe einer Fehlermeldung, wenn mindestens eine Punktnummer aus der Importdatei bereits in der Tabelle Netzpunkte vorhanden ist.
|
# Abbruch des Imports und Ausgabe einer Fehlermeldung, wenn mindestens eine Punktnummer aus der Importdatei bereits in der Tabelle Netzpunkte vorhanden ist.
|
||||||
if row[0] in liste_punktnummern_db:
|
if row[0] in liste_punktnummern_db:
|
||||||
Import_abbrechen = True
|
Import_abbrechen = True
|
||||||
print(f"Der Import wurde abgebrochen, weil mindestens ein Teil der Punktnummern aus der Datei {pfad_datei} bereits in der Datenbank vorhanden ist. Bitte in der Datei ändern und Import wiederholen.")
|
print(f"❌ Der Import wurde abgebrochen, weil mindestens ein Teil der Punktnummern aus der Datei {pfad_datei} bereits in der Datenbank vorhanden ist. Bitte in der Datei ändern und Import wiederholen.")
|
||||||
break
|
break
|
||||||
liste_punktnummern_vorher_db.append(row[0])
|
liste_punktnummern_vorher_db.append(row[0])
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ class Import:
|
|||||||
con.commit()
|
con.commit()
|
||||||
cursor.close()
|
cursor.close()
|
||||||
con.close()
|
con.close()
|
||||||
print("Der Import der Näherungskoordinaten wurde erfolgreich abgeschlossen")
|
print("✅ Der Import der Näherungskoordinaten wurde erfolgreich abgeschlossen")
|
||||||
|
|
||||||
def ist_rundung_von_jxl(self, wert_csv: str, wert_jxl: str) -> bool:
|
def ist_rundung_von_jxl(self, wert_csv: str, wert_jxl: str) -> bool:
|
||||||
"""Prüft, ob ein CSV-Wert eine Rundung eines JXL-Wertes (mit mehr Nachkommastellen) ist.
|
"""Prüft, ob ein CSV-Wert eine Rundung eines JXL-Wertes (mit mehr Nachkommastellen) ist.
|
||||||
@@ -431,7 +431,7 @@ class Import:
|
|||||||
if zaehler >= len(liste_records):
|
if zaehler >= len(liste_records):
|
||||||
Import_fortsetzen = False
|
Import_fortsetzen = False
|
||||||
print(
|
print(
|
||||||
f"Der Vorgang wurde abgebrochen: Standpunkt {standpunkt} kommt in der CSV öfter vor als in der JXL.")
|
f"❌ Der Vorgang wurde abgebrochen: Standpunkt {standpunkt} kommt in der CSV öfter vor als in der JXL.")
|
||||||
break
|
break
|
||||||
|
|
||||||
station_id, ih = liste_records[zaehler]
|
station_id, ih = liste_records[zaehler]
|
||||||
@@ -545,7 +545,7 @@ class Import:
|
|||||||
writer.writerow(row)
|
writer.writerow(row)
|
||||||
|
|
||||||
if Import_fortsetzen:
|
if Import_fortsetzen:
|
||||||
print(f"Korrektur erfolgreich abgeschlossen. Ausgabe: {pfad_datei_csv_out}")
|
print(f"✅ Korrektur erfolgreich abgeschlossen. Ausgabe: {pfad_datei_csv_out}")
|
||||||
print(f"Ersetzungen in der CSV-Datei (Rundung -> JXL volle Nachkommastellen): {dict_ersetzungen}")
|
print(f"Ersetzungen in der CSV-Datei (Rundung -> JXL volle Nachkommastellen): {dict_ersetzungen}")
|
||||||
|
|
||||||
# Ausgabe der Zeilennummern in der JXL-Datei ohne Instrumentenhöhe
|
# Ausgabe der Zeilennummern in der JXL-Datei ohne Instrumentenhöhe
|
||||||
@@ -566,7 +566,7 @@ class Import:
|
|||||||
print(f"Anzahl: {len(liste_zeilen_standpunkt_nicht_in_jxl)}")
|
print(f"Anzahl: {len(liste_zeilen_standpunkt_nicht_in_jxl)}")
|
||||||
print(liste_zeilen_standpunkt_nicht_in_jxl)
|
print(liste_zeilen_standpunkt_nicht_in_jxl)
|
||||||
else:
|
else:
|
||||||
print("Die Korrektur der CSV-Datei wurde abgebrochen.")
|
print("❌ Die Korrektur der CSV-Datei wurde abgebrochen.")
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"Import_fortsetzen": Import_fortsetzen,
|
"Import_fortsetzen": Import_fortsetzen,
|
||||||
@@ -716,7 +716,7 @@ class Import:
|
|||||||
if liste_fehlerhafte_zeile != []:
|
if liste_fehlerhafte_zeile != []:
|
||||||
fehler_zeilen = ", ".join(map(str, liste_fehlerhafte_zeile))
|
fehler_zeilen = ", ".join(map(str, liste_fehlerhafte_zeile))
|
||||||
print(
|
print(
|
||||||
f"Das Einlesen der Datei {pfad_datei} wurde abgebrochen.\n"
|
f"❌ Das Einlesen der Datei {pfad_datei} wurde abgebrochen.\n"
|
||||||
f"Bitte bearbeiten Sie die Zeilen rund um: {fehler_zeilen} in der csv-Datei "
|
f"Bitte bearbeiten Sie die Zeilen rund um: {fehler_zeilen} in der csv-Datei "
|
||||||
f"und wiederholen Sie den Import."
|
f"und wiederholen Sie den Import."
|
||||||
)
|
)
|
||||||
@@ -724,7 +724,7 @@ class Import:
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
print(
|
print(
|
||||||
f"Der Import wurde abgebrochen, weil die Beobachtungen aus der Datei {pfad_datei} bereits in der Datenbank vorhanden sind.")
|
f"❌ Der Import wurde abgebrochen, weil die Beobachtungen aus der Datei {pfad_datei} bereits in der Datenbank vorhanden sind.")
|
||||||
|
|
||||||
if Import_fortsetzen:
|
if Import_fortsetzen:
|
||||||
liste_beobachtungen_import = []
|
liste_beobachtungen_import = []
|
||||||
@@ -756,13 +756,13 @@ class Import:
|
|||||||
prismenhoehe = liste_aktueller_zielpunkt[8]
|
prismenhoehe = liste_aktueller_zielpunkt[8]
|
||||||
else:
|
else:
|
||||||
Import_fortsetzen = False
|
Import_fortsetzen = False
|
||||||
print(f"Der Import wurde abgebrochen, weil für zwei Halbsätze vom Standpunkt {liste_aktueller_zielpunkt[3]} zum Zielpunkt {aktueller_zielpunkt} unterschiedliche Prismenhöhen vorliegen. Bitte in der Datei {pfad_datei} korrigieren und Import neustarten.")
|
print(f"❌ Der Import wurde abgebrochen, weil für zwei Halbsätze vom Standpunkt {liste_aktueller_zielpunkt[3]} zum Zielpunkt {aktueller_zielpunkt} unterschiedliche Prismenhöhen vorliegen. Bitte in der Datei {pfad_datei} korrigieren und Import neustarten.")
|
||||||
|
|
||||||
if liste_aktueller_zielpunkt[9] == liste[9]:
|
if liste_aktueller_zielpunkt[9] == liste[9]:
|
||||||
instrumentenhoehe_import = liste_aktueller_zielpunkt[9]
|
instrumentenhoehe_import = liste_aktueller_zielpunkt[9]
|
||||||
else:
|
else:
|
||||||
Import_fortsetzen = False
|
Import_fortsetzen = False
|
||||||
print(f"Der Import wurde abgebrochen, weil für zwei Halbsätze vom Standpunkt {liste_aktueller_zielpunkt[3]} zum Zielpunkt {aktueller_zielpunkt} unterschiedliche Instrumentenhöhen vorliegen. Bitte in der Datei {pfad_datei} korrigieren und Import neustarten.")
|
print(f"❌ Der Import wurde abgebrochen, weil für zwei Halbsätze vom Standpunkt {liste_aktueller_zielpunkt[3]} zum Zielpunkt {aktueller_zielpunkt} unterschiedliche Instrumentenhöhen vorliegen. Bitte in der Datei {pfad_datei} korrigieren und Import neustarten.")
|
||||||
|
|
||||||
# Umrechnen der Zenitwinkel und Schrägdistanzen auf den Boden unter Verwendung der Instrumenten- und Prismenhöhen
|
# Umrechnen der Zenitwinkel und Schrägdistanzen auf den Boden unter Verwendung der Instrumenten- und Prismenhöhen
|
||||||
schraegdistanz_bodenbezogen, zenitwinkel_bodenbezogen = self.berechnungen.berechne_zenitwinkel_distanz_bodenbezogen(
|
schraegdistanz_bodenbezogen, zenitwinkel_bodenbezogen = self.berechnungen.berechne_zenitwinkel_distanz_bodenbezogen(
|
||||||
@@ -779,7 +779,7 @@ class Import:
|
|||||||
if instrumentenID not in liste_instrumentenid:
|
if instrumentenID not in liste_instrumentenid:
|
||||||
Import_fortsetzen = False
|
Import_fortsetzen = False
|
||||||
print(
|
print(
|
||||||
"Der Import wurde abgebrochen. Bitte eine gültige InstrumentenID eingeben. Bei Bedarf ist das Instrument neu anzulegen.")
|
"❌ Der Import wurde abgebrochen. Bitte eine gültige InstrumentenID eingeben. Bei Bedarf ist das Instrument neu anzulegen.")
|
||||||
|
|
||||||
# Berechnete bodenbezogene Beobachtungen, welche jeweils auf den Vollsatz reduziert sind, in die Tabelle Beobachtungen importieren.
|
# Berechnete bodenbezogene Beobachtungen, welche jeweils auf den Vollsatz reduziert sind, in die Tabelle Beobachtungen importieren.
|
||||||
if Import_fortsetzen:
|
if Import_fortsetzen:
|
||||||
@@ -794,7 +794,7 @@ class Import:
|
|||||||
con.commit()
|
con.commit()
|
||||||
cursor.close()
|
cursor.close()
|
||||||
con.close()
|
con.close()
|
||||||
print(f"Der Import der Datei {pfad_datei} wurde erfolgreich abgeschlossen.")
|
print(f"✅ Der Import der Datei {pfad_datei} wurde erfolgreich abgeschlossen.")
|
||||||
|
|
||||||
def vorbereitung_import_beobachtungen_nivellement_naeherung_punkthoehen(self, pfad_datei: str,
|
def vorbereitung_import_beobachtungen_nivellement_naeherung_punkthoehen(self, pfad_datei: str,
|
||||||
instrumentenID: int) -> None | tuple[None, None] | tuple[dict[Any, Any], list[Any]]:
|
instrumentenID: int) -> None | tuple[None, None] | tuple[dict[Any, Any], list[Any]]:
|
||||||
@@ -835,14 +835,14 @@ class Import:
|
|||||||
# Abbruch des Imports, wenn bereits Daten aus der Datei importiert wurden.
|
# Abbruch des Imports, wenn bereits Daten aus der Datei importiert wurden.
|
||||||
if pfad_datei in liste_dateinamen_in_db:
|
if pfad_datei in liste_dateinamen_in_db:
|
||||||
Import_fortsetzen = False
|
Import_fortsetzen = False
|
||||||
print(f"Der Import wurde abgebrochen, weil die Beobachtungen aus der Datei {pfad_datei} bereits in der Datenbank vorhanden sind.")
|
print(f"❌ Der Import wurde abgebrochen, weil die Beobachtungen aus der Datei {pfad_datei} bereits in der Datenbank vorhanden sind.")
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
# Abbruch, wenn das Instrument noch nicht vom Benutzer angelegt wurde.
|
# Abbruch, wenn das Instrument noch nicht vom Benutzer angelegt wurde.
|
||||||
if instrumentenID not in liste_instrumentenid:
|
if instrumentenID not in liste_instrumentenid:
|
||||||
Import_fortsetzen = False
|
Import_fortsetzen = False
|
||||||
print(
|
print(
|
||||||
"Der Import wurde abgebrochen. Bitte eine gültige InstrumentenID eingeben. Bei Bedarf ist das Instrument neu anzulegen.")
|
"❌ Der Import wurde abgebrochen. Bitte eine gültige InstrumentenID eingeben. Bei Bedarf ist das Instrument neu anzulegen.")
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
if Import_fortsetzen:
|
if Import_fortsetzen:
|
||||||
@@ -917,7 +917,7 @@ class Import:
|
|||||||
|
|
||||||
if dict_punkt_mittelwert_punkthoehen == None or liste_punktnummern_in_db == None or liste_punktnummern_hinzufuegen == None:
|
if dict_punkt_mittelwert_punkthoehen == None or liste_punktnummern_in_db == None or liste_punktnummern_hinzufuegen == None:
|
||||||
Import_fortsetzen = False
|
Import_fortsetzen = False
|
||||||
print("Der Import der Nivellementbeobachtungen wurde abgebrochen.")
|
print("❌ Der Import der Nivellementbeobachtungen wurde abgebrochen.")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
con = sqlite3.connect(self.pfad_datenbank)
|
con = sqlite3.connect(self.pfad_datenbank)
|
||||||
@@ -993,13 +993,13 @@ class Import:
|
|||||||
# Import abbrechen, wenn bereits Daten aus der selben Datei importiert wurden
|
# Import abbrechen, wenn bereits Daten aus der selben Datei importiert wurden
|
||||||
if pfad_datei in liste_dateinamen_in_db:
|
if pfad_datei in liste_dateinamen_in_db:
|
||||||
Import_fortsetzen = False
|
Import_fortsetzen = False
|
||||||
print(f"Der Import wurde abgebrochen, weil die Beobachtungen aus der Datei {pfad_datei} bereits in der Datenbank vorhanden sind.")
|
print(f"❌ Der Import wurde abgebrochen, weil die Beobachtungen aus der Datei {pfad_datei} bereits in der Datenbank vorhanden sind.")
|
||||||
|
|
||||||
# Import abbrechen, wenn das Instrument noch nicht vom Benutzer angelegt wurde.
|
# Import abbrechen, wenn das Instrument noch nicht vom Benutzer angelegt wurde.
|
||||||
if instrumentenID not in liste_instrumentenid:
|
if instrumentenID not in liste_instrumentenid:
|
||||||
Import_fortsetzen = False
|
Import_fortsetzen = False
|
||||||
print(
|
print(
|
||||||
"Der Import wurde abgebrochen. Bitte eine gültige InstrumentenID eingeben. Bei Bedarf ist das Instrument neu anzulegen.")
|
"❌ Der Import wurde abgebrochen. Bitte eine gültige InstrumentenID eingeben. Bei Bedarf ist das Instrument neu anzulegen.")
|
||||||
|
|
||||||
if Import_fortsetzen:
|
if Import_fortsetzen:
|
||||||
# rvvr = Rück, Vor, Vor, Rück
|
# rvvr = Rück, Vor, Vor, Rück
|
||||||
@@ -1171,10 +1171,10 @@ class Import:
|
|||||||
con.commit()
|
con.commit()
|
||||||
cursor.close()
|
cursor.close()
|
||||||
con.close()
|
con.close()
|
||||||
return f"Die Beobachtungen aus der Datei {pfad_datei} wurden erfolgreich importiert."
|
return f"✅ Die Beobachtungen aus der Datei {pfad_datei} wurden erfolgreich importiert."
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print(f"Anzahl RVVR durch 4 teilbar. Bitte die Datei {pfad_datei} überprüfen! Der Import wurde abgebrochen.")
|
print(f"❌ Anzahl RVVR nicht durch 4 teilbar. Bitte die Datei {pfad_datei} überprüfen! Der Import wurde abgebrochen.")
|
||||||
Import_fortsetzen = False
|
Import_fortsetzen = False
|
||||||
|
|
||||||
def import_koordinaten_gnss(self, pfad_datei: str, liste_sapos_stationen_genauigkeiten: list) -> str:
|
def import_koordinaten_gnss(self, pfad_datei: str, liste_sapos_stationen_genauigkeiten: list) -> str:
|
||||||
@@ -1265,7 +1265,7 @@ class Import:
|
|||||||
if instrumentenID not in liste_instrumentenid:
|
if instrumentenID not in liste_instrumentenid:
|
||||||
Import_fortsetzen = False
|
Import_fortsetzen = False
|
||||||
print(
|
print(
|
||||||
"Der Import wurde abgebrochen. Bitte eine gültige InstrumentenID eingeben. Bei Bedarf ist das Instrument neu anzulegen.")
|
"❌ Der Import wurde abgebrochen. Bitte eine gültige InstrumentenID eingeben. Bei Bedarf ist das Instrument neu anzulegen.")
|
||||||
|
|
||||||
if Import_fortsetzen:
|
if Import_fortsetzen:
|
||||||
liste_basilinien = []
|
liste_basilinien = []
|
||||||
@@ -1285,7 +1285,7 @@ class Import:
|
|||||||
|
|
||||||
else:
|
else:
|
||||||
print(
|
print(
|
||||||
f"Der Import wurde abgebrochen, weil die Beobachtungen aus der Datei {pfad_datei} bereits in der Datenbank vorhanden sind.")
|
f"❌ Der Import wurde abgebrochen, weil die Beobachtungen aus der Datei {pfad_datei} bereits in der Datenbank vorhanden sind.")
|
||||||
|
|
||||||
if Import_fortsetzen:
|
if Import_fortsetzen:
|
||||||
con = sqlite3.connect(self.pfad_datenbank)
|
con = sqlite3.connect(self.pfad_datenbank)
|
||||||
@@ -1297,4 +1297,4 @@ class Import:
|
|||||||
con.commit()
|
con.commit()
|
||||||
cursor.close()
|
cursor.close()
|
||||||
con.close()
|
con.close()
|
||||||
print(f"Der Import der Datei {pfad_datei} wurde erfolgreich abgeschlossen.")
|
print(f"✅ Der Import der Datei {pfad_datei} wurde erfolgreich abgeschlossen.")
|
||||||
@@ -23,7 +23,7 @@ class Genauigkeitsmaße:
|
|||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def berechne_s0apost(v: np.ndarray, P: np.ndarray, r: int) -> float:
|
def berechne_s0apost(v: np.ndarray, P: np.ndarray, r: int, print_ausgabe = True) -> float:
|
||||||
"""
|
"""
|
||||||
Berechnet die a-posteriori Standardabweichung der Gewichtseinheit s₀.
|
Berechnet die a-posteriori Standardabweichung der Gewichtseinheit s₀.
|
||||||
|
|
||||||
@@ -44,6 +44,7 @@ class Genauigkeitsmaße:
|
|||||||
vTPv_matrix = v.T @ P @ v
|
vTPv_matrix = v.T @ P @ v
|
||||||
vTPv = vTPv_matrix.item()
|
vTPv = vTPv_matrix.item()
|
||||||
s0apost = np.sqrt(vTPv / r)
|
s0apost = np.sqrt(vTPv / r)
|
||||||
|
if print_ausgabe:
|
||||||
print(f"s0 a posteriori beträgt: {s0apost:.4f}")
|
print(f"s0 a posteriori beträgt: {s0apost:.4f}")
|
||||||
return s0apost
|
return s0apost
|
||||||
|
|
||||||
@@ -109,7 +110,7 @@ class Genauigkeitsmaße:
|
|||||||
|
|
||||||
helmert_punktfehler = pd.DataFrame(daten, columns=["Punkt", "σx", "σy", "σz", f"σP_{dim}D"])
|
helmert_punktfehler = pd.DataFrame(daten, columns=["Punkt", "σx", "σy", "σz", f"σP_{dim}D"])
|
||||||
display(HTML(helmert_punktfehler.to_html(index=False)))
|
display(HTML(helmert_punktfehler.to_html(index=False)))
|
||||||
helmert_punktfehler.to_excel(r"Zwischenergebnisse\Standardabweichungen_Helmertscher_Punktfehler.xlsx",index=False)
|
helmert_punktfehler.to_excel(r"Netzqualitaet\Standardabweichungen_Helmertscher_Punktfehler.xlsx",index=False)
|
||||||
return helmert_punktfehler
|
return helmert_punktfehler
|
||||||
|
|
||||||
|
|
||||||
@@ -204,7 +205,7 @@ class Genauigkeitsmaße:
|
|||||||
standardellipse["Kleine Halbachse [m]"] = standardellipse["Kleine Halbachse [m]"].astype(float).round(4)
|
standardellipse["Kleine Halbachse [m]"] = standardellipse["Kleine Halbachse [m]"].astype(float).round(4)
|
||||||
standardellipse["θ [gon]"] = standardellipse["θ [gon]"].astype(float).round(3)
|
standardellipse["θ [gon]"] = standardellipse["θ [gon]"].astype(float).round(3)
|
||||||
display(HTML(standardellipse.to_html(index=False)))
|
display(HTML(standardellipse.to_html(index=False)))
|
||||||
standardellipse.to_excel(r"Zwischenergebnisse\Standardellipse.xlsx", index=False)
|
standardellipse.to_excel(r"Netzqualitaet\Standardellipse.xlsx", index=False)
|
||||||
return standardellipse
|
return standardellipse
|
||||||
|
|
||||||
|
|
||||||
@@ -313,7 +314,7 @@ class Genauigkeitsmaße:
|
|||||||
konfidenzellipse["θ [gon]"] = konfidenzellipse["θ [gon]"].round(3)
|
konfidenzellipse["θ [gon]"] = konfidenzellipse["θ [gon]"].round(3)
|
||||||
if ausgabe_erfolgt == False:
|
if ausgabe_erfolgt == False:
|
||||||
display(HTML(konfidenzellipse.to_html(index=False)))
|
display(HTML(konfidenzellipse.to_html(index=False)))
|
||||||
konfidenzellipse.to_excel(r"Zwischenergebnisse\Konfidenzellipse.xlsx", index=False)
|
konfidenzellipse.to_excel(r"Netzqualitaet\Konfidenzellipse.xlsx", index=False)
|
||||||
return konfidenzellipse, alpha
|
return konfidenzellipse, alpha
|
||||||
|
|
||||||
|
|
||||||
@@ -388,7 +389,7 @@ class Genauigkeitsmaße:
|
|||||||
display(HTML(Konfidenzellipse_ENU.to_html(index=False)))
|
display(HTML(Konfidenzellipse_ENU.to_html(index=False)))
|
||||||
|
|
||||||
# 5) Export
|
# 5) Export
|
||||||
Konfidenzellipse_ENU.to_excel(r"Zwischenergebnisse\Konfidenzellipse_ENU.xlsx", index=False)
|
Konfidenzellipse_ENU.to_excel(r"Netzqualitaet\Konfidenzellipse_ENU.xlsx", index=False)
|
||||||
return Konfidenzellipse_ENU, R0
|
return Konfidenzellipse_ENU, R0
|
||||||
|
|
||||||
|
|
||||||
@@ -560,5 +561,20 @@ class Plot:
|
|||||||
align='left', showarrow=False, xref='paper', yref='paper', x=0.02, y=0.05,
|
align='left', showarrow=False, xref='paper', yref='paper', x=0.02, y=0.05,
|
||||||
bgcolor="white", bordercolor="black", borderwidth=1
|
bgcolor="white", bordercolor="black", borderwidth=1
|
||||||
)
|
)
|
||||||
|
fig.write_image(r"Netzqualitaet\netzplot_ellipsen_volle_ausdehnung.png")
|
||||||
|
return fig
|
||||||
|
|
||||||
fig.show(config={'scrollZoom': True})
|
|
||||||
|
def plot_speichere_aktuelle_ansicht(plot, dateiname=r"Netzqualitaet\netzplot_ellipsen_zoom_ansicht.png"):
|
||||||
|
|
||||||
|
aktuelles_layout = plot.layout
|
||||||
|
export_plot = go.Figure(plot.data, layout=aktuelles_layout)
|
||||||
|
export_plot.write_image(dateiname, scale=2)
|
||||||
|
print(f"✅ Aktuelle Ansicht wurde erfolgreich gespeichert: {dateiname}")
|
||||||
|
x_bereich = aktuelles_layout.xaxis.range
|
||||||
|
y_bereich = aktuelles_layout.yaxis.range
|
||||||
|
if x_bereich and y_bereich:
|
||||||
|
print(
|
||||||
|
f"Ausschnitt: E[{x_bereich[0]:.2f} bis {x_bereich[1]:.2f}], N[{y_bereich[0]:.2f} bis {y_bereich[1]:.2f}]")
|
||||||
|
else:
|
||||||
|
print("Hinweis: Es wurde die Standardansicht (kein Zoom) gespeichert.")
|
||||||
@@ -124,7 +124,7 @@ class Zuverlaessigkeit:
|
|||||||
klassen = [Zuverlaessigkeit.klassifiziere_ri(r) for r in ri]
|
klassen = [Zuverlaessigkeit.klassifiziere_ri(r) for r in ri]
|
||||||
Redundanzanteile = pd.DataFrame({"Beobachtung": labels, "r_i": ri, "EV_i [%]": EVi, "Klassifikation": klassen, })
|
Redundanzanteile = pd.DataFrame({"Beobachtung": labels, "r_i": ri, "EV_i [%]": EVi, "Klassifikation": klassen, })
|
||||||
display(HTML(Redundanzanteile.to_html(index=False)))
|
display(HTML(Redundanzanteile.to_html(index=False)))
|
||||||
Redundanzanteile.to_excel(r"Zwischenergebnisse\Redundanzanteile.xlsx", index=False)
|
Redundanzanteile.to_excel(r"Netzqualitaet\Redundanzanteile.xlsx", index=False)
|
||||||
return R, ri, EVi, Redundanzanteile
|
return R, ri, EVi, Redundanzanteile
|
||||||
|
|
||||||
|
|
||||||
@@ -211,11 +211,11 @@ class Zuverlaessigkeit:
|
|||||||
und der Grenzwert als NaN gesetzt.
|
und der Grenzwert als NaN gesetzt.
|
||||||
|
|
||||||
:param v: Residuenvektor der Beobachtungen.
|
:param v: Residuenvektor der Beobachtungen.
|
||||||
:type v: array_like
|
:type v: np.asarray
|
||||||
:param Q_vv: Kofaktor-Matrix der Residuen.
|
:param Q_vv: Kofaktor-Matrix der Residuen.
|
||||||
:type Q_vv: array_like
|
:type Q_vv: np.asarray
|
||||||
:param ri: Redundanzanteile der Beobachtungen.
|
:param ri: Redundanzanteile der Beobachtungen.
|
||||||
:type ri: array_like
|
:type ri: np.asarray
|
||||||
:param labels: Liste der Beobachtungen zur Zuordnung in der Ergebnistabelle.
|
:param labels: Liste der Beobachtungen zur Zuordnung in der Ergebnistabelle.
|
||||||
:type labels: list
|
:type labels: list
|
||||||
:param s0_apost: a-posteriori Standardabweichung der Gewichtseinheit s₀.
|
:param s0_apost: a-posteriori Standardabweichung der Gewichtseinheit s₀.
|
||||||
@@ -340,7 +340,7 @@ class Zuverlaessigkeit:
|
|||||||
gui.ausgabe_erstellen()
|
gui.ausgabe_erstellen()
|
||||||
gui.zeige_tabelle()
|
gui.zeige_tabelle()
|
||||||
|
|
||||||
Lokaltest.to_excel(r"Zwischenergebnisse\Lokaltest_innere_Zuverlaessugkeit.xlsx", index=False)
|
Lokaltest.to_excel(r"Netzqualitaet\Lokaltest_innere_Zuverlaessugkeit.xlsx", index=False)
|
||||||
return gui.ausschalten_dict, beta
|
return gui.ausschalten_dict, beta
|
||||||
|
|
||||||
|
|
||||||
@@ -563,8 +563,11 @@ class Zuverlaessigkeit:
|
|||||||
"SP_3D [mm]": SP_m * 1000.0,
|
"SP_3D [mm]": SP_m * 1000.0,
|
||||||
"EF*SP_3D [mm]": EF_SP_m * 1000.0,
|
"EF*SP_3D [mm]": EF_SP_m * 1000.0,
|
||||||
})
|
})
|
||||||
|
display(HTML(aeussere_zuverlaessigkeit.to_html(index=False)))
|
||||||
|
aeussere_zuverlaessigkeit.to_excel(r"Netzqualitaet\Aeussere_Zuverlaessigkeit.xlsx", index=False)
|
||||||
return aeussere_zuverlaessigkeit
|
return aeussere_zuverlaessigkeit
|
||||||
|
|
||||||
|
|
||||||
class LokaltestInnereZuverlaessigkeitGUI:
|
class LokaltestInnereZuverlaessigkeitGUI:
|
||||||
"""Interaktive Auswahloberfläche für den Lokaltest (innere Zuverlässigkeit).
|
"""Interaktive Auswahloberfläche für den Lokaltest (innere Zuverlässigkeit).
|
||||||
|
|
||||||
|
|||||||
22
Proben.py
22
Proben.py
@@ -8,11 +8,11 @@ def atpv_probe(A, P, v, tol=1e-7):
|
|||||||
Die Prüfung erfolgt unter Verwendung einer vorgegebenen Toleranz.
|
Die Prüfung erfolgt unter Verwendung einer vorgegebenen Toleranz.
|
||||||
|
|
||||||
:param A: Jacobi-Matrix (A-Matrix).
|
:param A: Jacobi-Matrix (A-Matrix).
|
||||||
:type A: array_like
|
:type A: np.asarray
|
||||||
:param P: Gewichtsmatrix der Beobachtungen.
|
:param P: Gewichtsmatrix der Beobachtungen.
|
||||||
:type P: array_like
|
:type P: np.asarray
|
||||||
:param v: Residuenvektor der Beobachtungen.
|
:param v: Residuenvektor der Beobachtungen.
|
||||||
:type v: array_like
|
:type v: np.asarray
|
||||||
:param tol: Absolute Toleranz für den Vergleich mit Null.
|
:param tol: Absolute Toleranz für den Vergleich mit Null.
|
||||||
:type tol: float
|
:type tol: float
|
||||||
:return: None
|
:return: None
|
||||||
@@ -25,9 +25,9 @@ def atpv_probe(A, P, v, tol=1e-7):
|
|||||||
ATPV = A.T @ P @ v
|
ATPV = A.T @ P @ v
|
||||||
|
|
||||||
if np.allclose(ATPV, 0, atol=tol):
|
if np.allclose(ATPV, 0, atol=tol):
|
||||||
print("ATPv-Probe erfolgreich")
|
print("✅ ATPv-Probe erfolgreich")
|
||||||
else:
|
else:
|
||||||
print("ATPv-Probe nicht erfolgreich. Fehler bei der Lösung des Normalgleichungssystems")
|
print("❌ ATPv-Probe nicht erfolgreich. Fehler bei der Lösung des Normalgleichungssystems")
|
||||||
|
|
||||||
|
|
||||||
def hauptprobe(A, x, l, v, tol=1e-7):
|
def hauptprobe(A, x, l, v, tol=1e-7):
|
||||||
@@ -40,13 +40,13 @@ def hauptprobe(A, x, l, v, tol=1e-7):
|
|||||||
innerhalb der Toleranz überein, gilt die Ausgleichung als konsistent.
|
innerhalb der Toleranz überein, gilt die Ausgleichung als konsistent.
|
||||||
|
|
||||||
:param A: Jacobi-Matrix (A-Matrix).
|
:param A: Jacobi-Matrix (A-Matrix).
|
||||||
:type A: array_like
|
:type A: np.asarray
|
||||||
:param x: Lösungsvektor der Unbekannten.
|
:param x: Lösungsvektor der Unbekannten.
|
||||||
:type x: array_like
|
:type x: np.asarray
|
||||||
:param l: Beobachtungsvektor.
|
:param l: Beobachtungsvektor.
|
||||||
:type l: array_like
|
:type l: np.asarray
|
||||||
:param v: Residuenvektor aus der Ausgleichung.
|
:param v: Residuenvektor aus der Ausgleichung.
|
||||||
:type v: array_like
|
:type v: np.asarray
|
||||||
:param tol: Absolute Toleranz für den Vergleich der Residuen.
|
:param tol: Absolute Toleranz für den Vergleich der Residuen.
|
||||||
:type tol: float
|
:type tol: float
|
||||||
:return: None
|
:return: None
|
||||||
@@ -60,7 +60,7 @@ def hauptprobe(A, x, l, v, tol=1e-7):
|
|||||||
v_test = A @ x - l
|
v_test = A @ x - l
|
||||||
|
|
||||||
if np.allclose(v, v_test, atol=tol):
|
if np.allclose(v, v_test, atol=tol):
|
||||||
print("Hauptprobe erfolgreich")
|
print("✅ Hauptprobe erfolgreich")
|
||||||
else:
|
else:
|
||||||
diff = v - v_test
|
diff = v - v_test
|
||||||
print("Hauptprobe nicht erfolgreich. Abweichung zu v: ", diff)
|
print("❌ Hauptprobe nicht erfolgreich. Abweichung zu v: ", diff)
|
||||||
@@ -41,7 +41,7 @@ class VKS:
|
|||||||
|
|
||||||
self.db_zugriff = Datenbank.Datenbankzugriff(self.pfad_datenbank)
|
self.db_zugriff = Datenbank.Datenbankzugriff(self.pfad_datenbank)
|
||||||
|
|
||||||
def varianzkomponten_berechnen(self, Jacobimatrix_symbolisch_liste_beobachtungsvektor: list, res: dict, R: np.ndarray) -> None:
|
def varianzkomponten_berechnen(self, Jacobimatrix_symbolisch_liste_beobachtungsvektor: list, res: dict, R: np.ndarray) -> pd.DataFrame:
|
||||||
"""Berechnet a-posteriori Varianzen und a-posteriori Standardabweichungen je Beobachtungsgruppe.
|
"""Berechnet a-posteriori Varianzen und a-posteriori Standardabweichungen je Beobachtungsgruppe.
|
||||||
|
|
||||||
Teilt die Residuen v, die Gewichtsmatrix P sowie die Redundanzmatrix R gemäß der in
|
Teilt die Residuen v, die Gewichtsmatrix P sowie die Redundanzmatrix R gemäß der in
|
||||||
@@ -57,10 +57,12 @@ class VKS:
|
|||||||
:type res: dict
|
:type res: dict
|
||||||
:param R: Redundanzmatrix (z. B. aus R = Q_vv @ P oder äquivalent), passend zu v/P dimensioniert.
|
:param R: Redundanzmatrix (z. B. aus R = Q_vv @ P oder äquivalent), passend zu v/P dimensioniert.
|
||||||
:type R: np.ndarray
|
:type R: np.ndarray
|
||||||
:return: None
|
:return: DataFrame mit den Spalten 'Beobachtungsgruppe', 'Standardabweichung', 'Varianz'
|
||||||
:rtype: None
|
:rtype: pd.DataFrame
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
liste_ergebnisse = []
|
||||||
|
|
||||||
# Zeilen- und Spaltennummern der jeweiligen Beobachtungsgruppe, z.B. SD für Schrägdistanz ermitteln
|
# Zeilen- und Spaltennummern der jeweiligen Beobachtungsgruppe, z.B. SD für Schrägdistanz ermitteln
|
||||||
dict_indizes_beobachtungsgruppen = Datumsfestlegung.Datumsfestlegung.indizes_beobachtungsvektor_nach_beobachtungsgruppe(
|
dict_indizes_beobachtungsgruppen = Datumsfestlegung.Datumsfestlegung.indizes_beobachtungsvektor_nach_beobachtungsgruppe(
|
||||||
Jacobimatrix_symbolisch_liste_beobachtungsvektor)
|
Jacobimatrix_symbolisch_liste_beobachtungsvektor)
|
||||||
@@ -76,10 +78,10 @@ class VKS:
|
|||||||
aufgeteilt_P_SD = res["P"][z_start: z_ende + 1, s_start: s_ende + 1]
|
aufgeteilt_P_SD = res["P"][z_start: z_ende + 1, s_start: s_ende + 1]
|
||||||
aufgeteilt_R_SD = R[z_start: z_ende + 1, s_start: s_ende + 1]
|
aufgeteilt_R_SD = R[z_start: z_ende + 1, s_start: s_ende + 1]
|
||||||
ri_SD = sum(np.diag(aufgeteilt_R_SD))
|
ri_SD = sum(np.diag(aufgeteilt_R_SD))
|
||||||
s0_aposteriori_SD = Genauigkeitsmaße.berechne_s0apost(aufgeteilt_v_SD, aufgeteilt_P_SD, ri_SD)
|
s0_aposteriori_SD = Genauigkeitsmaße.berechne_s0apost(aufgeteilt_v_SD, aufgeteilt_P_SD, ri_SD, False)
|
||||||
print(f"s0 aposteriori der Beobachtungsgruppe {beobachtungsgruppe} beträgt: {s0_aposteriori_SD:.4f}")
|
liste_ergebnisse.append(
|
||||||
print(
|
{"Beobachtungsgruppe": beobachtungsgruppe, "Standardabweichung a posteriori": s0_aposteriori_SD,
|
||||||
f"Varianz aposteriori der Beobachtungsgruppe {beobachtungsgruppe} beträgt: {s0_aposteriori_SD ** 2:.4f}")
|
"Varianz a posteriori": s0_aposteriori_SD ** 2})
|
||||||
|
|
||||||
# R = Tachymeter Richtungsbeobachtungen
|
# R = Tachymeter Richtungsbeobachtungen
|
||||||
if beobachtungsgruppe == "R":
|
if beobachtungsgruppe == "R":
|
||||||
@@ -87,10 +89,10 @@ class VKS:
|
|||||||
aufgeteilt_P_R = res["P"][z_start: z_ende + 1, s_start: s_ende + 1]
|
aufgeteilt_P_R = res["P"][z_start: z_ende + 1, s_start: s_ende + 1]
|
||||||
aufgeteilt_R_R = R[z_start: z_ende + 1, s_start: s_ende + 1]
|
aufgeteilt_R_R = R[z_start: z_ende + 1, s_start: s_ende + 1]
|
||||||
ri_R = sum(np.diag(aufgeteilt_R_R))
|
ri_R = sum(np.diag(aufgeteilt_R_R))
|
||||||
s0_aposteriori_R = Genauigkeitsmaße.berechne_s0apost(aufgeteilt_v_R, aufgeteilt_P_R, ri_R)
|
s0_aposteriori_R = Genauigkeitsmaße.berechne_s0apost(aufgeteilt_v_R, aufgeteilt_P_R, ri_R, False)
|
||||||
print(f"s0 aposteriori der Beobachtungsgruppe {beobachtungsgruppe} beträgt: {s0_aposteriori_R:.4f}")
|
liste_ergebnisse.append(
|
||||||
print(
|
{"Beobachtungsgruppe": beobachtungsgruppe, "Standardabweichung a posteriori": s0_aposteriori_R,
|
||||||
f"Varianz aposteriori der Beobachtungsgruppe {beobachtungsgruppe} beträgt: {s0_aposteriori_R ** 2:.4f}")
|
"Varianz a posteriori": s0_aposteriori_R ** 2})
|
||||||
|
|
||||||
# ZW = Tachymeter Zenitwinkelbeobachtung
|
# ZW = Tachymeter Zenitwinkelbeobachtung
|
||||||
if beobachtungsgruppe == "ZW":
|
if beobachtungsgruppe == "ZW":
|
||||||
@@ -98,10 +100,10 @@ class VKS:
|
|||||||
aufgeteilt_P_ZW = res["P"][z_start: z_ende + 1, s_start: s_ende + 1]
|
aufgeteilt_P_ZW = res["P"][z_start: z_ende + 1, s_start: s_ende + 1]
|
||||||
aufgeteilt_R_ZW = R[z_start: z_ende + 1, s_start: s_ende + 1]
|
aufgeteilt_R_ZW = R[z_start: z_ende + 1, s_start: s_ende + 1]
|
||||||
ri_ZW = sum(np.diag(aufgeteilt_R_ZW))
|
ri_ZW = sum(np.diag(aufgeteilt_R_ZW))
|
||||||
s0_aposteriori_ZW = Genauigkeitsmaße.berechne_s0apost(aufgeteilt_v_ZW, aufgeteilt_P_ZW, ri_ZW)
|
s0_aposteriori_ZW = Genauigkeitsmaße.berechne_s0apost(aufgeteilt_v_ZW, aufgeteilt_P_ZW, ri_ZW, False)
|
||||||
print(f"s0 aposteriori der Beobachtungsgruppe {beobachtungsgruppe} beträgt: {s0_aposteriori_ZW:.4f}")
|
liste_ergebnisse.append(
|
||||||
print(
|
{"Beobachtungsgruppe": beobachtungsgruppe, "Standardabweichung a posteriori": s0_aposteriori_ZW,
|
||||||
f"Varianz aposteriori der Beobachtungsgruppe {beobachtungsgruppe} beträgt: {s0_aposteriori_ZW ** 2:.4f}")
|
"Varianz a posteriori": s0_aposteriori_ZW ** 2})
|
||||||
|
|
||||||
# GNSS = GNSS-Basisilinien
|
# GNSS = GNSS-Basisilinien
|
||||||
if beobachtungsgruppe == "gnss":
|
if beobachtungsgruppe == "gnss":
|
||||||
@@ -109,10 +111,10 @@ class VKS:
|
|||||||
aufgeteilt_P_gnss = res["P"][z_start: z_ende + 1, s_start: s_ende + 1]
|
aufgeteilt_P_gnss = res["P"][z_start: z_ende + 1, s_start: s_ende + 1]
|
||||||
aufgeteilt_R_gnss = R[z_start: z_ende + 1, s_start: s_ende + 1]
|
aufgeteilt_R_gnss = R[z_start: z_ende + 1, s_start: s_ende + 1]
|
||||||
ri_gnss = sum(np.diag(aufgeteilt_R_gnss))
|
ri_gnss = sum(np.diag(aufgeteilt_R_gnss))
|
||||||
s0_aposteriori_gnss = Genauigkeitsmaße.berechne_s0apost(aufgeteilt_v_gnss, aufgeteilt_P_gnss, ri_gnss)
|
s0_aposteriori_gnss = Genauigkeitsmaße.berechne_s0apost(aufgeteilt_v_gnss, aufgeteilt_P_gnss, ri_gnss, False)
|
||||||
print(f"s0 aposteriori der Beobachtungsgruppe {beobachtungsgruppe} beträgt: {s0_aposteriori_gnss:.4f}")
|
liste_ergebnisse.append(
|
||||||
print(
|
{"Beobachtungsgruppe": beobachtungsgruppe, "Standardabweichung a posteriori": s0_aposteriori_gnss,
|
||||||
f"Varianz aposteriori der Beobachtungsgruppe {beobachtungsgruppe} beträgt: {s0_aposteriori_gnss ** 2:.4f}")
|
"Varianz a posteriori": s0_aposteriori_gnss ** 2})
|
||||||
|
|
||||||
# niv = geometrisches Nivellement
|
# niv = geometrisches Nivellement
|
||||||
if beobachtungsgruppe == "niv":
|
if beobachtungsgruppe == "niv":
|
||||||
@@ -120,10 +122,10 @@ class VKS:
|
|||||||
aufgeteilt_P_niv = res["P"][z_start: z_ende + 1, s_start: s_ende + 1]
|
aufgeteilt_P_niv = res["P"][z_start: z_ende + 1, s_start: s_ende + 1]
|
||||||
aufgeteilt_R_niv = R[z_start: z_ende + 1, s_start: s_ende + 1]
|
aufgeteilt_R_niv = R[z_start: z_ende + 1, s_start: s_ende + 1]
|
||||||
ri_niv = sum(np.diag(aufgeteilt_R_niv))
|
ri_niv = sum(np.diag(aufgeteilt_R_niv))
|
||||||
s0_aposteriori_niv = Genauigkeitsmaße.berechne_s0apost(aufgeteilt_v_niv, aufgeteilt_P_niv, ri_niv)
|
s0_aposteriori_niv = Genauigkeitsmaße.berechne_s0apost(aufgeteilt_v_niv, aufgeteilt_P_niv, ri_niv, False)
|
||||||
print(f"s0 aposteriori der Beobachtungsgruppe {beobachtungsgruppe} beträgt: {s0_aposteriori_niv:.4f}")
|
liste_ergebnisse.append(
|
||||||
print(
|
{"Beobachtungsgruppe": beobachtungsgruppe, "Standardabweichung a posteriori": s0_aposteriori_niv,
|
||||||
f"Varianz aposteriori der Beobachtungsgruppe {beobachtungsgruppe} beträgt: {s0_aposteriori_niv ** 2:.4f}")
|
"Varianz a posteriori": s0_aposteriori_niv ** 2})
|
||||||
|
|
||||||
# lA = Anschlusspunkte für die weiche Lagerung
|
# lA = Anschlusspunkte für die weiche Lagerung
|
||||||
if beobachtungsgruppe == "lA":
|
if beobachtungsgruppe == "lA":
|
||||||
@@ -131,10 +133,13 @@ class VKS:
|
|||||||
aufgeteilt_P_lA = res["P"][z_start: z_ende + 1, s_start: s_ende + 1]
|
aufgeteilt_P_lA = res["P"][z_start: z_ende + 1, s_start: s_ende + 1]
|
||||||
aufgeteilt_R_lA = R[z_start: z_ende + 1, s_start: s_ende + 1]
|
aufgeteilt_R_lA = R[z_start: z_ende + 1, s_start: s_ende + 1]
|
||||||
ri_lA = sum(np.diag(aufgeteilt_R_lA))
|
ri_lA = sum(np.diag(aufgeteilt_R_lA))
|
||||||
s0_aposteriori_lA = Genauigkeitsmaße.berechne_s0apost(aufgeteilt_v_lA, aufgeteilt_P_lA, ri_lA)
|
s0_aposteriori_lA = Genauigkeitsmaße.berechne_s0apost(aufgeteilt_v_lA, aufgeteilt_P_lA, ri_lA, False)
|
||||||
print(f"s0 aposteriori der Beobachtungsgruppe {beobachtungsgruppe} beträgt: {s0_aposteriori_lA:.4f}")
|
liste_ergebnisse.append(
|
||||||
print(
|
{"Beobachtungsgruppe": beobachtungsgruppe, "Standardabweichung a posteriori": s0_aposteriori_lA,
|
||||||
f"Varianz aposteriori der Beobachtungsgruppe {beobachtungsgruppe} beträgt: {s0_aposteriori_lA ** 2:.4f}")
|
"Varianz a posteriori": s0_aposteriori_lA ** 2})
|
||||||
|
|
||||||
|
df_varianzkomponenten = pd.DataFrame(liste_ergebnisse)
|
||||||
|
return df_varianzkomponenten
|
||||||
|
|
||||||
def vks_ausfuehren(self) -> None:
|
def vks_ausfuehren(self) -> None:
|
||||||
"""Initialisiert die interaktive VKS-Eingabetabelle.
|
"""Initialisiert die interaktive VKS-Eingabetabelle.
|
||||||
|
|||||||
Reference in New Issue
Block a user