Compare commits

..

3 Commits

Author SHA1 Message Date
0e8154dc23 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	Campusnetz.db
#	Campusnetz.ipynb
2025-12-29 18:20:47 +01:00
8431bad4ff Import Nivellement 2025-12-29 18:15:38 +01:00
01abbc81d9 Import Nivellement 2025-12-29 18:10:04 +01:00
4 changed files with 439 additions and 1255 deletions

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="dataSourceStorageLocal" created-in="PY-252.27397.106"> <component name="dataSourceStorageLocal" created-in="PY-252.28238.29">
<data-source name="Campusnetz.db" uuid="c385b2f5-c801-4154-bc11-62182a8396b3"> <data-source name="Campusnetz.db" uuid="c385b2f5-c801-4154-bc11-62182a8396b3">
<database-info product="SQLite" version="3.45.1" jdbc-version="4.2" driver-name="SQLite JDBC" driver-version="3.45.1.0" dbms="SQLITE" exact-version="3.45.1" exact-driver-version="3.45"> <database-info product="SQLite" version="3.45.1" jdbc-version="4.2" driver-name="SQLite JDBC" driver-version="3.45.1.0" dbms="SQLITE" exact-version="3.45.1" exact-driver-version="3.45">
<identifier-quote-string>&quot;</identifier-quote-string> <identifier-quote-string>&quot;</identifier-quote-string>

Binary file not shown.

File diff suppressed because one or more lines are too long

324
Import.py
View File

