{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# Hier werden alle verwendeten Pythonmodule importiert\n",
    "import Datenbank\n",
    "import Import\n",
    "import importlib\n",
    "import Koordinatentransformationen\n",
    "import sqlite3\n",
    "import Funktionales_Modell\n",
    "import Berechnungen\n",
    "import Parameterschaetzung\n",
    "import Stochastisches_Modell\n",
    "from Stochastisches_Modell import StochastischesModell\n",
    "import Export\n",
    "import Netzqualität_Genauigkeit\n",
    "import Datumsfestlegung"
   ],
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "importlib.reload(Datenbank)\n",
    "importlib.reload(Import)\n",
    "# Anlegen der Datenbank, wenn nicht vorhanden\n",
    "pfad_datenbank = r\"Campusnetz.db\"\n",
    "Datenbank.Datenbank_anlegen(pfad_datenbank)\n",
    "\n",
    "# Import vervollständigen\n",
    "imp = Import.Import(pfad_datenbank)\n",
    "db_zugriff = Datenbank.Datenbankzugriff(pfad_datenbank)"
   ],
   "id": "82d514cd426db78b",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "# Import der Koordinatendatei(en) vom Tachymeter\n",
    "pfad_datei = r\"Daten\\campsnetz_koordinaten_bereinigt.csv\"\n",
    "imp.import_koordinaten_lh_tachymeter(pfad_datei)"
   ],
   "id": "d3bce3991a8962dc",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "importlib.reload(Datenbank)\n",
    "db_zugriff = Datenbank.Datenbankzugriff(pfad_datenbank)\n",
    "# Transformationen in ETRS89 / DREF91 Realisierung 2025\n",
    "print(db_zugriff.get_koordinaten(\"naeherung_lh\"))"
   ],
   "id": "196ff0c8f8b5aea1",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "importlib.reload(Datenbank)\n",
    "db_zugriff = Datenbank.Datenbankzugriff(pfad_datenbank)\n",
    "# Transformationen in ETRS89 / DREF91 Realisierung 2025\n",
    "print(db_zugriff.get_koordinaten(\"naeherung_us\"))"
   ],
   "id": "3989b7b41874c16a",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "# ToDo: Sobald GNSS vorliegend Koordinaten im ETRS89 / DREF 91 (2025) daraus berechnen!\n",
    "liste_koordinaten_naeherung_us_alt = {\n",
    "    10001: (3794874.98408291, 546741.751930012, 5079995.3838),\n",
    "    10002: (3794842.53340714, 546726.907150697, 5080039.8778),\n",
    "    10008: (3794757.41294192, 546742.822339098, 5080107.3198),\n",
    "    10012: (3794827.11937161, 546801.412652168, 5080028.5852),\n",
    "    10026: (3794727.06042449, 546823.571170112, 5080134.2029),\n",
    "    10028: (3794862.91900719, 546904.943464041, 5079920.8994),\n",
    "    10037: (3794774.14751515, 546955.423068316, 5079960.9426),\n",
    "    10044: (3794725.78597473, 546954.557211544, 5080009.9234),\n",
    "    10054: (3794852.07416848, 547094.399826613, 5079715.1737),\n",
    "    10059: (3794710.34348443, 547075.630380075, 5080119.6491),\n",
    "}\n",
    "\n",
    "liste_koordinaten_naeherung_us_V2 = {\n",
    "    10001: (3794874.984, 546741.752, 5080029.990),\n",
    "    10002: (3794842.533, 546726.907, 5080071.133),\n",
    "    10008: (3794757.413, 546742.822, 5080135.400),\n",
    "    10012: (3794827.119, 546801.413, 5080065.404),\n",
    "    10026: (3794727.060, 546823.571, 5080179.951),\n",
    "    10028: (3794862.919, 546904.943, 5079963.214),\n",
    "    10037: (3794774.148, 546955.423, 5080040.520),\n",
    "    10044: (3794725.786, 546954.557, 5080084.411),\n",
    "    10054: (3794852.074, 547094.400, 5079771.845),\n",
    "    10059: (3794710.343, 547075.630, 5080153.653),\n",
    "}\n",
    "\n",
    "liste_koordinaten_naeherung_us = {\n",
    "    10001: (3794874.984, 546741.752, 5080029.990),\n",
    "    10002: (3794842.533, 546726.907, 5080071.133),\n",
    "    10037: (3794774.148, 546955.423, 5080040.520),\n",
    "    10044: (3794725.786, 546954.557, 5080084.411),\n",
    "}\n",
    "\n",
    "\n",
    "con = sqlite3.connect(pfad_datenbank)\n",
    "cursor = con.cursor()\n",
    "sql = \"\"\"\n",
    "UPDATE Netzpunkte\n",
    "SET naeherungx_us = ?, naeherungy_us = ?, naeherungz_us = ?\n",
    "WHERE punktnummer = ?\n",
    "\"\"\"\n",
    "for punktnummer, (x, y, z) in liste_koordinaten_naeherung_us.items():\n",
    "    cursor.execute(sql, (x, y, z, punktnummer))\n",
    "con.commit()\n",
    "cursor.close()\n",
    "con.close()"
   ],
   "id": "f64d9c01318b40f1",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "# ToDo: Sobald GNSS-Daten vorliegen und die Berechnungen richtig sind, aufräumen!!!\n",
    "\n",
    "importlib.reload(Koordinatentransformationen)\n",
    "trafos = Koordinatentransformationen.Transformationen(pfad_datenbank)\n",
    "\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "import itertools\n",
    "import numpy as np\n",
    "import sympy as sp\n",
    "\n",
    "db = Datenbank.Datenbankzugriff(pfad_datenbank)\n",
    "dict_ausgangssystem = db.get_koordinaten(\"naeherung_lh\", \"Dict\")\n",
    "dict_zielsystem = db.get_koordinaten(\"naeherung_us\", \"Dict\")\n",
    "\n",
    "gemeinsame_punktnummern = sorted(set(dict_ausgangssystem.keys()) & set(dict_zielsystem.keys()))\n",
    "anzahl_gemeinsame_punkte = len(gemeinsame_punktnummern)\n",
    "\n",
    "liste_punkte_ausgangssystem = [dict_ausgangssystem[i] for i in gemeinsame_punktnummern]\n",
    "liste_punkte_zielsystem = [dict_zielsystem[i] for i in gemeinsame_punktnummern]\n",
    "\n",
    "def dist(a, b):\n",
    "    return float((a - b).norm())\n",
    "\n",
    "print(\"d(p2,p1)=\", dist(liste_punkte_ausgangssystem[1], liste_punkte_ausgangssystem[0]))\n",
    "print(\"d(P2,P1)=\", dist(liste_punkte_zielsystem[1], liste_punkte_zielsystem[0]))\n",
    "print(\"m0 ~\", dist(liste_punkte_zielsystem[1], liste_punkte_zielsystem[0]) /\n",
    "               dist(liste_punkte_ausgangssystem[1], liste_punkte_ausgangssystem[0]))\n",
    "\n",
    "\n",
    "def dist(a, b):\n",
    "    return float((a - b).norm())\n",
    "\n",
    "ratios = []\n",
    "pairs = list(itertools.combinations(range(len(liste_punkte_ausgangssystem)), 2))\n",
    "\n",
    "for i, j in pairs:\n",
    "    d_loc = dist(liste_punkte_ausgangssystem[i], liste_punkte_ausgangssystem[j])\n",
    "    d_ecef = dist(liste_punkte_zielsystem[i], liste_punkte_zielsystem[j])\n",
    "    if d_loc > 1e-6:\n",
    "        ratios.append(d_ecef / d_loc)\n",
    "\n",
    "print(\"Anzahl Ratios:\", len(ratios))\n",
    "print(\"min/mean/max:\", min(ratios), sum(ratios)/len(ratios), max(ratios))\n",
    "print(\"std:\", float(np.std(ratios)))\n",
    "\n",
    "S_loc = sum(liste_punkte_ausgangssystem, sp.Matrix([0,0,0])) / anzahl_gemeinsame_punkte\n",
    "S_ecef = sum(liste_punkte_zielsystem, sp.Matrix([0,0,0])) / anzahl_gemeinsame_punkte\n",
    "\n",
    "print(\"S_loc:\", S_loc)\n",
    "print(\"S_ecef:\", S_ecef)\n",
    "print(\"Delta:\", (S_ecef - S_loc).evalf(6))\n",
    "\n",
    "\n",
    "def dist(a, b):\n",
    "    return float((a - b).norm())\n",
    "\n",
    "n = len(liste_punkte_ausgangssystem)\n",
    "\n",
    "scores = []\n",
    "for i in range(n):\n",
    "    d_loc = []\n",
    "    d_ecef = []\n",
    "    for j in range(n):\n",
    "        if i == j:\n",
    "            continue\n",
    "        d_loc.append(dist(liste_punkte_ausgangssystem[i], liste_punkte_ausgangssystem[j]))\n",
    "        d_ecef.append(dist(liste_punkte_zielsystem[i], liste_punkte_zielsystem[j]))\n",
    "\n",
    "    d_loc = np.array(d_loc)\n",
    "    d_ecef = np.array(d_ecef)\n",
    "\n",
    "    # Verhältnisvektor; robust gegen Nullschutz\n",
    "    r = d_ecef / np.where(d_loc == 0, np.nan, d_loc)\n",
    "\n",
    "    # Streuung der Ratios für Punkt i\n",
    "    score = np.nanstd(r)\n",
    "    scores.append(score)\n",
    "\n",
    "for pn, sc in sorted(zip(gemeinsame_punktnummern, scores), key=lambda x: -x[1]):\n",
    "    print(pn, round(sc, 4))\n",
    "\n",
    "\n",
    "\n",
    "transformationsparameter = trafos.Helmerttransformation_Euler_Transformationsparameter_berechne()"
   ],
   "id": "21d60465e432c649",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "importlib.reload(Koordinatentransformationen)\n",
    "trafos = Koordinatentransformationen.Transformationen(pfad_datenbank)\n",
    "\n",
    "koordinaten_transformiert = trafos.Helmerttransformation(transformationsparameter)\n",
    "print(koordinaten_transformiert)"
   ],
   "id": "df0dcccb73299fcf",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "importlib.reload(Datenbank)\n",
    "db_zugriff = Datenbank.Datenbankzugriff(pfad_datenbank)\n",
    "\n",
    "db_zugriff.set_koordinaten(koordinaten_transformiert, \"naeherung_us\")"
   ],
   "id": "f6993d81c8a145dd",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "# Importieren der tachymetrischen Beobachtungen\n",
    "importlib.reload(Datenbank)\n",
    "db_zugriff = Datenbank.Datenbankzugriff(pfad_datenbank)\n",
    "\n",
    "db_zugriff.get_instrument(\"Tachymeter\")\n",
    "db_zugriff.set_instrument(\"Tachymeter\", \"Trimble S9\")\n",
    "db_zugriff.get_instrument(\"Tachymeter\")"
   ],
   "id": "e376b4534297016c",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "#Importieren der apriori Genauigkeitsinformationen\n",
    "#Zulässige Beobachtungsarten = \"Tachymeter_Richtung\", \"Tachymeter_Strecke\"\n",
    "# Wenn Beobachtungsart = \"Tachymeter_Richtung\" --> Übergabe in Milligon und nur Stabw_apriori_konst\n",
    "# Wenn Beobachtungsart = \"Tachymeter_Strecke\" --> Übergabe Stabw_apriori_konst in Millimeter und Stabw_apriori_streckenprop in ppm\n",
    "\n",
    "importlib.reload(Datenbank)\n",
    "db_zugriff = Datenbank.Datenbankzugriff(pfad_datenbank)\n",
    "importlib.reload(Berechnungen)\n",
    "\n",
    "db_zugriff.set_genauigkeiten(1, \"Tachymeter_Richtung\", 0.15)\n",
    "db_zugriff.set_genauigkeiten(1, \"Tachymeter_Strecke\", 0.8, 1)"
   ],
   "id": "97e24245ce3398a2",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "# Importieren der tachymetrischen Beobachtungen\n",
    "importlib.reload(Import)\n",
    "imp = Import.Import(pfad_datenbank)\n",
    "\n",
    "pfad_datei_tachymeterbeobachtungen = r\"Daten\\campsnetz_beobachtungen_bereinigt.csv\"\n",
    "\n",
    "imp.import_beobachtungen_tachymeter(pfad_datei_tachymeterbeobachtungen, 1)"
   ],
   "id": "509e462917e98145",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "# Jacobimatrix aufstellen\n",
    "importlib.reload(Datenbank)\n",
    "db_zugriff = Datenbank.Datenbankzugriff(pfad_datenbank)\n",
    "\n",
    "# Parameter des GRS80-ellipsoids (Bezugsellipsoid des ETRS89 / DREF 91 (2025)\n",
    "# ToDo: Quelle mit möglichst genauen Parametern heraussuchen!\n",
    "a = 6378137.0 #m\n",
    "b = 63567552.314 #m\n",
    "\n",
    "importlib.reload(Funktionales_Modell)\n",
    "fm = Funktionales_Modell.FunktionalesModell(pfad_datenbank, a, b)\n",
    "\n",
    "#db_zugriff.get_beobachtungen_id_standpunkt_zielpunkt(\"tachymeter_distanz\")\n",
    "Jacobimatrix_symbolisch = fm.jacobi_matrix_symbolisch()[0]\n",
    "Jacobimatrix_symbolisch_liste_unbekannte = fm.jacobi_matrix_symbolisch()[1]\n",
    "Jacobimatrix_symbolisch_liste_beobachtungsvektor = fm.jacobi_matrix_symbolisch()[2]"
   ],
   "id": "d38939f7108e1788",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "importlib.reload(Datenbank)\n",
    "db_zugriff = Datenbank.Datenbankzugriff(pfad_datenbank)\n",
    "importlib.reload(Funktionales_Modell)\n",
    "fm = Funktionales_Modell.FunktionalesModell(pfad_datenbank, a, b)\n",
    "\n",
    "A_matrix_numerisch_iteration0 = fm.jacobi_matrix_zahlen_iteration_0(Jacobimatrix_symbolisch, \"naeherung_us\", Jacobimatrix_symbolisch_liste_unbekannte, Jacobimatrix_symbolisch_liste_beobachtungsvektor)"
   ],
   "id": "4a0b1790c65d59ee",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "importlib.reload(Funktionales_Modell)\n",
    "fm = Funktionales_Modell.FunktionalesModell(pfad_datenbank, a, b)\n",
    "\n",
    "beobachtungsvektor_numerisch = fm.beobachtungsvektor_numerisch(Jacobimatrix_symbolisch_liste_beobachtungsvektor)"
   ],
   "id": "38f698b6694bebe7",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "importlib.reload(Funktionales_Modell)\n",
    "fm = Funktionales_Modell.FunktionalesModell(pfad_datenbank, a, b)\n",
    "\n",
    "beobachtungsvektor_naeherung_symbolisch = fm.beobachtungsvektor_naeherung_symbolisch(Jacobimatrix_symbolisch_liste_beobachtungsvektor)"
   ],
   "id": "e5cca13bbb6b95c5",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "importlib.reload(Funktionales_Modell)\n",
    "fm = Funktionales_Modell.FunktionalesModell(pfad_datenbank, a, b)\n",
    "\n",
    "beobachtungsvektor_naeherung_numerisch_iteration0 = fm.beobachtungsvektor_naeherung_numerisch_iteration0(Jacobimatrix_symbolisch_liste_beobachtungsvektor, beobachtungsvektor_naeherung_symbolisch)"
   ],
   "id": "eb0452c52e7afa6b",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": "",
   "id": "5d74f8b2456ec661",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "source": [
    "importlib.reload(Funktionales_Modell)\n",
    "fm = Funktionales_Modell.FunktionalesModell(pfad_datenbank, a, b)\n",
    "\n",
    "importlib.reload(Parameterschaetzung)\n",
    "importlib.reload(Stochastisches_Modell)\n",
    "\n",
    "importlib.reload(Netzqualität_Genauigkeit)\n",
    "importlib.reload(Export)\n",
    "\n",
    "\n",
    "stoch_modell = Stochastisches_Modell.StochastischesModell(A_matrix_numerisch_iteration0.rows)\n",
    "\n",
    "Parameterschaetzung.ausgleichung(A_matrix_numerisch_iteration0, fm.berechnung_dl(beobachtungsvektor_numerisch, beobachtungsvektor_naeherung_numerisch_iteration0), stoch_modell)"
   ],
   "id": "3b38998a2765b74d",
   "outputs": [],
   "execution_count": null
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": [
    "# Datumsfestlegung: Bitte geben Sie nachfolgend die Koordinatenkomponenten an, die das Datum definieren sollen\n",
    "\n",
    "auswahl = [\n",
    "    (\"101\",\"X\"), (\"101\",\"Y\"),          # Punkt 101 nur Lage\n",
    "    (\"205\",\"X\"), (\"205\",\"Y\"), (\"205\",\"Z\"),  # Punkt 205 voll\n",
    "    (\"330\",\"Z\")                        # Punkt 330 nur Höhe\n",
    "]\n",
    "\n",
    "aktive_unbekannte_indices = Datumsfestlegung.datumskomponenten(auswahl, liste_punktnummern)"
   ],
   "id": "c37670a07848d977"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
