Files
Masterprojekt_V3/Funktionales_Modell.py

774 lines
38 KiB
Python

from Datenbank import Datenbankzugriff
import sympy as sp
from Export import Export
from Berechnungen import Berechnungen
import numpy as np
import importlib
from Koordinatentransformationen import Transformationen
class FunktionalesModell:
def __init__(self, pfad_datenbank, a, b, pfad_tif_quasigeoidundolation = None):
self.pfad_datenbank = pfad_datenbank
self.a = a
self.b = b
self.berechnungen = Berechnungen(self.a, self.b)
self.trafos = Transformationen(pfad_datenbank)
self.pfad_tif_quasigeoidundolation = pfad_tif_quasigeoidundolation
self.substitutionen_dict = self.dict_substitutionen_uebergeordnetes_system()
self.dict_punkt_symbole = {}
self.liste_symbole_lambdify = sorted(self.substitutionen_dict.keys(), key=lambda s: str(s))
self.func_beob0 = None
self.func_A0 = None
self.func_u0 = None
self.liste_beobachtungsvektor_symbolisch = None
def jacobi_matrix_symbolisch(self, datumsfestlegung = None, liste_unbekannte_datumsfestlegung = None):
#liste_beobachtungsarten = ["tachymeter_distanz", "tachymeter_richtung", "tachymeter_zenitwinkel"]
liste_beobachtungsarten = ["tachymeter_distanz", "tachymeter_richtung", "tachymeter_zenitwinkel", "gnss_basislinien", "geometrisches_nivellement"]
#liste_beobachtungsarten = ["tachymeter_distanz", "tachymeter_richtung", "tachymeter_zenitwinkel",
# "gnss_basislinien"]
db_zugriff = Datenbankzugriff(self.pfad_datenbank)
liste_beobachtungen_rohdaten_gnssbasislinien = []
liste_beobachtungen_rohdaten_tachymeter = []
liste_beobachtungen_rohdaten_nivellement = []
liste_punktnummern =[]
liste_orientierungsunbekannte = []
for beobachtungsart in liste_beobachtungsarten:
#Tachymeter Block
if beobachtungsart.startswith("tachymeter"):
liste_id_standpunkt_zielpunkt = db_zugriff.get_beobachtungen_id_beobachtungsgruppe_standpunkt_zielpunkt(beobachtungsart)
for beobachtungenID, beobachtungsgruppeID, standpunkt, zielpunkt in liste_id_standpunkt_zielpunkt:
liste_beobachtungen_rohdaten_tachymeter.append(
(beobachtungsart, beobachtungenID, beobachtungsgruppeID, standpunkt, zielpunkt)
)
if standpunkt not in liste_punktnummern:
liste_punktnummern.append(standpunkt)
if zielpunkt not in liste_punktnummern:
liste_punktnummern.append(zielpunkt)
if beobachtungsart == "tachymeter_richtung":
if beobachtungsgruppeID not in liste_orientierungsunbekannte:
liste_orientierungsunbekannte.append(beobachtungsgruppeID)
#GNSS Block
if beobachtungsart == "gnss_basislinien":
liste_id_standpunkt_zielpunkt = db_zugriff.get_gnss_beobachtungen_punktnummern()
for beobachtungenID, standpunkt, zielpunkt in liste_id_standpunkt_zielpunkt:
standpunkt = str(standpunkt).strip()
zielpunkt = str(zielpunkt).strip()
liste_beobachtungen_rohdaten_gnssbasislinien.append((beobachtungsart, beobachtungenID, standpunkt, zielpunkt))
if standpunkt not in liste_punktnummern:
liste_punktnummern.append(standpunkt)
if zielpunkt not in liste_punktnummern:
liste_punktnummern.append(zielpunkt)
if beobachtungsart == "geometrisches_nivellement":
liste_id_standpunkt_zielpunkt = db_zugriff.get_nivellement_beobachtungen_punktnummern()
for beobachtungenID, standpunkt, zielpunkt in liste_id_standpunkt_zielpunkt:
standpunkt = str(standpunkt).strip()
zielpunkt = str(zielpunkt).strip()
liste_beobachtungen_rohdaten_nivellement.append(
(beobachtungsart, beobachtungenID, standpunkt, zielpunkt))
if standpunkt not in liste_punktnummern:
liste_punktnummern.append(standpunkt)
if zielpunkt not in liste_punktnummern:
liste_punktnummern.append(zielpunkt)
#if liste_beobachtungen_rohdaten_tachymeter == []:
# return None
#dict_punkt_symbole = {}
liste_unbekannte = []
for punkt in liste_punktnummern:
X, Y, Z = sp.symbols(f"X{punkt} Y{punkt} Z{punkt}")
self.dict_punkt_symbole[punkt] = (X, Y, Z)
liste_unbekannte.append(X)
liste_unbekannte.append(Y)
liste_unbekannte.append(Z)
dict_orientierung_symbole = {}
for orientierungsunbekannte in liste_orientierungsunbekannte:
O = sp.symbols(f"O{orientierungsunbekannte}")
dict_orientierung_symbole[orientierungsunbekannte] = O
liste_unbekannte.append(O)
liste_beobachtungsgleichungen_distanz =[]
liste_zeilenbeschriftungen_distanz = []
liste_A_richtung_zeilen = []
liste_zeilenbeschriftungen_richtung = []
liste_A_zenitwinkel_zeilen = []
liste_zeilenbeschriftungen_zenitwinkel = []
liste_beobachtungsgleichungen_gnssbasislinien = []
liste_A_gnssbasislinien_zeilen = []
liste_zeilenbeschriftungen_gnssbasislinien = []
liste_beobachtungsgleichungen_nivellement = []
liste_A_nivellement_zeilen = []
liste_zeilenbeschriftungen_nivellement = []
if liste_beobachtungen_rohdaten_tachymeter != []:
for beobachtungsart, beobachtungenID, beobachtungsgruppeID, standpunkt, zielpunkt in liste_beobachtungen_rohdaten_tachymeter:
X_sp, Y_sp, Z_sp = self.dict_punkt_symbole[standpunkt]
X_zp, Y_zp, Z_zp = self.dict_punkt_symbole[zielpunkt]
B_sp, L_sp = sp.symbols(f"B{standpunkt} L{standpunkt}")
alpha = sp.symbols(f"{beobachtungenID}_R_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
zw = sp.symbols(f"{beobachtungenID}_ZW_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
s = sp.symbols(f"{beobachtungenID}_SD_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
azimut_berechnet = sp.symbols(f"azimut_berechnet_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
zw_berechnet = sp.symbols(f"zw_berechnet_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
s_berechnet = sp.symbols(f"strecke_berechnet_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
if beobachtungsart == "tachymeter_distanz":
beobachtungsgleichung = sp.sqrt((X_zp - X_sp) ** 2 + (Y_zp - Y_sp) ** 2 + (Z_zp - Z_sp) ** 2)
liste_beobachtungsgleichungen_distanz.append(beobachtungsgleichung)
liste_zeilenbeschriftungen_distanz.append(
f"{beobachtungenID}_SD_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
elif beobachtungsart == "tachymeter_richtung":
# for beobachtungenID, beobachtungsgruppeID, standpunkt, zielpunkt in liste_id_standpunkt_zielpunkt:
d_r_dX_zp = (
(sp.sin(B_sp) * sp.cos(L_sp) * sp.sin(azimut_berechnet) - sp.sin(L_sp) * sp.cos(azimut_berechnet)) / (
s_berechnet * sp.sin(zw_berechnet)))
d_r_dX_sp = - d_r_dX_zp
d_r_dY_zp = (
(sp.sin(B_sp) * sp.sin(L_sp) * sp.sin(azimut_berechnet) + sp.cos(L_sp) * sp.cos(azimut_berechnet)) / (
s_berechnet * sp.sin(zw_berechnet)))
d_r_dY_sp = - d_r_dY_zp
d_r_dZ_zp = ((-sp.cos(B_sp) * sp.sin(azimut_berechnet) / (s_berechnet * sp.sin(zw_berechnet))))
d_r_dZ_sp = - d_r_dZ_zp
d_r_dO_sp = -1
zeile_A_Matrix = []
for punkt in liste_punktnummern:
if punkt == standpunkt:
zeile_A_Matrix.extend([d_r_dX_sp, d_r_dY_sp, d_r_dZ_sp])
elif punkt == zielpunkt:
zeile_A_Matrix.extend([d_r_dX_zp, d_r_dY_zp, d_r_dZ_zp])
else:
zeile_A_Matrix.extend([0, 0, 0])
for orientierung in liste_orientierungsunbekannte:
if orientierung == beobachtungsgruppeID:
zeile_A_Matrix.append(d_r_dO_sp)
else:
zeile_A_Matrix.append(0)
liste_A_richtung_zeilen.append(zeile_A_Matrix)
liste_zeilenbeschriftungen_richtung.append(
f"{beobachtungenID}_R_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}"
)
elif beobachtungsart == "tachymeter_zenitwinkel":
d_r_dX_zp = ((X_zp - X_sp) * sp.cos(zw_berechnet) - s_berechnet * sp.cos(B_sp) * sp.cos(L_sp)) / (s_berechnet ** 2 * sp.sin(zw_berechnet))
d_r_dX_sp = - d_r_dX_zp
d_r_dY_zp = ((Y_zp - Y_sp) * sp.cos(zw_berechnet) - s_berechnet * sp.cos(B_sp) * sp.sin(L_sp)) / (s_berechnet ** 2 * sp.sin(zw_berechnet))
d_r_dY_sp = - d_r_dY_zp
d_r_dZ_zp = ((Z_zp - Z_sp) * sp.cos(zw_berechnet) - s_berechnet * sp.sin(B_sp)) / (s_berechnet ** 2 * sp.sin(zw_berechnet))
d_r_dZ_sp = - d_r_dZ_zp
zeile_A_Matrix = []
for punkt in liste_punktnummern:
if punkt == standpunkt:
zeile_A_Matrix.extend([d_r_dX_sp, d_r_dY_sp, d_r_dZ_sp])
elif punkt == zielpunkt:
zeile_A_Matrix.extend([d_r_dX_zp, d_r_dY_zp, d_r_dZ_zp])
else:
zeile_A_Matrix.extend([0, 0, 0])
for orientierung in liste_orientierungsunbekannte:
zeile_A_Matrix.append(0)
liste_A_zenitwinkel_zeilen.append(zeile_A_Matrix)
liste_zeilenbeschriftungen_zenitwinkel.append(
f"{beobachtungenID}_ZW_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}"
)
if liste_beobachtungen_rohdaten_gnssbasislinien != []:
for beobachtungsart, beobachtungenID, standpunkt, zielpunkt in liste_beobachtungen_rohdaten_gnssbasislinien:
X_sp, Y_sp, Z_sp = self.dict_punkt_symbole[standpunkt]
X_zp, Y_zp, Z_zp = self.dict_punkt_symbole[zielpunkt]
if beobachtungsart == "gnss_basislinien":
beobachtungsgleichung_bx = X_zp - X_sp
beobachtungsgleichung_by = Y_zp - Y_sp
beobachtungsgleichung_bz = Z_zp - Z_sp
liste_beobachtungsgleichungen_gnssbasislinien.append(beobachtungsgleichung_bx)
liste_beobachtungsgleichungen_gnssbasislinien.append(beobachtungsgleichung_by)
liste_beobachtungsgleichungen_gnssbasislinien.append(beobachtungsgleichung_bz)
liste_zeilenbeschriftungen_gnssbasislinien.append(
f"{beobachtungenID}_gnssbx_{standpunkt}_{zielpunkt}")
liste_zeilenbeschriftungen_gnssbasislinien.append(
f"{beobachtungenID}_gnssby_{standpunkt}_{zielpunkt}")
liste_zeilenbeschriftungen_gnssbasislinien.append(
f"{beobachtungenID}_gnssbz_{standpunkt}_{zielpunkt}")
if liste_beobachtungen_rohdaten_nivellement != []:
for beobachtungsart, beobachtungenID, standpunkt, zielpunkt in liste_beobachtungen_rohdaten_nivellement:
X_sp, Y_sp, Z_sp = self.dict_punkt_symbole[standpunkt]
X_zp, Y_zp, Z_zp = self.dict_punkt_symbole[zielpunkt]
B_sp, L_sp = sp.symbols(f"B{standpunkt} L{standpunkt}")
B_zp, L_zp = sp.symbols(f"B{zielpunkt} L{zielpunkt}")
if beobachtungsart == "geometrisches_nivellement":
d_r_dX_zp = sp.cos(B_zp) * sp.cos(L_zp)
d_r_dX_sp = -sp.cos(B_sp) * sp.cos(L_sp)
d_r_dY_zp = sp.cos(B_zp) * sp.sin(L_zp)
d_r_dY_sp = -sp.cos(B_sp) * sp.sin(L_sp)
d_r_dZ_zp = sp.sin(B_zp)
d_r_dZ_sp = -sp.sin(B_sp)
zeile_A_Matrix = []
for punkt in liste_punktnummern:
if punkt == standpunkt:
zeile_A_Matrix.extend([d_r_dX_sp, d_r_dY_sp, d_r_dZ_sp])
elif punkt == zielpunkt:
zeile_A_Matrix.extend([d_r_dX_zp, d_r_dY_zp, d_r_dZ_zp])
else:
zeile_A_Matrix.extend([0, 0, 0])
for orientierung in liste_orientierungsunbekannte:
zeile_A_Matrix.append(0)
liste_A_nivellement_zeilen.append(zeile_A_Matrix)
liste_zeilenbeschriftungen_nivellement.append(
f"{beobachtungenID}_niv_{standpunkt}_{zielpunkt}"
)
if liste_beobachtungsgleichungen_distanz:
f_matrix_dist = sp.Matrix(liste_beobachtungsgleichungen_distanz)
unbekanntenvektor = sp.Matrix(liste_unbekannte)
A_dist = f_matrix_dist.jacobian(unbekanntenvektor)
else:
A_dist = None
if liste_A_richtung_zeilen:
A_richtung = sp.Matrix(liste_A_richtung_zeilen)
else:
A_richtung = None
if liste_A_zenitwinkel_zeilen:
A_zenitwinkel = sp.Matrix(liste_A_zenitwinkel_zeilen)
else:
A_zenitwinkel = None
if liste_beobachtungsgleichungen_gnssbasislinien:
f_matrix_gnss = sp.Matrix(liste_beobachtungsgleichungen_gnssbasislinien)
unbekanntenvektor = sp.Matrix(liste_unbekannte)
A_gnssbasislinien = f_matrix_gnss.jacobian(unbekanntenvektor)
else:
A_gnssbasislinien = None
if liste_A_nivellement_zeilen:
#f_matrix_nivellement = sp.Matrix(liste_beobachtungsgleichungen_nivellement)
#unbekanntenvektor = sp.Matrix(liste_unbekannte)
#A_nivellement = f_matrix_nivellement.jacobian(unbekanntenvektor)
A_nivellement = sp.Matrix(liste_A_nivellement_zeilen)
else:
A_nivellement = None
A_gesamt = None
liste_zeilenbeschriftungen_gesamt = []
if A_dist is not None:
A_gesamt = A_dist
liste_zeilenbeschriftungen_gesamt.extend(liste_zeilenbeschriftungen_distanz)
if A_richtung is not None:
if A_gesamt is None:
A_gesamt = A_richtung
else:
A_gesamt = A_gesamt.col_join(A_richtung)
liste_zeilenbeschriftungen_gesamt.extend(liste_zeilenbeschriftungen_richtung)
if A_zenitwinkel is not None:
if A_gesamt is None:
A_gesamt = A_zenitwinkel
else:
A_gesamt = A_gesamt.col_join(A_zenitwinkel)
liste_zeilenbeschriftungen_gesamt.extend(liste_zeilenbeschriftungen_zenitwinkel)
if A_gnssbasislinien is not None:
if A_gesamt is None:
A_gesamt = A_gnssbasislinien
else:
A_gesamt = A_gesamt.col_join(A_gnssbasislinien)
liste_zeilenbeschriftungen_gesamt.extend(liste_zeilenbeschriftungen_gnssbasislinien)
if A_nivellement is not None:
if A_gesamt is None:
A_gesamt = A_nivellement
else:
A_gesamt = A_gesamt.col_join(A_nivellement)
liste_zeilenbeschriftungen_gesamt.extend(liste_zeilenbeschriftungen_nivellement)
if A_gesamt is None:
return None
if datumsfestlegung == "weiche Lagerung":
vertauschung = list(range(len(liste_unbekannte)))
if liste_unbekannte_datumsfestlegung is not None and liste_unbekannte_datumsfestlegung != []:
liste_unbekannte_alt = list(liste_unbekannte)
liste_unbekannte_datumsfestlegung = [str(u).strip() for u in liste_unbekannte_datumsfestlegung]
idx_rechts = []
for name in liste_unbekannte_datumsfestlegung:
for i, sym in enumerate(liste_unbekannte_alt):
if str(sym) == name and i not in idx_rechts:
idx_rechts.append(i)
break
idx_links = [i for i in range(len(liste_unbekannte_alt)) if i not in idx_rechts]
vertauschung = idx_links + idx_rechts
A_gesamt = A_gesamt[:, vertauschung]
liste_unbekannte = [liste_unbekannte_alt[i] for i in vertauschung]
# Zusatzgeleichungen der weichen Lagerung
anzhl_einheitsmatrix = len(liste_unbekannte_datumsfestlegung)
if anzhl_einheitsmatrix > 0:
nullenmatrix = sp.zeros(anzhl_einheitsmatrix, A_gesamt.shape[1] - anzhl_einheitsmatrix)
einheitsmatrix = sp.eye(anzhl_einheitsmatrix)
A_weiche_Lagerung = nullenmatrix.row_join(einheitsmatrix)
A_gesamt = A_gesamt.col_join(A_weiche_Lagerung)
for unbekannte_datumsfestlegung in liste_unbekannte_datumsfestlegung:
liste_zeilenbeschriftungen_gesamt.append(f"lA_{unbekannte_datumsfestlegung}")
self.liste_unbekanntenvektor_symbolisch = liste_unbekannte
Export.matrix_to_csv(r"Zwischenergebnisse\Jacobi_Matrix_Symbolisch.csv", liste_unbekannte,
liste_zeilenbeschriftungen_gesamt, A_gesamt, "Beobachtung")
return A_gesamt, liste_unbekannte, liste_zeilenbeschriftungen_gesamt
def jacobi_matrix_zahlen_iteration_0(self, A_symbolisch, koordinatenart, liste_unbekannte = None, liste_zeilenbeschriftungen_gesamt = None):
self.liste_beobachtungsvektor_symbolisch = [str(x) for x in liste_zeilenbeschriftungen_gesamt]
if koordinatenart == "naeherung_us":
#A_numerisch = A_symbolisch.xreplace(self.substitutionen_dict)
if self.func_A0 is None:
#self.liste_symbole_lambdify = sorted(self.substitutionen_dict.keys(), key=lambda s: str(s))
self.func_A0 = sp.lambdify(
self.liste_symbole_lambdify,
A_symbolisch,
modules="numpy",
cse=True
)
liste_werte = [self.substitutionen_dict[s] for s in self.liste_symbole_lambdify]
#A_numerisch = sp.Matrix(self.func_A0(*liste_werte))
A_numerisch = np.asarray(self.func_A0(*liste_werte), dtype=float)
Export.matrix_to_csv(r"Zwischenergebnisse\Jacobi_Matrix_Numerisch_Iteration0.csv", liste_unbekannte,
liste_zeilenbeschriftungen_gesamt, A_numerisch, "Beobachtung")
return A_numerisch
else:
print("Koordinaten noch nicht implementiert!")
def beobachtungsvektor_numerisch(self, liste_beobachtungsvektor_symbolisch):
liste_beobachtungsvektor_numerisch = []
for beobachtung_symbolisch in liste_beobachtungsvektor_symbolisch:
beobachtung_symbolisch = str(beobachtung_symbolisch).strip()
if beobachtung_symbolisch.startswith("lA_"):
beobachtung_symbolisch = str(beobachtung_symbolisch.split("_", 1)[1]).strip()
liste_beobachtungsvektor_numerisch.append(self.substitutionen_dict[sp.Symbol(beobachtung_symbolisch)])
beobachtungsvektor_numerisch = sp.Matrix(liste_beobachtungsvektor_numerisch)
Export.matrix_to_csv(r"Zwischenergebnisse\Beobachtungsvektor_Numerisch.csv", [""], liste_beobachtungsvektor_symbolisch, beobachtungsvektor_numerisch, "Beobachtungsvektor")
return beobachtungsvektor_numerisch
def beobachtungsvektor_naeherung_symbolisch(self, liste_beobachtungsvektor_symbolisch):
liste_beobachtungsgleichungen = []
self.dict_punkt_symbole = {}
liste_punktnummern = []
for beobachtung_symbolisch in liste_beobachtungsvektor_symbolisch:
aufgeteilt = str(beobachtung_symbolisch).strip().split("_")
if aufgeteilt[0] == "lA":
continue
if aufgeteilt [1] == "SD" or aufgeteilt [1] == "R" or aufgeteilt [1] == "ZW":
standpunkt = str(aufgeteilt[3])
zielpunkt = str(aufgeteilt[4])
if standpunkt not in liste_punktnummern:
liste_punktnummern.append(standpunkt)
if zielpunkt not in liste_punktnummern:
liste_punktnummern.append(zielpunkt)
if aufgeteilt[1] == "gnssbx" or aufgeteilt[1] == "gnssby" or aufgeteilt[1] == "gnssbz":
standpunkt = str(aufgeteilt[2])
zielpunkt = str(aufgeteilt[3])
if standpunkt not in liste_punktnummern:
liste_punktnummern.append(standpunkt)
if zielpunkt not in liste_punktnummern:
liste_punktnummern.append(zielpunkt)
for punkt in liste_punktnummern:
X, Y, Z = sp.symbols(f"X{punkt} Y{punkt} Z{punkt}")
self.dict_punkt_symbole[str(punkt)] = (X, Y, Z)
for beobachtung_symbolisch in liste_beobachtungsvektor_symbolisch:
beobachtung_symbolisch = str(beobachtung_symbolisch).strip()
aufgeteilt = beobachtung_symbolisch.split("_")
if aufgeteilt[0] == "lA":
anschlusspunkt = str(aufgeteilt[1])
liste_beobachtungsgleichungen.append(sp.Symbol(anschlusspunkt))
continue
if aufgeteilt[1] == "SD" or aufgeteilt[1] == "R" or aufgeteilt[1] == "ZW":
#beobachtungen_ID = aufgeteilt[0]
beobachtungsart = aufgeteilt[1] # "SD", "R", "ZW"
beobachtungsgruppeID = aufgeteilt[2]
standpunkt = str(aufgeteilt[3]).strip()
zielpunkt = str(aufgeteilt[4]).strip()
X_sp, Y_sp, Z_sp = self.dict_punkt_symbole[standpunkt]
X_zp, Y_zp, Z_zp = self.dict_punkt_symbole[zielpunkt]
dX = X_zp - X_sp
dY = Y_zp - Y_sp
dZ = Z_zp - Z_sp
s = sp.sqrt(dX ** 2 + dY ** 2 + dZ ** 2) # Schrägstrecke
B_sp = sp.Symbol(f"B{standpunkt}")
L_sp = sp.Symbol(f"L{standpunkt}")
if beobachtungsart == "SD":
s_geom = sp.sqrt(dX ** 2 + dY ** 2 + dZ ** 2)
liste_beobachtungsgleichungen.append(s_geom)
elif beobachtungsart == "R":
#O_sp = sp.Symbol(f"O_{beobachtungsgruppeID}")
r_sp_zp = sp.Symbol(f"richtung_berechnet_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
# Lokales System: x_loc = Nord, y_loc = Ost
#x_loc = (-sp.sin(B_sp) * sp.cos(L_sp)) * dX + (-sp.sin(B_sp) * sp.sin(L_sp)) * dY + (sp.cos(B_sp)) * dZ
#y_loc = (-sp.sin(L_sp)) * dX + (sp.cos(L_sp)) * dY
#a12 = sp.atan2(y_loc, x_loc)
# Richtung nach Otepka: r = a12 - O
liste_beobachtungsgleichungen.append(r_sp_zp)
elif beobachtungsart == "ZW":
#dX = X_zp - X_sp
#dY = Y_zp - Y_sp
#dZ = Z_zp - Z_sp
#s_geom = sp.sqrt(dX ** 2 + dY ** 2 + dZ ** 2)
#z_loc = (sp.cos(B_sp) * sp.cos(L_sp)) * dX + (sp.cos(B_sp) * sp.sin(L_sp)) * dY + (sp.sin(B_sp)) * dZ
#zw = sp.acos(z_loc / s_geom)
zw_sp_zp = sp.Symbol(f"zw_berechnet_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
liste_beobachtungsgleichungen.append(zw_sp_zp)
if aufgeteilt[1] == "gnssbx" or aufgeteilt[1] == "gnssby" or aufgeteilt[1] == "gnssbz":
beobachtungsart = aufgeteilt[1]
standpunkt = str(aufgeteilt[2]).strip()
zielpunkt = str(aufgeteilt[3]).strip()
X_sp, Y_sp, Z_sp = self.dict_punkt_symbole[standpunkt]
X_zp, Y_zp, Z_zp = self.dict_punkt_symbole[zielpunkt]
dX = X_zp - X_sp
dY = Y_zp - Y_sp
dZ = Z_zp - Z_sp
if beobachtungsart == "gnssbx":
liste_beobachtungsgleichungen.append(dX)
if beobachtungsart == "gnssby":
liste_beobachtungsgleichungen.append(dY)
if beobachtungsart == "gnssbz":
liste_beobachtungsgleichungen.append(dZ)
if aufgeteilt[1] == "niv":
beobachtungsart = aufgeteilt[1]
standpunkt = str(aufgeteilt[2]).strip()
zielpunkt = str(aufgeteilt[3]).strip()
nh_sp = sp.Symbol(f"NH{standpunkt}")
nh_zp = sp.Symbol(f"NH{zielpunkt}")
niv_sp_zp = nh_zp - nh_sp
liste_beobachtungsgleichungen.append(niv_sp_zp)
beobachtungsvektor_naeherung_symbolisch = sp.Matrix(liste_beobachtungsgleichungen)
Export.matrix_to_csv(r"Zwischenergebnisse\Beobachtungsvektor_Näherung_Symbolisch.csv", [""],
liste_beobachtungsvektor_symbolisch, beobachtungsvektor_naeherung_symbolisch, "Beobachtungsvektor")
return beobachtungsvektor_naeherung_symbolisch
def beobachtungsvektor_naeherung_numerisch_iteration0(self, liste_beobachtungsvektor_symbolisch, beobachtungsvektor_naeherung_symbolisch):
#beobachtungsvektor_naeherung_numerisch_iteration0 = beobachtungsvektor_naeherung_symbolisch.xreplace(self.substitutionen_dict)
if self.func_beob0 is None:
#self.liste_symbole_lambdify = sorted(self.substitutionen_dict.keys(), key=lambda s: str(s))
self.func_beob0 = sp.lambdify(
self.liste_symbole_lambdify,
beobachtungsvektor_naeherung_symbolisch,
modules="numpy",
cse=True
)
liste_werte = [self.substitutionen_dict[s] for s in self.liste_symbole_lambdify]
#beobachtungsvektor_naeherung_numerisch_iteration0 = sp.Matrix(self.func_beob0(*liste_werte))
beobachtungsvektor_naeherung_numerisch_iteration0 = np.asarray(self.func_beob0(*liste_werte),
dtype=float).reshape(-1, 1)
Export.matrix_to_csv(r"Zwischenergebnisse\Beobachtungsvektor_Näherung_Numerisch_Iteration0.csv", [""],
liste_beobachtungsvektor_symbolisch, beobachtungsvektor_naeherung_numerisch_iteration0,
"Beobachtungsvektor")
return beobachtungsvektor_naeherung_numerisch_iteration0
def unbekanntenvektor_symbolisch(self, liste_unbekannte):
unbekanntenvektor_symbolisch = sp.Matrix(liste_unbekannte)
Export.matrix_to_csv(r"Zwischenergebnisse\Unbekanntenvektor_Symbolisch.csv", [""], liste_unbekannte, unbekanntenvektor_symbolisch,
"Unbekanntenvektor")
return(unbekanntenvektor_symbolisch)
def unbekanntenvektor_numerisch(self, liste_unbekanntenvektor_symbolisch, unbekanntenvektor_symbolisch, dX_Vektor = None, unbekanntenvektor_neumerisch_vorherige_Iteration = None):
if not hasattr(self, "liste_unbekanntenvektor_symbolisch"):
self.liste_unbekanntenvektor_symbolisch = liste_unbekanntenvektor_symbolisch
if dX_Vektor is None and unbekanntenvektor_neumerisch_vorherige_Iteration is None:
#unbekanntenvektor_numerisch = unbekanntenvektor_symbolisch.xreplace(self.substitutionen_dict)
if self.func_u0 is None:
self.func_u0 = sp.lambdify(
self.liste_symbole_lambdify,
unbekanntenvektor_symbolisch,
modules="numpy",
cse=True
)
liste_werte = [self.substitutionen_dict[s] for s in self.liste_symbole_lambdify]
#unbekanntenvektor_numerisch = sp.Matrix(self.func_u0(*liste_werte))
unbekanntenvektor_numerisch = np.asarray(self.func_u0(*liste_werte), dtype=float).reshape(-1, 1)
else:
#unbekanntenvektor_numerisch = unbekanntenvektor_neumerisch_vorherige_Iteration + dX_Vektor
unbekanntenvektor_neumerisch_vorherige_Iteration = np.asarray(
unbekanntenvektor_neumerisch_vorherige_Iteration, dtype=float).reshape(-1, 1)
dX_Vektor = np.asarray(dX_Vektor, dtype=float).reshape(-1, 1)
unbekanntenvektor_numerisch = unbekanntenvektor_neumerisch_vorherige_Iteration + dX_Vektor
self.substitutionen_dict = self.dict_substitutionen_uebergeordnetes_system(unbekanntenvektor_numerisch)
Export.matrix_to_csv(r"Zwischenergebnisse\Unbekanntenvektor_Numerisch_Iteration0.csv", [""],
liste_unbekanntenvektor_symbolisch, unbekanntenvektor_numerisch,
"Unbekanntenvektor")
return unbekanntenvektor_numerisch
def unbekanntenvektor_numerisch_to_dict_unbekanntenvektor(self, liste_unbekanntenvektor_symbolisch, unbekanntenvektor_numerisch):
dict_unbekanntenvektor_numerisch = {}
index = 0
unbekanntenvektor_numerisch = np.asarray(unbekanntenvektor_numerisch, dtype=float).reshape(-1, 1)
for symbol in liste_unbekanntenvektor_symbolisch:
name = str(symbol)
if not name.startswith("X"):
continue
punktnummer = str(name[1:])
dict_unbekanntenvektor_numerisch[punktnummer] = sp.Matrix([
float(unbekanntenvektor_numerisch[index, 0]),
float(unbekanntenvektor_numerisch[index + 1, 0]),
float(unbekanntenvektor_numerisch[index + 2, 0])
])
index += 3
return dict_unbekanntenvektor_numerisch
def berechnung_dl(self, beobachtungsvektor_numerisch, beobachtungsvektor_naeherung_numerisch,
liste_beobachtungsvektor_symbolisch=None):
dl = beobachtungsvektor_numerisch - beobachtungsvektor_naeherung_numerisch
dl = np.asarray(dl, dtype=float)
if liste_beobachtungsvektor_symbolisch is None:
liste_beobachtungsvektor_symbolisch = self.liste_beobachtungsvektor_symbolisch
for i, name in enumerate(liste_beobachtungsvektor_symbolisch):
if "_R_" in str(name):
dl[i] = np.arctan2(np.sin(dl[i]), np.cos(dl[i]))
return dl
def dict_substitutionen_uebergeordnetes_system(self, unbekanntenvektor_aus_iteration = None):
db_zugriff = Datenbankzugriff(self.pfad_datenbank)
berechnungen = Berechnungen(self.a, self.b)
if unbekanntenvektor_aus_iteration is None:
dict_koordinaten = db_zugriff.get_koordinaten("naeherung_us")
else:
dict_koordinaten = self.unbekanntenvektor_numerisch_to_dict_unbekanntenvektor(
self.liste_unbekanntenvektor_symbolisch,
unbekanntenvektor_aus_iteration
)
for punktnummer, matrix in dict_koordinaten.items():
dict_koordinaten[punktnummer] = [float(matrix[0]), float(matrix[1]), float(matrix[2])]
liste_beobachtungen_tachymeter = db_zugriff.get_beobachtungen_from_beobachtungenid()
liste_beobachtungen_gnssbasislinien = db_zugriff.get_beobachtungen_gnssbasislinien()
liste_beobachtungen_nivellemente = db_zugriff.get_beobachtungen_nivellement()
liste_azimut_richtungen, dict_orientierungen = berechnungen.berechnung_richtung_azimut_zenitwinkel(self.pfad_datenbank, dict_koordinaten)
dict_koordinaten_xyz_kopie = {pn: [v[0], v[1], v[2]] for pn, v in dict_koordinaten.items()}
dict_koordinaten_B_L = berechnungen.geometrische_breite_laenge(dict_koordinaten_xyz_kopie)
dict_koordinaten_utm = self.trafos.ecef_to_utm(
dict_koordinaten,
self.pfad_tif_quasigeoidundolation)
substitutionen = {}
for punktnummer, vektor in dict_koordinaten_B_L.items():
X_sym, Y_sym, Z_sym, B_sym, L_Sym = sp.symbols(
f"X{punktnummer} Y{punktnummer} Z{punktnummer} B{punktnummer} L{punktnummer}")
substitutionen[X_sym] = float(vektor[0][0])
substitutionen[Y_sym] = float(vektor[0][1])
substitutionen[Z_sym] = float(vektor[0][2])
substitutionen[B_sym] = float(vektor[1])
substitutionen[L_Sym] = float(vektor[2])
#for beobachtungsgruppeID, orientierung in dict_orientierungen.items():
# O_sym = sp.symbols(f"O_{beobachtungsgruppeID}")
# substitutionen[O_sym] = float(orientierung)
for beobachtungsgruppeID, standpunkt, zielpunkt, azimut, richtung, zenitwinkel, schraegstrecke, orientierung in liste_azimut_richtungen:
richtung_sym = sp.symbols(f"richtung_berechnet_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
substitutionen[richtung_sym] = float(richtung)
azimut_sym = sp.symbols(f"azimut_berechnet_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
substitutionen[azimut_sym] = float(azimut)
zenitwinkel_sym = sp.symbols(f"zw_berechnet_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
substitutionen[zenitwinkel_sym] = float(zenitwinkel)
schraegstrecke_sym = sp.symbols(f"strecke_berechnet_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
substitutionen[schraegstrecke_sym] = float(schraegstrecke)
for punktnummer, koordinaten_utm in dict_koordinaten_utm.items():
normalhoehe_sym = sp.symbols(f"NH{punktnummer}")
substitutionen[normalhoehe_sym] = float(koordinaten_utm[2])
for standpunkt, zielpunkt, beobachtungenID, beobachtungsgruppeID, tachymeter_richtung, tachymeter_zenitwinkel, tachymeter_distanz in liste_beobachtungen_tachymeter:
alpha = sp.symbols(f"{beobachtungenID}_R_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
zw = sp.symbols(f"{beobachtungenID}_ZW_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
s = sp.symbols(f"{beobachtungenID}_SD_{beobachtungsgruppeID}_{standpunkt}_{zielpunkt}")
if tachymeter_richtung is None and tachymeter_zenitwinkel is None and tachymeter_distanz is None:
continue
substitutionen[alpha] = float(tachymeter_richtung)
substitutionen[zw] = float(tachymeter_zenitwinkel)
substitutionen[s] = float(tachymeter_distanz)
#substitutionen[sp.Symbol(f"O{beobachtungsgruppeID}")] = 0.0
for beobachtungenID, punktnummer_sp, punktnummer_zp, gnss_bx, gnss_by, gnss_bz, gnss_s0, gnss_cxx, gnss_cxy, gnss_cxz, gnss_cyy, gnss_cyz, gnss_czz in liste_beobachtungen_gnssbasislinien:
beobachtungenID = str(beobachtungenID).strip()
punktnummer_sp = str(punktnummer_sp).strip()
punktnummer_zp = str(punktnummer_zp).strip()
bx = sp.symbols(f"{beobachtungenID}_gnssbx_{punktnummer_sp}_{punktnummer_zp}")
by = sp.symbols(f"{beobachtungenID}_gnssby_{punktnummer_sp}_{punktnummer_zp}")
bz = sp.symbols(f"{beobachtungenID}_gnssbz_{punktnummer_sp}_{punktnummer_zp}")
if gnss_bx is None and gnss_by is None and gnss_bz is None:
continue
substitutionen[bx] = float(gnss_bx)
substitutionen[by] = float(gnss_by)
substitutionen[bz] = float(gnss_bz)
for beobachtungenID, punktnummer_sp, punktnummer_zp, niv_dh, niv_strecke, niv_anz_standpkte in liste_beobachtungen_nivellemente:
beobachtungenID = str(beobachtungenID).strip()
punktnummer_sp = str(punktnummer_sp).strip()
punktnummer_zp = str(punktnummer_zp).strip()
niv = sp.symbols(f"{beobachtungenID}_niv_{punktnummer_sp}_{punktnummer_zp}")
if niv_dh is None:
continue
substitutionen[niv] = float(niv_dh)
if unbekanntenvektor_aus_iteration is not None:
dict_O = self.unbekanntenvektor_numerisch_to_dict_orientierungen(
self.liste_unbekanntenvektor_symbolisch,
unbekanntenvektor_aus_iteration
)
for orientierungs_id, wert in dict_O.items():
substitutionen[sp.Symbol(f"O{orientierungs_id}")] = float(wert)
else:
#for standpunkt, zielpunkt, beobachtungenID, beobachtungsgruppeID, *_ in liste_beobachtungen_tachymeter:
# O_sym = sp.Symbol(f"O{beobachtungsgruppeID}")
# if O_sym not in substitutionen:
# substitutionen[O_sym] = 0
for beobachtungsgruppeID, standpunkt, zielpunkt, azimut, richtung, zenitwinkel, schraegstrecke, orientierung in liste_azimut_richtungen:
O_sym = sp.Symbol(f"O{beobachtungsgruppeID}")
if O_sym not in substitutionen:
substitutionen[O_sym] = orientierung
return substitutionen
def unbekanntenvektor_numerisch_to_dict_orientierungen(self, liste_unbekanntenvektor_symbolisch,
unbekanntenvektor_numerisch):
dict_O = {}
unbekanntenvektor_numerisch = np.asarray(unbekanntenvektor_numerisch, dtype=float).reshape(-1, 1)
for i, symbol in enumerate(liste_unbekanntenvektor_symbolisch):
name = str(symbol)
if name.startswith("O"):
orientierungs_id = name[1:]
dict_O[orientierungs_id] = float(unbekanntenvektor_numerisch[i, 0])
return dict_O