@@ -225,6 +225,329 @@ class Import:
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, instrumentenID):
# Prüfen, ob Bereits Daten aus der Datei in der Datenbank vorhanden sind
con = sqlite3.connect(self.pfad_datenbank)
cursor = con.cursor()
liste_dateinamen_in_db = [r[0] for r in cursor.execute(
"SELECT DISTINCT dateiname FROM Beobachtungen"
).fetchall()]
liste_beobachtungsgruppeID = [r[0] for r in cursor.execute("""SELECT DISTINCT beobachtungsgruppeID
FROM Beobachtungen""").fetchall()]
liste_instrumentenid = [r[0] for r in cursor.execute("SELECT instrumenteID FROM Instrumente").fetchall()]
liste_netzpunkte = [r[0] for r in cursor.execute("SELECT punktnummer FROM Netzpunkte").fetchall()]
cursor.close()
con.close()
Import_fortsetzen = True
if pfad_datei in liste_dateinamen_in_db:
Import_fortsetzen = False
print(f"Der Import wurde abgebrochen, weil die Beobachtungen aus der Datei {pfad_datei} bereits in der Datenbank vorhanden sind.")
if instrumentenID not in liste_instrumentenid:
Import_fortsetzen = False
print(
"Der Import wurde abgebrochen. Bitte eine gültige InstrumentenID eingeben. Bei Bedarf ist das Instrument neu anzulegen.")
if Import_fortsetzen:
# Berechnete Punkthöhe Importieren
muster_berechnete_zielweiten = "| | |Z "
dict_punkt_alle_punkthoehen = {}
dict_punkt_mittelwert_punkthoehen = {}
with open(pfad_datei, newline="", encoding="utf-8") as csvfile:
r = csv.reader(csvfile, delimiter=";")
for i, row in enumerate(r):
if any(muster_berechnete_zielweiten in feld for feld in row):
zeile = " ".join([str(feld) for feld in row])
punktnummer = None
if "KD1" in zeile:
teil = zeile.split("KD1", 1)[1].strip()
if teil != "":
punktnummer = teil.split()[0]
wert_z = None
if "|Z" in zeile:
teil = zeile.split("|Z", 1)[1].strip()
if teil != "":
wert_z = self.string_to_float(teil.split()[0])
if punktnummer is not None and wert_z is not None:
#print(f"{punktnummer}, {float(wert_z)}")
if punktnummer not in dict_punkt_alle_punkthoehen:
dict_punkt_alle_punkthoehen[punktnummer] = []
dict_punkt_alle_punkthoehen[punktnummer].append(wert_z)
for punktnummer, liste_z in dict_punkt_alle_punkthoehen.items():
# Hier wird auf 6 Nachkommastellen gerundet!
dict_punkt_mittelwert_punkthoehen[punktnummer] = round(sum(liste_z) / len(liste_z),6)
if Import_fortsetzen:
# Ausgabe, welche Niv-Punkte bereits in der Tabelle Netzpunkte enthalten sind
liste_punktnummern_nivellement = dict_punkt_mittelwert_punkthoehen.keys()
liste_punktnummern_in_db = []
liste_punktnummern_nicht_in_db = []
for punktnummer in liste_punktnummern_nivellement:
if punktnummer in liste_netzpunkte:
liste_punktnummern_in_db.append(punktnummer)
else:
liste_punktnummern_nicht_in_db.append(punktnummer)
if Import_fortsetzen:
print(f"Für folgende Nivellementpunkte werden die Höhen in der Ausgleichung berechnet: {liste_punktnummern_in_db}\nFür folgende Punkte wird aktuell keine Höhe in der Ausgleichung berechnet: {liste_punktnummern_nicht_in_db}. Bei Bedarf im folgenden Schritt ändern!")
return dict_punkt_mittelwert_punkthoehen, liste_punktnummern_in_db
def import_beobachtungen_nivellement_naeherung_punkthoehen(self, dict_punkt_mittelwert_punkthoehen, liste_punktnummern_in_db, liste_punktnummern_hinzufuegen):
con = sqlite3.connect(self.pfad_datenbank)
cursor = con.cursor()
liste_punkte_neu_hinzugefuegt = []
liste_punkte_bereits_vorhanden = []
liste_punkte_geaendert = []
for punktnummer in liste_punktnummern_hinzufuegen:
try:
cursor.execute(f"INSERT INTO Netzpunkte (punktnummer, normalhoehe_hfp) VALUES (?, ?)", (punktnummer, dict_punkt_mittelwert_punkthoehen[punktnummer]))
liste_punkte_neu_hinzugefuegt.append(punktnummer)
except sqlite3.IntegrityError:
liste_punkte_bereits_vorhanden.append(punktnummer)
cursor.execute(
"UPDATE Netzpunkte SET normalhoehe_hfp = ? WHERE punktnummer = ?",
(dict_punkt_mittelwert_punkthoehen[punktnummer], punktnummer)
)
liste_punkte_geaendert.append(punktnummer)
for punktnummer in liste_punktnummern_in_db:
cursor.execute(f"UPDATE Netzpunkte SET normalhoehe_hfp = ? WHERE punktnummer = ?", (dict_punkt_mittelwert_punkthoehen[punktnummer], punktnummer))
liste_punkte_geaendert.append(punktnummer)
con.commit()
cursor.close()
con.close()
print(f"Neu hinzugefügt ({len(liste_punkte_neu_hinzugefuegt)}): {liste_punkte_neu_hinzugefuegt}")
print(f"Bereits vorhanden ({len(liste_punkte_bereits_vorhanden)}): {liste_punkte_bereits_vorhanden}")
print(f"Geändert ({len(liste_punkte_geaendert)}): {liste_punkte_geaendert}\n")
return f"Für folgende Punkte werden die Höhen Ausgeglichen: {liste_punktnummern_hinzufuegen + liste_punktnummern_in_db}"
def import_beobachtungen_nivellement_RVVR(self, pfad_datei, instrumentenID):
# Prüfen, ob Bereits Daten aus der Datei in der Datenbank vorhanden sind
con = sqlite3.connect(self.pfad_datenbank)
cursor = con.cursor()
liste_dateinamen_in_db = [r[0] for r in cursor.execute(
"SELECT DISTINCT dateiname FROM Beobachtungen"
).fetchall()]
liste_instrumentenid = [r[0] for r in cursor.execute("SELECT instrumenteID FROM Instrumente").fetchall()]
liste_netzpunkte = [r[0] for r in cursor.execute("SELECT punktnummer FROM Netzpunkte").fetchall()]
cursor.close()
con.close()
Import_fortsetzen = True
if pfad_datei in liste_dateinamen_in_db:
Import_fortsetzen = False
print(f"Der Import wurde abgebrochen, weil die Beobachtungen aus der Datei {pfad_datei} bereits in der Datenbank vorhanden sind.")
if instrumentenID not in liste_instrumentenid:
Import_fortsetzen = False
print(
"Der Import wurde abgebrochen. Bitte eine gültige InstrumentenID eingeben. Bei Bedarf ist das Instrument neu anzulegen.")
if Import_fortsetzen:
anzahl_zeilen_rvvr = 0
liste_zeilen_rvvr = []
liste_punktpaare = []
with open(pfad_datei, "r", encoding="utf-8") as f:
for i, zeile in enumerate(f):
if ("Lr" in zeile) or ("Lv" in zeile):
#print(zeile.rstrip())
liste_zeilen_rvvr.append(zeile)
anzahl_zeilen_rvvr += 1
if anzahl_zeilen_rvvr % 4 == 0:
index = 0
while index < len(liste_zeilen_rvvr):
block_4 = liste_zeilen_rvvr[index:index + 4]
liste_punktnummern_block = []
for zeile_block in block_4:
punktnummer = None
if "|KD1" in zeile_block:
teil = zeile_block.split("|KD1", 1)[1].strip()
if teil != "":
punktnummer = teil.split()[0]
if punktnummer is not None:
if punktnummer not in liste_punktnummern_block:
liste_punktnummern_block.append(punktnummer)
r1 = None
v1 = None
v2 = None
r2 = None
e_1 = None
e_2 = None
e_3 = None
e_4 = None
zugnummer = None
if "|Lr" in block_4[0]:
teil = block_4[0].split("|Lr", 1)[0].strip()
if teil != "":
zugnummer = int(teil.split()[-1])
teil = block_4[0].split("Lr", 1)[1].strip() if "Lr" in block_4[0] else block_4[0].split("Lv", 1)[
1].strip()
r1 = self.string_to_float(teil.split()[0])
teil = block_4[1].split("Lr", 1)[1].strip() if "Lr" in block_4[1] else block_4[1].split("Lv", 1)[
1].strip()
v1 = self.string_to_float(teil.split()[0])
teil = block_4[2].split("Lr", 1)[1].strip() if "Lr" in block_4[2] else block_4[2].split("Lv", 1)[
1].strip()
v2 = self.string_to_float(teil.split()[0])
teil = block_4[3].split("Lr", 1)[1].strip() if "Lr" in block_4[3] else block_4[3].split("Lv", 1)[
1].strip()
r2 = self.string_to_float(teil.split()[0])
if "|E" in block_4[0]:
teil = block_4[0].split("|E", 1)[1].strip()
if teil != "":
e_1 = self.string_to_float(teil.split()[0])
if "|E" in block_4[1]:
teil = block_4[1].split("|E", 1)[1].strip()
if teil != "":
e_2 = self.string_to_float(teil.split()[0])
if "|E" in block_4[2]:
teil = block_4[2].split("|E", 1)[1].strip()
if teil != "":
e_3 = self.string_to_float(teil.split()[0])
if "|E" in block_4[3]:
teil = block_4[3].split("|E", 1)[1].strip()
if teil != "":
e_4 = self.string_to_float(teil.split()[0])
# Achtung: Hier Rundung auf 8 Nachkommastellen
dh = round((r1 - v1 - v2 + r2) / 2, 8)
entfernung = round((e_1 + e_2 + e_3 + e_4) / 2, 8)
liste_punktpaare.append((zugnummer, liste_punktnummern_block[0], liste_punktnummern_block[1], dh, entfernung))
index += 4
liste_beobachtungen_reduziert = []
liste_beobachtungen_bearbeitung = []
zugnummer_vorher = liste_punktpaare[0][0]
for einzelbeobachtung in liste_punktpaare:
zugnummer = einzelbeobachtung[0]
if zugnummer == zugnummer_vorher:
if einzelbeobachtung[1] in liste_netzpunkte and einzelbeobachtung[2] in liste_netzpunkte:
#print(einzelbeobachtung)
liste_beobachtungen_reduziert.append(einzelbeobachtung + (1,))
elif einzelbeobachtung[1] in liste_netzpunkte and einzelbeobachtung[2] not in liste_netzpunkte:
#print(f"Zielpunkt nicht enthalten {einzelbeobachtung}")
liste_beobachtungen_bearbeitung.append(einzelbeobachtung)
elif einzelbeobachtung[1] not in liste_netzpunkte and einzelbeobachtung[2] in liste_netzpunkte:
#print(f"Startpunkt nicht enthalten {einzelbeobachtung}")
liste_beobachtungen_bearbeitung.append(einzelbeobachtung)
startpunkt = None
zielpunkt = None
summe_dh = None
summe_entfernung = None
anzahl_standpunkte = 1
for i, beobachtung_bearbeiten in enumerate(liste_beobachtungen_bearbeitung):
if i == 0:
startpunkt = beobachtung_bearbeiten[1]
summe_dh = beobachtung_bearbeiten[3]
summe_entfernung = beobachtung_bearbeiten[4]
anzahl_standpunkte = 1
else:
zielpunkt = beobachtung_bearbeiten[2]
summe_dh += beobachtung_bearbeiten[3]
summe_entfernung += beobachtung_bearbeiten[4]
anzahl_standpunkte += 1
# Achtung:Hier Rundung auf 8 Nachkommastellen!
liste_beobachtungen_reduziert.append(
(zugnummer, startpunkt, zielpunkt, round(summe_dh, 8),
round(summe_entfernung, 8), anzahl_standpunkte))
liste_beobachtungen_bearbeitung = []
else:
#print(f"Startpunkt und Zielpunkt nicht enthalten {einzelbeobachtung}")
liste_beobachtungen_bearbeitung.append(einzelbeobachtung)
else:
#print(f"-----------------------------")
if einzelbeobachtung[1] in liste_netzpunkte and einzelbeobachtung[2] in liste_netzpunkte:
#print(einzelbeobachtung)
liste_beobachtungen_reduziert.append(einzelbeobachtung + (1,))
elif einzelbeobachtung[1] in liste_netzpunkte and einzelbeobachtung[2] not in liste_netzpunkte:
#print(f"Zielpunkt nicht enthalten {einzelbeobachtung}")
liste_beobachtungen_bearbeitung.append(einzelbeobachtung)
elif einzelbeobachtung[1] not in liste_netzpunkte and einzelbeobachtung[2] in liste_netzpunkte:
#print(f"Startpunkt nicht enthalten {einzelbeobachtung}")
liste_beobachtungen_bearbeitung.append(einzelbeobachtung)
startpunkt = None
zielpunkt = None
summe_dh = None
summe_entfernung = None
anzahl_standpunkte = 1
for i, beobachtung_bearbeiten in enumerate(liste_beobachtungen_bearbeitung):
if i == 0:
startpunkt = beobachtung_bearbeiten[1]
summe_dh = beobachtung_bearbeiten[3]
summe_entfernung = beobachtung_bearbeiten[4]
anzahl_standpunkte = 1
else:
zielpunkt = beobachtung_bearbeiten[2]
summe_dh += beobachtung_bearbeiten[3]
summe_entfernung += beobachtung_bearbeiten[4]
anzahl_standpunkte += 1
#Achtung:Hier Rundung auf 8 Nachkommastellen!
liste_beobachtungen_reduziert.append(
(zugnummer, startpunkt, zielpunkt, round(summe_dh,8), round(summe_entfernung,8), anzahl_standpunkte))
liste_beobachtungen_bearbeitung = []
else:
# print(f"Startpunkt und Zielpunkt nicht enthalten {einzelbeobachtung}")
liste_beobachtungen_bearbeitung.append(einzelbeobachtung)
zugnummer_vorher = zugnummer
con = sqlite3.connect(self.pfad_datenbank)
cursor = con.cursor()
for beobachtung_reduziert in liste_beobachtungen_reduziert:
cursor.execute(f"INSERT INTO Beobachtungen (punktnummer_sp, punktnummer_zp, instrumenteID, niv_dh, niv_strecke, niv_anz_standpkte, dateiname) VALUES (?, ?, ?, ?, ?, ?, ?)", (beobachtung_reduziert[1], beobachtung_reduziert[2], instrumentenID, beobachtung_reduziert[3], beobachtung_reduziert[4], beobachtung_reduziert[5], pfad_datei))
con.commit()
cursor.close()
con.close()
return f"Die Beobachtungen aus der Datei {pfad_datei} wurden erfolgreich importiert."
else:
print(f"Anzahl nicht RVVR durch 4 teilbar. Bitte die Datei {pfad_datei} überprüfen! Der Import wurde abgebrochen.")
Import_fortsetzen = False
def import_koordinaten_gnss(self, pfad_datei, liste_sapos_stationen_genauigkeiten): def import_koordinaten_gnss(self, pfad_datei, liste_sapos_stationen_genauigkeiten):
liste_zeilen = [] liste_zeilen = []
dict_koordinaten = {} dict_koordinaten = {}
@@ -261,3 +584,4 @@ class Import:
con.commit() con.commit()
con.close() con.close()
return "Import der Koordinaten aus stationärem GNSS abgeschlossen." return "Import der Koordinaten aus stationärem GNSS abgeschlossen."