diff --git a/.idea/dataSources/c385b2f5-c801-4154-bc11-62182a8396b3.xml b/.idea/dataSources/c385b2f5-c801-4154-bc11-62182a8396b3.xml
index d77fc44..dcf5f26 100644
--- a/.idea/dataSources/c385b2f5-c801-4154-bc11-62182a8396b3.xml
+++ b/.idea/dataSources/c385b2f5-c801-4154-bc11-62182a8396b3.xml
@@ -4,71 +4,97 @@
3.45.1
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
-
- window
-
-
- 1
-
-
- 1
-
-
- 1
-
-
-
+
+
1
1
-
-
-
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
1
1
@@ -76,901 +102,875 @@
1
1
-
+
1
1
-
+
1
+ 1
-
+
1
+ 1
-
-
-
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
window
-
+
window
-
-
-
-
- 1
- 1
-
-
- 1
- 1
-
-
+
+
+
+
1
-
+
window
-
-
+
1
-
+
window
-
+
1
-
- 1
- 1
-
-
-
-
-
+
+
1
-
+
1
-
+
+ 1
+
+
+ 1
+
+
+
+ 1
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
window
-
+
1
-
- 1
-
-
+
1
-
+
+ window
+
+
+ window
+
+
1
-
+
1
-
+
1
-
- 1
- 1
-
-
+
1
-
+
1
-
+
1
- 1
-
+
+ window
+
+
+ 1
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ window
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
1
window
-
+
+ window
+
+
+ 1
+
+
+ 1
+
+
1
window
-
- 1
- 1
-
-
- 1
- 1
-
-
- 1
-
-
- 1
-
-
- 1
- 1
-
-
- 1
- 1
-
-
- 1
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
- 1
-
-
- 1
- 1
-
-
+
1
window
-
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+ 1
+
+
1
window
-
- 1
- 1
-
-
- 1
- 1
-
-
+
1
-
- 1
- 1
-
-
- 1
- 1
-
-
- 1
- 1
-
-
- 1
- 1
-
-
+
window
-
+
window
-
-
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
window
-
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
window
-
+
+ 1
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
window
-
-
+
1
-
+
1
-
+
1
-
+
+ window
+
+
1
-
+
1
-
-
+
1
-
+
+
+
+ window
+
+
1
-
+
1
-
+
1
-
+
+ window
+
+
+ window
+
+
+ window
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ window
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
aggregate
-
- 1
-
-
-
-
-
- 1
- 1
-
-
- window
-
-
+
aggregate
-
- 1
- 1
-
-
- window
-
-
- 1
-
-
+
aggregate
-
- window
-
-
- window
-
-
- 1
-
-
- 1
-
-
-
-
-
-
-
- window
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
- 1
-
-
-
- 1
-
-
- 1
-
-
-
-
- window
-
-
- 1
-
-
- 1
-
-
-
-
-
- 1
-
-
- window
-
-
- 1
-
-
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
-
-
- 1
-
-
-
-
- 1
-
-
-
+
+
+
aggregate
-
-
- 1
- 1
-
-
- window
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- window
-
-
- 1
-
-
- 1
-
-
- 1
- 1
-
-
- 1
-
-
- window
-
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
-
-
- 1
- 1
-
-
- 1
-
-
- 1
-
-
+
+
+
+
+
+
aggregate
-
- aggregate
-
-
+
+
+
+
+
+
1
+
+
+
+ aggregate
+
+
+
+
+
+
+
+
+
+
1
- 2025-12-05.15:44:20
+ 2025-12-09.09:30:08
R
-
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
1
-
+
2
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- R
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- R
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- 2
-
-
+
3
-
+
R
-
- R
-
-
- R
-
-
- R
-
-
+
1
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- R
-
-
- R
-
-
- R
-
-
- R
-
-
- R
-
-
- R
-
-
- 1
-
-
- R
-
-
- R
-
-
- 1
-
-
+
2
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- R
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- R
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- 2
-
-
+
3
-
+
R
-
+
1
-
+
2
-
+
R
-
+
1
-
- R
-
-
- R
-
-
- 1
-
-
+
2
-
+
+ 3
+
+
R
-
+
1
-
- R
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
+
2
-
+
R
-
- R
-
-
- R
-
-
+
1
-
+
2
-
+
R
-
+
1
-
- R
-
-
- R
-
-
- R
-
-
- R
-
-
- 1
-
-
+
2
-
+
R
-
+
1
-
+
2
-
+
R
-
+
1
-
+
R
-
- R
-
-
- R
-
-
+
1
-
- R
-
-
- 1
-
-
+
2
-
+
R
-
- R
-
-
- R
-
-
+
1
-
- 2
-
-
+
R
-
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
R
- R
+ 1
R
-
- R
-
-
+
1
+
+ 2
+
- 2
-
-
R
-
+
1
-
- 2
+
+ R
-
- 3
+
+ 1
+
+
+ R
- R
+ 1
R
@@ -993,584 +993,584 @@
1
-
- 2
+
+ R
-
- 3
+
+ 1
- R
-
-
- 1
-
-
2
-
+
R
-
+
1
-
+
R
-
+
1
-
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
2
-
+
3
-
+
R
-
+
1
-
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
2
-
+
R
-
+
1
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
+
2
-
+
R
-
+
+ R
+
+
+ R
+
+
1
-
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
2
-
+
R
-
+
1
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
+
2
-
+
R
-
+
+ R
+
+
1
-
+
2
-
+
R
-
+
1
-
+
R
-
+
1
-
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
2
-
+
R
-
- R
-
-
+
1
-
+
R
-
+
1
-
+
R
-
- R
-
-
+
1
-
- R
-
-
- 1
-
-
+
2
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- R
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- R
-
-
- 1
-
-
- R
-
-
- R
-
-
- R
-
-
- 1
-
-
- 2
-
-
+
3
-
+
R
-
+
+ R
+
+
+ R
+
+
1
-
+
+ R
+
+
+ 1
+
+
2
-
+
R
-
+
1
-
+
R
-
+
+ R
+
+
1
-
+
2
-
+
R
-
+
1
-
+
2
-
+
R
-
- R
-
-
- R
-
-
+
1
-
+
R
-
+
+ R
+
+
+ R
+
+
1
-
+
2
-
+
R
-
+
1
-
+
2
-
+
R
-
+
1
-
+
R
-
+
1
-
- R
-
-
- 1
-
-
- R
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
+
2
-
- R
-
-
- R
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- 2
-
-
+
3
-
+
R
-
+
1
-
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
2
-
- 3
-
-
+
R
-
+
1
-
+
R
-
+
1
-
+
R
-
+
1
-
+
+ 2
+
+
R
-
+
1
-
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
R
- R
-
-
1
-
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
2
-
+
R
-
+
1
-
+
R
-
- R
-
-
+
1
-
- 2
-
-
+
R
-
+
1
-
- R
-
-
- 1
-
-
- R
-
-
- 1
-
-
- 2
-
-
- R
-
-
- 1
-
-
- R
-
- R
+ 2
-
- 1
+
+ R
- R
+ 1
- 1
+ 2
R
diff --git a/Campusnetz.db b/Campusnetz.db
index 2595cf4..3cba820 100644
Binary files a/Campusnetz.db and b/Campusnetz.db differ
diff --git a/Campusnetz.ipynb b/Campusnetz.ipynb
index 9666cd6..2c0857f 100644
--- a/Campusnetz.ipynb
+++ b/Campusnetz.ipynb
@@ -6,15 +6,17 @@
"metadata": {
"collapsed": true,
"ExecuteTime": {
- "end_time": "2025-12-08T16:59:58.933024Z",
- "start_time": "2025-12-08T16:59:58.578335Z"
+ "end_time": "2025-12-09T12:25:40.573167Z",
+ "start_time": "2025-12-09T12:25:40.219840Z"
}
},
"source": [
"# Hier werden alle verwendeten Pythonmodule importiert\n",
"import Datenbank\n",
"import Import\n",
- "import importlib"
+ "import importlib\n",
+ "import Koordinatentransformationen\n",
+ "import sqlite3"
],
"outputs": [],
"execution_count": 1
@@ -22,8 +24,8 @@
{
"metadata": {
"ExecuteTime": {
- "end_time": "2025-12-08T17:00:01.134916Z",
- "start_time": "2025-12-08T17:00:01.110846Z"
+ "end_time": "2025-12-09T12:25:40.603148Z",
+ "start_time": "2025-12-09T12:25:40.579387Z"
}
},
"cell_type": "code",
@@ -44,14 +46,14 @@
{
"metadata": {
"ExecuteTime": {
- "end_time": "2025-12-08T17:00:02.698814Z",
- "start_time": "2025-12-08T17:00:02.678346Z"
+ "end_time": "2025-12-09T12:25:40.629729Z",
+ "start_time": "2025-12-09T12:25:40.608515Z"
}
},
"cell_type": "code",
"source": [
"# Import der Koordinatendatei(en) vom Tachymeter\n",
- "pfad_datei = r\"Daten\\campusnetz_koordinaten_25_11.csv\"\n",
+ "pfad_datei = r\"Daten\\campsnetz_final_koordinaten.csv\"\n",
"imp.import_koordinaten_lh_tachymeter(pfad_datei)"
],
"id": "d3bce3991a8962dc",
@@ -69,8 +71,8 @@
{
"metadata": {
"ExecuteTime": {
- "end_time": "2025-12-08T17:00:13.157273Z",
- "start_time": "2025-12-08T17:00:13.147245Z"
+ "end_time": "2025-12-09T12:25:40.645668Z",
+ "start_time": "2025-12-09T12:25:40.635523Z"
}
},
"cell_type": "code",
@@ -86,170 +88,676 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "[{'10009': Matrix([\n",
+ "{'10009': Matrix([\n",
"[1000.0],\n",
"[2000.0],\n",
- "[ 100.0]])}, {'10006': Matrix([\n",
+ "[ 100.0]]), '10006': Matrix([\n",
"[ 1000.0],\n",
"[2032.6863],\n",
- "[ 99.5825]])}, {'10010': Matrix([\n",
+ "[ 99.5825]]), '10010': Matrix([\n",
"[1011.8143],\n",
"[1973.3252],\n",
- "[ 99.9259]])}, {'10018': Matrix([\n",
+ "[ 99.9259]]), '10018': Matrix([\n",
"[1008.5759],\n",
"[ 1942.762],\n",
- "[ 100.2553]])}, {'10008': Matrix([\n",
+ "[ 100.2553]]), '10008': Matrix([\n",
"[979.7022],\n",
"[1991.401],\n",
- "[ 99.732]])}, {'10005': Matrix([\n",
+ "[ 99.732]]), '10005': Matrix([\n",
"[ 966.5154],\n",
"[2014.6496],\n",
- "[ 99.72]])}, {'10003': Matrix([\n",
+ "[ 99.72]]), '10003': Matrix([\n",
"[ 908.4312],\n",
"[1996.1248],\n",
- "[ 99.7403]])}, {'10004': Matrix([\n",
+ "[ 99.7403]]), '10004': Matrix([\n",
"[ 954.1536],\n",
"[2021.6822],\n",
- "[ 99.4916]])}, {'10007': Matrix([\n",
+ "[ 99.4916]]), '10007': Matrix([\n",
"[ 921.7481],\n",
"[1973.6201],\n",
- "[ 99.9176]])}, {'10001': Matrix([\n",
+ "[ 99.9176]]), '10001': Matrix([\n",
"[ 833.9439],\n",
"[1978.3737],\n",
- "[ 99.8946]])}, {'10002': Matrix([\n",
+ "[ 99.8946]]), '10002': Matrix([\n",
"[ 875.9684],\n",
"[1998.5174],\n",
- "[ 99.5867]])}, {'100016': Matrix([\n",
+ "[ 99.5867]]), '100016': Matrix([\n",
"[ 928.2783],\n",
"[1944.0082],\n",
- "[ 100.0459]])}, {'10011': Matrix([\n",
+ "[ 100.0459]]), '10011': Matrix([\n",
"[ 908.4308],\n",
"[1996.1277],\n",
- "[ 99.7822]])}, {'10011a': Matrix([\n",
+ "[ 99.7822]]), '10011a': Matrix([\n",
"[844.9567],\n",
"[1891.157],\n",
- "[ 99.8117]])}, {'10026': Matrix([\n",
+ "[ 99.8117]]), '10026': Matrix([\n",
"[1020.0059],\n",
"[1913.8703],\n",
- "[ 100.3059]])}, {'10027': Matrix([\n",
+ "[ 100.3059]]), '10027': Matrix([\n",
"[1016.9451],\n",
"[1866.2914],\n",
- "[ 100.3251]])}, {'10043': Matrix([\n",
+ "[ 100.3251]]), '10043': Matrix([\n",
"[1031.2077],\n",
"[1822.4739],\n",
- "[ 100.3035]])}, {'10044': Matrix([\n",
+ "[ 100.3035]]), '10044': Matrix([\n",
"[ 1025.976],\n",
"[1782.4835],\n",
- "[ 100.5461]])}, {'10021': Matrix([\n",
+ "[ 100.5461]]), '10021': Matrix([\n",
"[ 992.7607],\n",
"[1904.8854],\n",
- "[ 100.3533]])}, {'10020': Matrix([\n",
+ "[ 100.3533]]), '10020': Matrix([\n",
"[ 984.6187],\n",
"[1903.3601],\n",
- "[ 100.3423]])}, {'10024': Matrix([\n",
+ "[ 100.3423]]), '10024': Matrix([\n",
"[ 997.4831],\n",
"[1881.7862],\n",
- "[ 100.3032]])}, {'10025': Matrix([\n",
+ "[ 100.3032]]), '10025': Matrix([\n",
"[996.3241],\n",
"[1866.844],\n",
- "[100.4102]])}, {'10022': Matrix([\n",
+ "[100.4102]]), '10022': Matrix([\n",
"[990.0679],\n",
"[1896.536],\n",
- "[100.2194]])}, {'10023': Matrix([\n",
+ "[100.2194]]), '10023': Matrix([\n",
"[ 987.3223],\n",
"[1889.8762],\n",
- "[ 100.343]])}, {'10019': Matrix([\n",
+ "[ 100.343]]), '10019': Matrix([\n",
"[ 962.6387],\n",
"[1902.3565],\n",
- "[ 99.9772]])}, {'10033': Matrix([\n",
+ "[ 99.9772]]), '10033': Matrix([\n",
"[ 964.0191],\n",
"[1860.8023],\n",
- "[ 99.8551]])}, {'10017': Matrix([\n",
+ "[ 99.8551]]), '10017': Matrix([\n",
"[ 931.6761],\n",
"[1900.9945],\n",
- "[ 99.9572]])}, {'10052': Matrix([\n",
+ "[ 99.9572]]), '10052': Matrix([\n",
"[ 1037.875],\n",
"[1757.2999],\n",
- "[ 100.2737]])}, {'10042': Matrix([\n",
+ "[ 100.2737]]), '10042': Matrix([\n",
"[1017.3489],\n",
"[1803.0742],\n",
- "[ 100.3441]])}, {'10053': Matrix([\n",
+ "[ 100.3441]]), '10053': Matrix([\n",
"[1033.3758],\n",
"[1723.4258],\n",
- "[ 100.2774]])}, {'10037': Matrix([\n",
+ "[ 100.2774]]), '10037': Matrix([\n",
"[ 966.2253],\n",
"[1774.2051],\n",
- "[ 99.9957]])}, {'10040': Matrix([\n",
+ "[ 99.9957]]), '10040': Matrix([\n",
"[ 990.8832],\n",
"[1780.9678],\n",
- "[ 100.1677]])}, {'10041': Matrix([\n",
+ "[ 100.1677]]), '10041': Matrix([\n",
"[993.2769],\n",
"[1812.031],\n",
- "[100.4749]])}, {'10038': Matrix([\n",
+ "[100.4749]]), '10038': Matrix([\n",
"[ 958.1899],\n",
"[1804.7135],\n",
- "[ 100.0741]])}, {'10051': Matrix([\n",
+ "[ 100.0741]]), '10051': Matrix([\n",
"[1008.9811],\n",
"[1750.1838],\n",
- "[ 100.288]])}, {'10036': Matrix([\n",
+ "[ 100.288]]), '10036': Matrix([\n",
"[ 948.6403],\n",
"[1763.5807],\n",
- "[ 100.0063]])}, {'10035': Matrix([\n",
+ "[ 100.0063]]), '10035': Matrix([\n",
"[ 910.1265],\n",
"[1768.0099],\n",
- "[ 100.0781]])}, {'10039': Matrix([\n",
+ "[ 100.0781]]), '10039': Matrix([\n",
"[ 960.3884],\n",
"[1820.0543],\n",
- "[ 100.0983]])}, {'10059': Matrix([\n",
+ "[ 100.0983]]), '10059': Matrix([\n",
"[1049.2587],\n",
"[1662.5451],\n",
- "[ 100.0148]])}, {'10050': Matrix([\n",
+ "[ 100.0148]]), '10050': Matrix([\n",
"[1010.0246],\n",
"[1726.2445],\n",
- "[ 100.1493]])}, {'10049': Matrix([\n",
+ "[ 100.1493]]), '10049': Matrix([\n",
"[ 984.7667],\n",
"[1714.5709],\n",
- "[ 100.0101]])}, {'100': Matrix([\n",
+ "[ 100.0101]]), '100': Matrix([\n",
"[ 957.3912],\n",
"[1716.2864],\n",
- "[ 99.7777]])}, {'10013': Matrix([\n",
+ "[ 99.7777]]), '10013': Matrix([\n",
"[900.9076],\n",
"[1902.873],\n",
- "[ 99.7911]])}, {'10028': Matrix([\n",
+ "[ 99.7911]]), '10028': Matrix([\n",
"[ 853.9608],\n",
"[1815.7417],\n",
- "[ 99.7793]])}, {'10012': Matrix([\n",
+ "[ 99.7793]]), '10012': Matrix([\n",
"[ 895.3032],\n",
"[1924.1523],\n",
- "[ 99.8758]])}, {'10014': Matrix([\n",
+ "[ 99.8758]]), '10014': Matrix([\n",
"[ 913.9706],\n",
"[1918.7731],\n",
- "[ 99.8872]])}, {'10031': Matrix([\n",
+ "[ 99.8872]]), '10031': Matrix([\n",
"[ 937.1557],\n",
"[1855.2805],\n",
- "[ 99.8479]])}, {'10015': Matrix([\n",
+ "[ 99.8479]]), '10015': Matrix([\n",
"[ 912.5157],\n",
"[1937.6471],\n",
- "[ 99.9834]])}, {'10032': Matrix([\n",
+ "[ 99.9834]]), '10032': Matrix([\n",
"[ 954.6732],\n",
"[1845.9356],\n",
- "[ 99.724]])}, {'10030': Matrix([\n",
+ "[ 99.724]]), '10030': Matrix([\n",
"[ 908.4749],\n",
"[1828.8008],\n",
- "[ 99.5581]])}, {'10029': Matrix([\n",
+ "[ 99.5581]]), '10029': Matrix([\n",
"[ 909.3343],\n",
"[1814.8767],\n",
- "[ 99.5486]])}, {'10034': Matrix([\n",
+ "[ 99.5486]]), '10034': Matrix([\n",
"[ 860.2357],\n",
"[1758.9282],\n",
- "[ 99.737]])}, {'10045': Matrix([\n",
+ "[ 99.737]]), '10045': Matrix([\n",
"[867.2324],\n",
"[1705.063],\n",
- "[ 99.7214]])}]\n"
+ "[ 99.7214]]), '10049a': Matrix([\n",
+ "[ 985.2561],\n",
+ "[1715.2109],\n",
+ "[ 99.9965]]), '10048': Matrix([\n",
+ "[ 957.3889],\n",
+ "[1716.2949],\n",
+ "[ 99.7212]]), '10047': Matrix([\n",
+ "[ 929.5334],\n",
+ "[1712.6429],\n",
+ "[ 99.6076]]), '10046': Matrix([\n",
+ "[ 910.663],\n",
+ "[1716.0969],\n",
+ "[ 99.5459]]), '10057': Matrix([\n",
+ "[969.6876],\n",
+ "[1655.597],\n",
+ "[ 99.7039]]), '10055': Matrix([\n",
+ "[ 922.4731],\n",
+ "[1647.7452],\n",
+ "[ 99.4658]]), '10054': Matrix([\n",
+ "[ 860.4481],\n",
+ "[1636.6722],\n",
+ "[ 99.7093]]), '10058': Matrix([\n",
+ "[1013.2592],\n",
+ "[1646.6356],\n",
+ "[ 99.8513]]), '10056': Matrix([\n",
+ "[ 939.9763],\n",
+ "[1636.4179],\n",
+ "[ 99.4027]])}\n"
]
}
],
"execution_count": 4
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-12-09T12:25:40.666696Z",
+ "start_time": "2025-12-09T12:25:40.654193Z"
+ }
+ },
+ "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": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{}\n"
+ ]
+ }
+ ],
+ "execution_count": 5
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-12-09T12:25:40.711147Z",
+ "start_time": "2025-12-09T12:25:40.686969Z"
+ }
+ },
+ "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": 6
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-12-09T12:38:18.913365Z",
+ "start_time": "2025-12-09T12:38:17.077549Z"
+ }
+ },
+ "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": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "d(p2,p1)= 46.60388451996242\n",
+ "d(P2,P1)= 54.462720048072995\n",
+ "m0 ~ 1.1686304823956102\n",
+ "Anzahl Ratios: 6\n",
+ "min/mean/max: 0.9679784506116116 1.0266943302085056 1.1686304823956102\n",
+ "std: 0.07473161831852519\n",
+ "S_loc: Matrix([[925.528400000000], [1883.39492500000], [100.005775000000]])\n",
+ "S_ecef: Matrix([[3794804.36275000], [546844.659750000], [5080056.51350000]])\n",
+ "Delta: Matrix([[3.79388e+6], [544961.], [5.07996e+6]])\n",
+ "10001 0.0936\n",
+ "10002 0.0873\n",
+ "10044 0.0527\n",
+ "10037 0.0477\n",
+ "Anzahl gemeinsame Punkte: 4\n",
+ "\n",
+ "Erste Zielpunkte:\n",
+ "10001 [3794874.984, 546741.752, 5080029.99]\n",
+ "10002 [3794842.533, 546726.907, 5080071.133]\n",
+ "10037 [3794774.148, 546955.423, 5080040.52]\n",
+ "10044 [3794725.786, 546954.557, 5080084.411]\n",
+ "\n",
+ "Erste Ausgangspunkte:\n",
+ "10001 [833.9439, 1978.3737, 99.8946]\n",
+ "10002 [875.9684, 1998.5174, 99.5867]\n",
+ "10037 [966.2253, 1774.2051, 99.9957]\n",
+ "10044 [1025.976, 1782.4835, 100.5461]\n",
+ "min/mean/max: 0.9679784506116116 1.0266943302085056 1.1686304823956102\n",
+ "R ist Orthonormal!\n",
+ "Iteration Nr.1 abgeschlossen\n",
+ "Matrix([[-85.7], [-61.5], [188.], [-0.246], [-0.821], [0.00489], [0.406]])\n",
+ "Iteration Nr.2 abgeschlossen\n",
+ "Matrix([[241.], [-94.3], [-151.], [0.191], [-0.153], [-0.109], [0.120]])\n",
+ "Iteration Nr.3 abgeschlossen\n",
+ "Matrix([[5.71], [5.03], [0.723], [0.00670], [0.0401], [0.0180], [-0.0355]])\n",
+ "Iteration Nr.4 abgeschlossen\n",
+ "Matrix([[-2.83], [-1.48], [-2.88], [0.000657], [-0.00186], [0.00135], [0.00102]])\n",
+ "Iteration Nr.5 abgeschlossen\n",
+ "Matrix([[0.441], [0.196], [0.417], [6.90e-8], [0.000310], [-0.000257], [-0.000169]])\n",
+ "Iteration Nr.6 abgeschlossen\n",
+ "Matrix([[-0.0781], [-0.0348], [-0.0729], [1.91e-9], [-5.48e-5], [4.49e-5], [3.00e-5]])\n",
+ "Iteration Nr.7 abgeschlossen\n",
+ "Matrix([[0.0137], [0.00611], [0.0128], [5.92e-11], [9.61e-6], [-7.89e-6], [-5.25e-6]])\n",
+ "Iteration Nr.8 abgeschlossen\n",
+ "Matrix([[-0.00241], [-0.00107], [-0.00225], [1.35e-12], [-1.69e-6], [1.39e-6], [9.23e-7]])\n",
+ "Iteration Nr.9 abgeschlossen\n",
+ "Matrix([[0.000423], [0.000188], [0.000395], [-4.72e-13], [2.96e-7], [-2.43e-7], [-1.62e-7]])\n",
+ "Iteration Nr.10 abgeschlossen\n",
+ "Matrix([[-7.42e-5], [-3.31e-5], [-6.95e-5], [1.10e-12], [-5.21e-8], [4.27e-8], [2.85e-8]])\n",
+ "Iteration Nr.11 abgeschlossen\n",
+ "Matrix([[1.30e-5], [5.82e-6], [1.22e-5], [-3.48e-13], [9.15e-9], [-7.51e-9], [-5.00e-9]])\n",
+ "Matrix([[3.79e+6], [5.47e+5], [5.08e+6], [3.79e+6], [5.47e+5], [5.08e+6], [3.79e+6], [5.47e+5], [5.08e+6], [3.79e+6], [5.47e+5], [5.08e+6]])\n",
+ "Matrix([[3.79e+6], [5.46e+5], [5.08e+6], [3.79e+6], [5.46e+5], [5.08e+6], [3.79e+6], [5.47e+5], [5.08e+6], [3.79e+6], [5.47e+5], [5.08e+6]])\n",
+ "x = Matrix([[3.80e+6], [5.48e+5], [5.08e+6], [0.979], [-0.481], [0.677], [3.42]])\n",
+ "\n",
+ "l_berechnet_final:\n",
+ "10001: 3794874.637, 546738.682, 5080033.793\n",
+ "10002: 3794844.297, 546729.060, 5080066.484\n",
+ "10037: 3794770.848, 546952.857, 5080042.910\n",
+ "10044: 3794727.668, 546958.039, 5080082.867\n",
+ "Streckendifferenzen:\n",
+ "[4.899982, 5.418896, 4.814927, 4.248968]\n",
+ "\n",
+ "Differenz Schwerpunkt (Vektor):\n",
+ "Matrix([[-4.66e-10], [-2.91e-11], [-4.66e-10]])\n",
+ "Betrag der Schwerpunkt-Differenz:\n",
+ "0.000m\n"
+ ]
+ }
+ ],
+ "execution_count": 10
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-12-09T13:21:57.869927Z",
+ "start_time": "2025-12-09T13:21:57.831927Z"
+ }
+ },
+ "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": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{'100': Matrix([\n",
+ "[3794775.24129598],\n",
+ "[547003.784566026],\n",
+ "[5080016.88582709]]), '100016': Matrix([\n",
+ "[3794804.40667566],\n",
+ "[546789.942078133],\n",
+ "[5080079.63649543]]), '10003': Matrix([\n",
+ "[3794820.51175889],\n",
+ "[546738.121545569],\n",
+ "[5080085.66027136]]), '10004': Matrix([\n",
+ "[3794787.68039096],\n",
+ "[546724.355539902],\n",
+ "[5080122.57197924]]), '10005': Matrix([\n",
+ "[3794778.52744143],\n",
+ "[546733.440239574],\n",
+ "[5080127.82709672]]), '10006': Matrix([\n",
+ "[3794754.48961774],\n",
+ "[546723.992131817],\n",
+ "[ 5080154.6491784]]), '10007': Matrix([\n",
+ "[ 3794810.10603],\n",
+ "[546761.510609237],\n",
+ "[ 5080086.0020765]]), '10008': Matrix([\n",
+ "[3794768.08506589],\n",
+ "[546757.433496855],\n",
+ "[ 5080127.7145515]]), '10009': Matrix([\n",
+ "[3794753.66298807],\n",
+ "[546753.936763795],\n",
+ "[ 5080143.3866772]]), '10010': Matrix([\n",
+ "[3794744.05628981],\n",
+ "[546780.742811981],\n",
+ "[ 5080141.1636738]]), '10011': Matrix([\n",
+ "[3794820.53929209],\n",
+ "[546738.130781189],\n",
+ "[ 5080085.6893844]]), '10011a': Matrix([\n",
+ "[3794863.58049222],\n",
+ "[546820.559672293],\n",
+ "[5080009.68904121]]), '10012': Matrix([\n",
+ "[3794827.81056398],\n",
+ "[ 546801.06957277],\n",
+ "[ 5080052.2764653]]), '10013': Matrix([\n",
+ "[3794822.93179095],\n",
+ "[ 546821.6420314],\n",
+ "[5080048.14190298]]), '10014': Matrix([\n",
+ "[3794813.94866435],\n",
+ "[546809.911071387],\n",
+ "[5080061.83762516]]), '10015': Matrix([\n",
+ "[3794815.71134214],\n",
+ "[ 546792.41022388],\n",
+ "[5080067.67633712]]), '10017': Matrix([\n",
+ "[ 3794800.4139096],\n",
+ "[546829.880936662],\n",
+ "[5080066.46875977]]), '10018': Matrix([\n",
+ "[3794745.61855632],\n",
+ "[546808.043262064],\n",
+ "[5080128.60455588]]), '10019': Matrix([\n",
+ "[3794777.76781701],\n",
+ "[546835.162107796],\n",
+ "[5080085.96045632]]), '10020': Matrix([\n",
+ "[3794761.92015664],\n",
+ "[546838.977847251],\n",
+ "[5080100.04765691]]), '10021': Matrix([\n",
+ "[3794756.00797839],\n",
+ "[546839.303246531],\n",
+ "[5080105.58935921]]), '10022': Matrix([\n",
+ "[3794757.61562001],\n",
+ "[546846.316729031],\n",
+ "[5080100.89762826]]), '10023': Matrix([\n",
+ "[3794759.48549621],\n",
+ "[546851.850918009],\n",
+ "[5080096.94440005]]), '10024': Matrix([\n",
+ "[3794751.73730327],\n",
+ "[546861.360519194],\n",
+ "[ 5080100.294253]]), '10025': Matrix([\n",
+ "[3794752.15498749],\n",
+ "[546874.781453645],\n",
+ "[5080094.37790759]]), '10026': Matrix([\n",
+ "[3794736.30003562],\n",
+ "[546836.826883513],\n",
+ "[5080125.44708045]]), '10027': Matrix([\n",
+ "[3794736.96000806],\n",
+ "[546879.602518143],\n",
+ "[5080106.77720197]]), '10028': Matrix([\n",
+ "[3794854.42558972],\n",
+ "[546891.260466949],\n",
+ "[5079988.55485218]]), '10029': Matrix([\n",
+ "[3794813.64192358],\n",
+ "[546903.641106338],\n",
+ "[5080022.06775364]]), '10030': Matrix([\n",
+ "[3794814.74562118],\n",
+ "[546890.757518605],\n",
+ "[5080026.46489654]]), '10031': Matrix([\n",
+ "[3794794.79058969],\n",
+ "[ 546872.71612651],\n",
+ "[5080053.61063449]]), '10032': Matrix([\n",
+ "[3794781.55115635],\n",
+ "[546884.895506778],\n",
+ "[5080060.97408994]]), '10033': Matrix([\n",
+ "[3794775.28175346],\n",
+ "[546873.334968714],\n",
+ "[5080072.04785473]]), '10034': Matrix([\n",
+ "[3794847.88993759],\n",
+ "[546944.410223245],\n",
+ "[5079972.30963836]]), '10035': Matrix([\n",
+ "[3794811.83097489],\n",
+ "[546946.723835994],\n",
+ "[5080006.35848061]]), '10036': Matrix([\n",
+ "[3794783.39377131],\n",
+ "[546958.852789368],\n",
+ "[5080028.37568321]]), '10038': Matrix([\n",
+ "[3794777.81558632],\n",
+ "[546923.349922253],\n",
+ "[5080048.80883121]]), '10039': Matrix([\n",
+ "[3794776.73400961],\n",
+ "[546909.821579998],\n",
+ "[5080055.59246981]]), '10040': Matrix([\n",
+ "[3794753.10534012],\n",
+ "[546951.926584076],\n",
+ "[5080060.54410929]]), '10041': Matrix([\n",
+ "[3794752.59165627],\n",
+ "[546924.173873934],\n",
+ "[5080073.19205182]]), '10042': Matrix([\n",
+ "[ 3794734.5543882],\n",
+ "[546937.377006367],\n",
+ "[ 5080084.7094339]]), '10043': Matrix([\n",
+ "[3794725.01661161],\n",
+ "[546922.581244633],\n",
+ "[5080100.03703997]]), '10045': Matrix([\n",
+ "[3794840.94124498],\n",
+ "[546995.029310828],\n",
+ "[5079957.56668261]]), '10046': Matrix([\n",
+ "[3794809.35039725],\n",
+ "[546994.054056815],\n",
+ "[5079987.99204381]]), '10047': Matrix([\n",
+ "[ 3794795.4368399],\n",
+ "[547001.195960895],\n",
+ "[5079998.39175117]]), '10048': Matrix([\n",
+ "[3794775.20666754],\n",
+ "[ 547003.76019026],\n",
+ "[5080016.84921095]]), '10049': Matrix([\n",
+ "[ 3794755.2599089],\n",
+ "[547011.179377653],\n",
+ "[5080033.23331374]]), '10049a': Matrix([\n",
+ "[3794754.91370463],\n",
+ "[ 547010.69453884],\n",
+ "[5080033.75043702]]), '10050': Matrix([\n",
+ "[3794737.22036781],\n",
+ "[547005.884569236],\n",
+ "[ 5080052.9475627]]), '10051': Matrix([\n",
+ "[3794738.87891047],\n",
+ "[546983.860512271],\n",
+ "[5080060.85649738]]), '10052': Matrix([\n",
+ "[3794717.92069948],\n",
+ "[ 546983.44591806],\n",
+ "[5080081.08810058]]), '10053': Matrix([\n",
+ "[3794720.08539271],\n",
+ "[547013.409039769],\n",
+ "[ 5080066.3657566]]), '10054': Matrix([\n",
+ "[3794843.61283972],\n",
+ "[547056.002453676],\n",
+ "[5079929.24030295]]), '10055': Matrix([\n",
+ "[ 3794798.3440481],\n",
+ "[547058.886596772],\n",
+ "[5079971.04209003]]), '10056': Matrix([\n",
+ "[3794785.08794943],\n",
+ "[547072.889218702],\n",
+ "[5079977.73770134]]), '10057': Matrix([\n",
+ "[3794764.13960343],\n",
+ "[ 547061.72963122],\n",
+ "[5080002.94483388]]), '10058': Matrix([\n",
+ "[3794731.98341087],\n",
+ "[547079.121468109],\n",
+ "[5080026.61270465]]), '10059': Matrix([\n",
+ "[3794706.22500851],\n",
+ "[547072.229773112],\n",
+ "[5080054.43002136]])}\n"
+ ]
+ }
+ ],
+ "execution_count": 20
+ },
+ {
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2025-12-09T13:25:19.224013Z",
+ "start_time": "2025-12-09T13:25:19.204366Z"
+ }
+ },
+ "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": 24
}
],
"metadata": {
diff --git a/Daten/campusnetz_koordinaten_25_11.csv b/Daten/campusnetz_koordinaten_25_11.csv
deleted file mode 100644
index 6e3bace..0000000
--- a/Daten/campusnetz_koordinaten_25_11.csv
+++ /dev/null
@@ -1,53 +0,0 @@
-10009;1000,0000;2000,0000;100,0000;
-10006;1000,0000;2032,6863;99,5825;
-10010;1011,8143;1973,3252;99,9259;
-10018;1008,5759;1942,7620;100,2553;
-10008;979,7022;1991,4010;99,7320;
-10005;966,5154;2014,6496;99,7200;
-10003;908,4312;1996,1248;99,7403;
-10004;954,1536;2021,6822;99,4916;
-10007;921,7481;1973,6201;99,9176;
-10001;833,9439;1978,3737;99,8946;
-10002;875,9684;1998,5174;99,5867;
-100016;928,2783;1944,0082;100,0459;
-10011;908,4308;1996,1277;99,7822;
-10011a;844,9567;1891,1570;99,8117;
-10026;1020,0059;1913,8703;100,3059;
-10027;1016,9451;1866,2914;100,3251;
-10043;1031,2077;1822,4739;100,3035;
-10044;1025,9760;1782,4835;100,5461;
-10021;992,7607;1904,8854;100,3533;
-10020;984,6187;1903,3601;100,3423;
-10024;997,4831;1881,7862;100,3032;
-10025;996,3241;1866,8440;100,4102;
-10022;990,0679;1896,5360;100,2194;
-10023;987,3223;1889,8762;100,3430;
-10019;962,6387;1902,3565;99,9772;
-10033;964,0191;1860,8023;99,8551;
-10017;931,6761;1900,9945;99,9572;
-10052;1037,8750;1757,2999;100,2737;
-10042;1017,3489;1803,0742;100,3441;
-10053;1033,3758;1723,4258;100,2774;
-10037;966,2253;1774,2051;99,9957;
-10040;990,8832;1780,9678;100,1677;
-10041;993,2769;1812,0310;100,4749;
-10038;958,1899;1804,7135;100,0741;
-10051;1008,9811;1750,1838;100,2880;
-10036;948,6403;1763,5807;100,0063;
-10035;910,1265;1768,0099;100,0781;
-10039;960,3884;1820,0543;100,0983;
-10059;1049,2587;1662,5451;100,0148;
-10050;1010,0246;1726,2445;100,1493;
-10049;984,7667;1714,5709;100,0101;
-100;957,3912;1716,2864;99,7777;
-10013;900,9076;1902,8730;99,7911;
-10028;853,9608;1815,7417;99,7793;
-10012;895,3032;1924,1523;99,8758;
-10014;913,9706;1918,7731;99,8872;
-10031;937,1557;1855,2805;99,8479;
-10015;912,5157;1937,6471;99,9834;
-10032;954,6732;1845,9356;99,7240;
-10030;908,4749;1828,8008;99,5581;
-10029;909,3343;1814,8767;99,5486;
-10034;860,2357;1758,9282;99,7370;
-10045;867,2324;1705,0630;99,7214;
diff --git a/Datenbank.py b/Datenbank.py
index b6f9f70..2bdf1b0 100644
--- a/Datenbank.py
+++ b/Datenbank.py
@@ -32,11 +32,13 @@ class Datenbankzugriff:
def __init__(self, pfad_datenbank):
self.pfad_datenbank = pfad_datenbank
- def get_koordinaten(self, koordinatenart, ausgabeart = "Vektoren"):
+ def get_koordinaten(self, koordinatenart, ausgabeart = "Dict"):
con = sqlite3.connect(self.pfad_datenbank)
cursor = con.cursor()
if koordinatenart == "naeherung_lh":
values = "punktnummer, naeherungx_lh, naeherungy_lh, naeherungz_lh"
+ elif koordinatenart == "naeherung_us":
+ values = "punktnummer, naeherungx_us, naeherungy_us, naeherungz_us"
liste_koordinaten = cursor.execute(f"""
SELECT {values} FROM Netzpunkte;
@@ -44,9 +46,33 @@ class Datenbankzugriff:
cursor.close()
con.close()
- if ausgabeart == "Vektoren":
- liste_koordinaten_vektoren = []
- for koordinate in liste_koordinaten:
- liste_koordinaten_vektoren.append({koordinate[0]: sp.Matrix([float(koordinate[1]), float(koordinate[2]), float(koordinate[3])])})
- liste_koordinaten = liste_koordinaten_vektoren
- return liste_koordinaten
\ No newline at end of file
+ liste_koordinaten = [
+ koordinate for koordinate in liste_koordinaten
+ if koordinate[1] is not None and koordinate[2] is not None and koordinate[3] is not None
+ ]
+ if ausgabeart == "Dict":
+ return {koordinate[0]: sp.Matrix([float(koordinate[1]), float(koordinate[2]), float(koordinate[3])]) for koordinate in liste_koordinaten}
+
+ def set_koordinaten(self, dict_koordinaten, koordinatenart):
+ con = sqlite3.connect(self.pfad_datenbank)
+ cursor = con.cursor()
+
+ daten = []
+
+ for punktnummer, wert in dict_koordinaten.items():
+ daten.append((
+ float(wert[0]),
+ float(wert[1]),
+ float(wert[2]),
+ str(punktnummer)
+ ))
+
+ if koordinatenart == "naeherung_lh":
+ pass
+ elif koordinatenart == "naeherung_us":
+ cursor.executemany(f"""UPDATE Netzpunkte SET naeherungx_us = ?, naeherungy_us = ?, naeherungz_us = ? WHERE punktnummer = ? AND naeherungx_us IS NULL AND naeherungy_us IS NULL AND naeherungz_us IS NULL""", daten)
+
+
+ con.commit()
+ cursor.close()
+ con.close()
\ No newline at end of file
diff --git a/Koordinatentransformationen.py b/Koordinatentransformationen.py
new file mode 100644
index 0000000..d5c9932
--- /dev/null
+++ b/Koordinatentransformationen.py
@@ -0,0 +1,282 @@
+import sympy as sp
+from sympy.algebras.quaternion import Quaternion
+import Datenbank
+from itertools import combinations
+
+
+class Transformationen:
+ def __init__(self, pfad_datenbank):
+ self.pfad_datenbank = pfad_datenbank
+
+ @staticmethod
+ def R_matrix_aus_euler(e1, e2, e3):
+ return sp.Matrix([
+ [
+ sp.cos(e2) * sp.cos(e3),
+ sp.cos(e1) * sp.sin(e3) + sp.sin(e1) * sp.sin(e2) * sp.cos(e3),
+ sp.sin(e1) * sp.sin(e3) - sp.cos(e1) * sp.sin(e2) * sp.cos(e3)
+ ],
+ [
+ -sp.cos(e2) * sp.sin(e3),
+ sp.cos(e1) * sp.cos(e3) - sp.sin(e1) * sp.sin(e2) * sp.sin(e3),
+ sp.sin(e1) * sp.cos(e3) + sp.cos(e1) * sp.sin(e2) * sp.sin(e3)
+ ],
+ [
+ sp.sin(e2),
+ -sp.sin(e1) * sp.cos(e2),
+ sp.cos(e1) * sp.cos(e2)
+ ]
+ ])
+
+ def Helmerttransformation_Euler_Transformationsparameter_berechne(self):
+ db = Datenbank.Datenbankzugriff(self.pfad_datenbank)
+ dict_ausgangssystem = db.get_koordinaten("naeherung_lh", "Dict")
+ dict_zielsystem = db.get_koordinaten("naeherung_us", "Dict")
+
+ gemeinsame_punktnummern = sorted(set(dict_ausgangssystem.keys()) & set(dict_zielsystem.keys()))
+ anzahl_gemeinsame_punkte = len(gemeinsame_punktnummern)
+
+ liste_punkte_ausgangssystem = [dict_ausgangssystem[i] for i in gemeinsame_punktnummern]
+ liste_punkte_zielsystem = [dict_zielsystem[i] for i in gemeinsame_punktnummern]
+
+ print("Anzahl gemeinsame Punkte:", anzahl_gemeinsame_punkte)
+
+ print("\nErste Zielpunkte:")
+ for pn, P in list(zip(gemeinsame_punktnummern, liste_punkte_zielsystem))[:5]:
+ print(pn, [float(P[0]), float(P[1]), float(P[2])])
+
+ print("\nErste Ausgangspunkte:")
+ for pn, p in list(zip(gemeinsame_punktnummern, liste_punkte_ausgangssystem))[:5]:
+ print(pn, [float(p[0]), float(p[1]), float(p[2])])
+
+ # --- Näherungswerte (minimal erweitert) ---
+ p1, p2, p3 = liste_punkte_ausgangssystem[0], liste_punkte_ausgangssystem[1], liste_punkte_ausgangssystem[2]
+ P1, P2, P3 = liste_punkte_zielsystem[0], liste_punkte_zielsystem[1], liste_punkte_zielsystem[2]
+
+ # 1) Näherungswert Maßstab: Mittelwert aus allen Punktpaaren
+ ratios = []
+ for i, j in combinations(range(anzahl_gemeinsame_punkte), 2):
+ dp = (liste_punkte_ausgangssystem[j] - liste_punkte_ausgangssystem[i]).norm()
+ dP = (liste_punkte_zielsystem[j] - liste_punkte_zielsystem[i]).norm()
+ dp_f = float(dp)
+ if dp_f > 0:
+ ratios.append(float(dP) / dp_f)
+
+ m0 = sum(ratios) / len(ratios)
+
+ if ratios:
+ print("min/mean/max:",
+ min(ratios),
+ sum(ratios) / len(ratios),
+ max(ratios))
+
+ U = (P2 - P1) / (P2 - P1).norm()
+ W = (U.cross(P3 - P1)) / (U.cross(P3 - P1)).norm()
+ V = W.cross(U)
+
+ u = (p2 - p1) / (p2 - p1).norm()
+ w = (u.cross(p3 - p1)) / (u.cross(p3 - p1)).norm()
+ v = w.cross(u)
+
+ R0 = sp.Matrix.hstack(U, V, W) * sp.Matrix.hstack(u, v, w).T
+
+ XS = sum(liste_punkte_zielsystem, sp.Matrix([0, 0, 0])) / anzahl_gemeinsame_punkte
+ xS = sum(liste_punkte_ausgangssystem, sp.Matrix([0, 0, 0])) / anzahl_gemeinsame_punkte
+
+ Translation0 = XS - m0 * R0 * xS
+
+ # 2) Test auf orthonormale Drehmatrix bei 3 Nachkommastellen!
+ if R0.T.applyfunc(lambda x: round(float(x), 3)) == R0.inv().applyfunc(lambda x: round(float(x), 3)) \
+ and (R0.T * R0).applyfunc(lambda x: round(float(x), 3)) == sp.eye(3).applyfunc(
+ lambda x: round(float(x), 3)) \
+ and ((round(R0.det(), 3) == 1.000 or round(R0.det(), 3) == -1.000)):
+ print("R ist Orthonormal!")
+ else:
+ print("R ist nicht Orthonormal!")
+
+ # 3) Euler-Näherungswerte aus R0
+ e2_0 = sp.asin(R0[2, 0])
+ # Schutz gegen Division durch 0 wenn cos(e2) ~ 0:
+ cos_e2_0 = sp.cos(e2_0)
+
+ e1_0 = sp.acos(R0[2, 2] / cos_e2_0)
+ e3_0 = sp.acos(R0[0, 0] / cos_e2_0)
+
+ # --- Symbolische Unbekannte (klassische 7 Parameter) ---
+ dX, dY, dZ, m, e1, e2, e3 = sp.symbols('dX dY dZ m e1 e2 e3')
+ R_symbolisch = self.R_matrix_aus_euler(e1, e2, e3)
+
+ # 4) Funktionales Modell
+ f_zeilen = []
+ for punkt in liste_punkte_ausgangssystem:
+ punkt_vektor = sp.Matrix([punkt[0], punkt[1], punkt[2]])
+ f_zeile_i = sp.Matrix([dX, dY, dZ]) + m * R_symbolisch * punkt_vektor
+ f_zeilen.extend(list(f_zeile_i))
+
+ f_matrix = sp.Matrix(f_zeilen)
+ f = f_matrix
+
+ A_ohne_zahlen = f_matrix.jacobian([dX, dY, dZ, m, e1, e2, e3])
+
+ # Parameterschätzung
+ schwellenwert = 1e-4
+ anzahl_iterationen = 0
+ alle_kleiner_vorherige_iteration = False
+
+ l_vektor = sp.Matrix([koord for P in liste_punkte_zielsystem for koord in P])
+ l = l_vektor
+
+ P_mat = sp.eye(3 * anzahl_gemeinsame_punkte)
+ l_berechnet_0 = None
+
+ while True:
+ if anzahl_iterationen == 0:
+ zahlen_0 = {
+ dX: float(Translation0[0]),
+ dY: float(Translation0[1]),
+ dZ: float(Translation0[2]),
+ m: float(m0),
+ e1: float(e1_0),
+ e2: float(e2_0),
+ e3: float(e3_0)
+ }
+
+ x0 = sp.Matrix([zahlen_0[dX], zahlen_0[dY], zahlen_0[dZ],
+ zahlen_0[m], zahlen_0[e1], zahlen_0[e2], zahlen_0[e3]])
+
+ l_berechnet_0 = f.subs(zahlen_0).evalf(n=30)
+ dl_0 = l_vektor - l_berechnet_0
+
+ A_0 = A_ohne_zahlen.subs(zahlen_0).evalf(n=30)
+ N = A_0.T * P_mat * A_0
+ n_0 = A_0.T * P_mat * dl_0
+ Qxx_0 = N.inv()
+ dx = Qxx_0 * n_0
+ x = x0 + dx
+ x = sp.N(x, 30)
+
+ anzahl_iterationen += 1
+ print(f"Iteration Nr.{anzahl_iterationen} abgeschlossen")
+ print(dx.evalf(n=3))
+
+ else:
+ zahlen_i = {
+ dX: float(x[0]),
+ dY: float(x[1]),
+ dZ: float(x[2]),
+ m: float(x[3]),
+ e1: float(x[4]),
+ e2: float(x[5]),
+ e3: float(x[6])
+ }
+
+ l_berechnet_i = f.subs(zahlen_i).evalf(n=30)
+ dl_i = l_vektor - l_berechnet_i
+
+ A_i = A_ohne_zahlen.subs(zahlen_i).evalf(n=30)
+ N_i = A_i.T * P_mat * A_i
+ Qxx_i = N_i.inv()
+ n_i = A_i.T * P_mat * dl_i
+
+ dx = Qxx_i * n_i
+ x = sp.Matrix(x + dx)
+
+ anzahl_iterationen += 1
+ print(f"Iteration Nr.{anzahl_iterationen} abgeschlossen")
+ print(dx.evalf(n=3))
+
+ alle_kleiner = True
+ for i in range(dx.rows):
+ wert = float(dx[i])
+ if abs(wert) > schwellenwert:
+ alle_kleiner = False
+
+ if (alle_kleiner and alle_kleiner_vorherige_iteration) or anzahl_iterationen == 100:
+ break
+
+ alle_kleiner_vorherige_iteration = alle_kleiner
+
+ print(l.evalf(n=3))
+ print(l_berechnet_0.evalf(n=3))
+ print(f"x = {x.evalf(n=3)}")
+
+ # --- Neuberechnung Zielsystem ---
+ zahlen_final = {
+ dX: float(x[0]),
+ dY: float(x[1]),
+ dZ: float(x[2]),
+ m: float(x[3]),
+ e1: float(x[4]),
+ e2: float(x[5]),
+ e3: float(x[6])
+ }
+
+ l_berechnet_final = f.subs(zahlen_final).evalf(n=30)
+
+ liste_l_berechnet_final = []
+ for i in range(anzahl_gemeinsame_punkte):
+ Xi = l_berechnet_final[3 * i + 0]
+ Yi = l_berechnet_final[3 * i + 1]
+ Zi = l_berechnet_final[3 * i + 2]
+ liste_l_berechnet_final.append(sp.Matrix([Xi, Yi, Zi]))
+
+ print("")
+ print("l_berechnet_final:")
+ for punktnummer, l_fin in zip(gemeinsame_punktnummern, liste_l_berechnet_final):
+ print(f"{punktnummer}: {float(l_fin[0]):.3f}, {float(l_fin[1]):.3f}, {float(l_fin[2]):.3f}")
+
+ print("Streckendifferenzen:")
+ streckendifferenzen = [
+ (punkt_zielsys - l_final).norm()
+ for punkt_zielsys, l_final in zip(liste_punkte_zielsystem, liste_l_berechnet_final)
+ ]
+ print([round(float(s), 6) for s in streckendifferenzen])
+
+ Schwerpunkt_Zielsystem = sum(liste_punkte_zielsystem, sp.Matrix([0, 0, 0])) / anzahl_gemeinsame_punkte
+ Schwerpunkt_berechnet = sum(liste_l_berechnet_final, sp.Matrix([0, 0, 0])) / anzahl_gemeinsame_punkte
+
+ Schwerpunktsdifferenz = Schwerpunkt_Zielsystem - Schwerpunkt_berechnet
+
+ print("\nDifferenz Schwerpunkt (Vektor):")
+ print(Schwerpunktsdifferenz.evalf(3))
+
+ print("Betrag der Schwerpunkt-Differenz:")
+ print(f"{float(Schwerpunktsdifferenz.norm()):.3f}m")
+
+ return zahlen_final
+
+ def Helmerttransformation(self, transformationsparameter):
+ db = Datenbank.Datenbankzugriff(self.pfad_datenbank)
+ dict_ausgangssystem = db.get_koordinaten("naeherung_lh", "Dict")
+ dict_zielsystem = db.get_koordinaten("naeherung_us", "Dict")
+
+ dX, dY, dZ, m, e1, e2, e3 = sp.symbols('dX dY dZ m e1 e2 e3')
+
+ unterschiedliche_punktnummern = sorted(set(dict_ausgangssystem.keys()) ^ set(dict_zielsystem.keys()))
+ punktnummern_transformieren = [
+ punktnummer for punktnummer in unterschiedliche_punktnummern if punktnummer in dict_ausgangssystem
+ ]
+ liste_punkte_ausgangssystem = [dict_ausgangssystem[punktnummer] for punktnummer in punktnummern_transformieren]
+
+ R = self.R_matrix_aus_euler(transformationsparameter[e1], transformationsparameter[e2], transformationsparameter[e3])
+
+ f_zeilen = []
+ for punkt in liste_punkte_ausgangssystem:
+ punkt_vektor = sp.Matrix([punkt[0], punkt[1], punkt[2]])
+ f_zeile_i = sp.Matrix([transformationsparameter[dX], transformationsparameter[dY], transformationsparameter[dZ]]) + transformationsparameter[m] * R * punkt_vektor
+ f_zeilen.extend(list(f_zeile_i))
+
+ f_matrix = sp.Matrix(f_zeilen)
+ dict_transformiert = {}
+ for i, pn in enumerate(punktnummern_transformieren):
+ Xi = f_matrix[3 * i + 0]
+ Yi = f_matrix[3 * i + 1]
+ Zi = f_matrix[3 * i + 2]
+
+ dict_transformiert[str(pn)] = sp.Matrix([
+ [float(Xi)],
+ [float(Yi)],
+ [float(Zi)]
+ ])
+ return dict_transformiert
+
diff --git a/Vorbereitungen_Fabian/Müll/Helmert_Quaternionen_Müll.py b/Vorbereitungen_Fabian/Müll/Helmert_Quaternionen_Müll.py
new file mode 100644
index 0000000..51d4a78
--- /dev/null
+++ b/Vorbereitungen_Fabian/Müll/Helmert_Quaternionen_Müll.py
@@ -0,0 +1,208 @@
+@staticmethod
+def R_matrix_aus_quaternion(q0, q1, q2, q3):
+ return sp.Matrix([
+ [1 - 2 * (q2 ** 2 + q3 ** 2), 2 * (q1 * q2 - q0 * q3), 2 * (q0 * q2 + q1 * q3)],
+ [2 * (q1 * q2 + q0 * q3), 1 - 2 * (q1 ** 2 + q3 ** 2), 2 * (q2 * q3 - q0 * q1)],
+ [2 * (q1 * q3 - q0 * q2), 2 * (q0 * q1 + q2 * q3), 1 - 2 * (q1 ** 2 + q2 ** 2)]
+ ])
+
+
+def Helmerttransformation_Quaternionen(self):
+ db = Datenbank.Datenbankzugriff(self.pfad_datenbank)
+ dict_ausgangssystem = db.get_koordinaten("naeherung_lh", "Dict")
+ dict_zielsystem = db.get_koordinaten("naeherung_us", "Dict")
+
+ gemeinsame_punktnummern = sorted(set(dict_ausgangssystem.keys()) & set(dict_zielsystem.keys()))
+ anzahl_gemeinsame_punkte = len(gemeinsame_punktnummern)
+
+ liste_punkte_ausgangssystem = [dict_ausgangssystem[i] for i in gemeinsame_punktnummern]
+ liste_punkte_zielsystem = [dict_zielsystem[i] for i in gemeinsame_punktnummern]
+
+ print("Anzahl gemeinsame Punkte:", anzahl_gemeinsame_punkte)
+
+ print("\nErste Zielpunkte:")
+ for pn, P in list(zip(gemeinsame_punktnummern, liste_punkte_zielsystem))[:5]:
+ print(pn, [float(P[0]), float(P[1]), float(P[2])])
+
+ print("\nErste Ausgangspunkte:")
+ for pn, p in list(zip(gemeinsame_punktnummern, liste_punkte_ausgangssystem))[:5]:
+ print(pn, [float(p[0]), float(p[1]), float(p[2])])
+
+ # ToDo: Achtung: Die Ergebnisse sind leicht anders, als in den Beispielrechnung von Luhmann (Rundungsfehler bei Luhmann?)
+ # ToDo: Automatische Ermittlung der Anzahl Nachkommastellen für Test auf Orthonormalität integrieren!
+ p1, p2, p3 = liste_punkte_ausgangssystem[0], liste_punkte_ausgangssystem[1], liste_punkte_ausgangssystem[2]
+ P1, P2, P3 = liste_punkte_zielsystem[0], liste_punkte_zielsystem[1], liste_punkte_zielsystem[2]
+
+ # 1) Näherungswertberechnung
+ m0 = (P2 - P1).norm() / (p2 - p1).norm()
+
+ U = (P2 - P1) / (P2 - P1).norm()
+ W = (U.cross(P3 - P1)) / (U.cross(P3 - P1)).norm()
+ V = W.cross(U)
+
+ u = (p2 - p1) / (p2 - p1).norm()
+ w = (u.cross(p3 - p1)) / (u.cross(p3 - p1)).norm()
+ v = w.cross(u)
+
+ R = sp.Matrix.hstack(U, V, W) * sp.Matrix.hstack(u, v, w).T
+
+ XS = (P1 + P2 + P3) / 3
+ xS = (p1 + p2 + p3) / 3
+
+ Translation = XS - m0 * R * xS
+
+ # 2) Test auf orthonormale Drehmatrix bei 3 Nachkommastellen!
+ if R.T.applyfunc(lambda x: round(float(x), 3)) == R.inv().applyfunc(lambda x: round(float(x), 3)) and (
+ R.T * R).applyfunc(lambda x: round(float(x), 3)) == sp.eye(3).applyfunc(lambda x: round(float(x), 3)) and (
+ (round(R.det(), 3) == 1.000 or round(R.det(), 3) == -1.000)):
+ print("R ist Orthonormal!")
+ else:
+ print("R ist nicht Orthonormal!")
+
+ # 3) Quaternionen berechnen
+ # ToDo: Prüfen, ob Vorzeichen bei q0 richtig ist!
+ # ToDo: q0 stimmt nicht mit Luhmann überein!
+
+ q = Quaternion.from_rotation_matrix(R)
+ q0_wert = q.a
+ q1_wert = q.b
+ q2_wert = q.c
+ q3_wert = q.d
+
+ dX, dY, dZ, m, q0, q1, q2, q3 = sp.symbols('dX dY dZ m q0 q1 q2 q3')
+ R_symbolisch = self.R_matrix_aus_quaternion(q0, q1, q2, q3)
+
+ # 4) Funktionales Modell
+ f_zeilen = []
+ for punkt in liste_punkte_ausgangssystem:
+ punkt_vektor = sp.Matrix([punkt[0], punkt[1], punkt[2]])
+ f_zeile_i = sp.Matrix([dX, dY, dZ]) + m * R_symbolisch * punkt_vektor
+ f_zeilen.extend(list(f_zeile_i))
+
+ f_matrix = sp.Matrix(f_zeilen)
+ f = f_matrix
+
+ A_ohne_zahlen = f_matrix.jacobian([dX, dY, dZ, m, q0, q1, q2, q3])
+
+ # Parameterschätzung
+ schwellenwert = 1e-4
+ anzahl_iterationen = 0
+ alle_kleiner_vorherige_iteration = False
+
+ l_vektor = sp.Matrix([koord for P in liste_punkte_zielsystem for koord in P])
+ l = l_vektor
+
+ P = sp.eye(3 * anzahl_gemeinsame_punkte)
+ l_berechnet_0 = None
+
+ while True:
+ if anzahl_iterationen == 0:
+ zahlen_0 = {dX: float(Translation[0]), dY: float(Translation[1]), dZ: float(Translation[2]), m: float(m0),
+ q0: float(q0_wert), q1: float(q1_wert),
+ q2: float(q2_wert),
+ q3: float(q3_wert)}
+ x0 = sp.Matrix(
+ [zahlen_0[dX], zahlen_0[dY], zahlen_0[dZ], zahlen_0[m], zahlen_0[q0], zahlen_0[q1], zahlen_0[q2],
+ zahlen_0[q3]])
+ l_berechnet_0 = f.subs(zahlen_0).evalf(n=30)
+ dl_0 = l_vektor - l_berechnet_0
+
+ A_0 = A_ohne_zahlen.subs(zahlen_0).evalf(n=30)
+ N = A_0.T * P * A_0
+ n_0 = A_0.T * P * dl_0
+ Qxx_0 = N.inv()
+ dx = Qxx_0 * n_0
+ x = x0 + dx
+ x = sp.N(x, 30) # 30 Nachkommastellen
+ q_norm = sp.sqrt(x[4] ** 2 + x[5] ** 2 + x[6] ** 2 + x[7] ** 2)
+ x = sp.Matrix(x)
+ x[4] /= q_norm
+ x[5] /= q_norm
+ x[6] /= q_norm
+ x[7] /= q_norm
+ anzahl_iterationen += 1
+ print(f"Iteration Nr.{anzahl_iterationen} abgeschlossen")
+ print(dx.evalf(n=3))
+
+ else:
+ zahlen_i = {dX: float(x[0]), dY: float(x[1]), dZ: float(x[2]), m: float(x[3]), q0: float(x[4]),
+ q1: float(x[5]),
+ q2: float(x[6]),
+ q3: float(x[7])}
+ l_berechnet_i = f.subs(zahlen_i).evalf(n=30)
+ dl_i = l_vektor - l_berechnet_i
+ A_i = A_ohne_zahlen.subs(zahlen_i).evalf(n=30)
+ N_i = A_i.T * P * A_i
+ Qxx_i = N_i.inv()
+ n_i = A_i.T * P * dl_i
+ dx = Qxx_i * n_i
+ x = sp.Matrix(x + dx)
+ q_norm = sp.sqrt(x[4] ** 2 + x[5] ** 2 + x[6] ** 2 + x[7] ** 2)
+ x[4] /= q_norm
+ x[5] /= q_norm
+ x[6] /= q_norm
+ x[7] /= q_norm
+ anzahl_iterationen += 1
+ print(f"Iteration Nr.{anzahl_iterationen} abgeschlossen")
+ print(dx.evalf(n=3))
+
+ alle_kleiner = True
+ for i in range(dx.rows):
+ wert = float(dx[i])
+ if abs(wert) > schwellenwert:
+ alle_kleiner = False
+
+ if alle_kleiner and alle_kleiner_vorherige_iteration or anzahl_iterationen == 100:
+ break
+
+ alle_kleiner_vorherige_iteration = alle_kleiner
+
+ print(l.evalf(n=3))
+ print(l_berechnet_0.evalf(n=3))
+ print(f"x = {x.evalf(n=3)}")
+
+ # Neuberechnung Zielsystem
+ zahlen_final = {
+ dX: float(x[0]),
+ dY: float(x[1]),
+ dZ: float(x[2]),
+ m: float(x[3]),
+ q0: float(x[4]),
+ q1: float(x[5]),
+ q2: float(x[6]),
+ q3: float(x[7])
+ }
+
+ l_berechnet_final = f.subs(zahlen_final).evalf(n=30)
+
+ liste_l_berechnet_final = []
+ for i in range(anzahl_gemeinsame_punkte):
+ Xi = l_berechnet_final[3 * i + 0]
+ Yi = l_berechnet_final[3 * i + 1]
+ Zi = l_berechnet_final[3 * i + 2]
+ liste_l_berechnet_final.append(sp.Matrix([Xi, Yi, Zi]))
+
+ print("")
+ print("l_berechnet_final:")
+ for punktnummer, l_fin in zip(gemeinsame_punktnummern, liste_l_berechnet_final):
+ print(f"{punktnummer}: {float(l_fin[0]):.3f}, {float(l_fin[1]):.3f}, {float(l_fin[2]):.3f}")
+
+ print("Streckendifferenzen:")
+ streckendifferenzen = [
+ (punkt_zielsys - l_final).norm()
+ for punkt_zielsys, l_final in zip(liste_punkte_zielsystem, liste_l_berechnet_final)
+ ]
+ print([round(float(s), 6) for s in streckendifferenzen])
+
+ Schwerpunkt_Zielsystem = sum(liste_punkte_zielsystem, sp.Matrix([0, 0, 0])) / anzahl_gemeinsame_punkte
+ Schwerpunkt_berechnet = sum(liste_l_berechnet_final, sp.Matrix([0, 0, 0])) / anzahl_gemeinsame_punkte
+
+ Schwerpunktsdifferenz = Schwerpunkt_Zielsystem - Schwerpunkt_berechnet
+
+ print("\nDifferenz Schwerpunkt (Vektor):")
+ print(Schwerpunktsdifferenz.evalf(3))
+
+ print("Betrag der Schwerpunkt-Differenz:")
+ print(f"{float(Schwerpunktsdifferenz.norm()):.3f}m")
+
+ # ToDo: Abweichungen in Printausgabe ausgeben!
diff --git a/Vorbereitungen_Fabian/Transformation_Helmert_V3_final.py b/Vorbereitungen_Fabian/Transformation_Helmert_V3_final.py
index 04772d5..7420154 100644
--- a/Vorbereitungen_Fabian/Transformation_Helmert_V3_final.py
+++ b/Vorbereitungen_Fabian/Transformation_Helmert_V3_final.py
@@ -265,4 +265,218 @@ print(Schwerpunktsdifferenz.evalf(3))
print("Betrag der Schwerpunkt-Differenz:")
print(f"{float(Schwerpunktsdifferenz.norm()):.3f}m")
-#ToDo: Abweichungen in Printausgabe ausgeben!
\ No newline at end of file
+#ToDo: Abweichungen in Printausgabe ausgeben!
+
+def Helmerttransformation_Euler(self):
+ db = Datenbank.Datenbankzugriff(self.pfad_datenbank)
+ dict_ausgangssystem = db.get_koordinaten("naeherung_lh", "Dict")
+ dict_zielsystem = db.get_koordinaten("naeherung_us", "Dict")
+
+ gemeinsame_punktnummern = sorted(set(dict_ausgangssystem.keys()) & set(dict_zielsystem.keys()))
+ anzahl_gemeinsame_punkte = len(gemeinsame_punktnummern)
+
+ liste_punkte_ausgangssystem = [dict_ausgangssystem[i] for i in gemeinsame_punktnummern]
+ liste_punkte_zielsystem = [dict_zielsystem[i] for i in gemeinsame_punktnummern]
+
+ print("Anzahl gemeinsame Punkte:", anzahl_gemeinsame_punkte)
+
+ print("\nErste Zielpunkte:")
+ for pn, P in list(zip(gemeinsame_punktnummern, liste_punkte_zielsystem))[:5]:
+ print(pn, [float(P[0]), float(P[1]), float(P[2])])
+
+ print("\nErste Ausgangspunkte:")
+ for pn, p in list(zip(gemeinsame_punktnummern, liste_punkte_ausgangssystem))[:5]:
+ print(pn, [float(p[0]), float(p[1]), float(p[2])])
+
+ # --- Näherungswerte (minimal erweitert) ---
+ p1, p2, p3 = liste_punkte_ausgangssystem[0], liste_punkte_ausgangssystem[1], liste_punkte_ausgangssystem[2]
+ P1, P2, P3 = liste_punkte_zielsystem[0], liste_punkte_zielsystem[1], liste_punkte_zielsystem[2]
+
+ # 1) Näherungswert Maßstab: Mittelwert aus allen Punktpaaren
+ ratios = []
+ for i, j in combinations(range(anzahl_gemeinsame_punkte), 2):
+ dp = (liste_punkte_ausgangssystem[j] - liste_punkte_ausgangssystem[i]).norm()
+ dP = (liste_punkte_zielsystem[j] - liste_punkte_zielsystem[i]).norm()
+ dp_f = float(dp)
+ if dp_f > 0:
+ ratios.append(float(dP) / dp_f)
+
+ m0 = sum(ratios) / len(ratios)
+
+ if ratios:
+ print("min/mean/max:",
+ min(ratios),
+ sum(ratios) / len(ratios),
+ max(ratios))
+
+ U = (P2 - P1) / (P2 - P1).norm()
+ W = (U.cross(P3 - P1)) / (U.cross(P3 - P1)).norm()
+ V = W.cross(U)
+
+ u = (p2 - p1) / (p2 - p1).norm()
+ w = (u.cross(p3 - p1)) / (u.cross(p3 - p1)).norm()
+ v = w.cross(u)
+
+ R0 = sp.Matrix.hstack(U, V, W) * sp.Matrix.hstack(u, v, w).T
+
+ XS = sum(liste_punkte_zielsystem, sp.Matrix([0, 0, 0])) / anzahl_gemeinsame_punkte
+ xS = sum(liste_punkte_ausgangssystem, sp.Matrix([0, 0, 0])) / anzahl_gemeinsame_punkte
+
+ Translation0 = XS - m0 * R0 * xS
+
+ # 2) Test auf orthonormale Drehmatrix bei 3 Nachkommastellen!
+ if R0.T.applyfunc(lambda x: round(float(x), 3)) == R0.inv().applyfunc(lambda x: round(float(x), 3)) \
+ and (R0.T * R0).applyfunc(lambda x: round(float(x), 3)) == sp.eye(3).applyfunc(lambda x: round(float(x), 3)) \
+ and ((round(R0.det(), 3) == 1.000 or round(R0.det(), 3) == -1.000)):
+ print("R ist Orthonormal!")
+ else:
+ print("R ist nicht Orthonormal!")
+
+ # 3) Euler-Näherungswerte aus R0
+ e2_0 = sp.asin(R0[2, 0])
+ # Schutz gegen Division durch 0 wenn cos(e2) ~ 0:
+ cos_e2_0 = sp.cos(e2_0)
+
+ e1_0 = sp.acos(R0[2, 2] / cos_e2_0)
+ e3_0 = sp.acos(R0[0, 0] / cos_e2_0)
+
+ # --- Symbolische Unbekannte (klassische 7 Parameter) ---
+ dX, dY, dZ, m, e1, e2, e3 = sp.symbols('dX dY dZ m e1 e2 e3')
+ R_symbolisch = self.R_matrix_aus_euler(e1, e2, e3)
+
+ # 4) Funktionales Modell
+ f_zeilen = []
+ for punkt in liste_punkte_ausgangssystem:
+ punkt_vektor = sp.Matrix([punkt[0], punkt[1], punkt[2]])
+ f_zeile_i = sp.Matrix([dX, dY, dZ]) + m * R_symbolisch * punkt_vektor
+ f_zeilen.extend(list(f_zeile_i))
+
+ f_matrix = sp.Matrix(f_zeilen)
+ f = f_matrix
+
+ A_ohne_zahlen = f_matrix.jacobian([dX, dY, dZ, m, e1, e2, e3])
+
+ # Parameterschätzung
+ schwellenwert = 1e-4
+ anzahl_iterationen = 0
+ alle_kleiner_vorherige_iteration = False
+
+ l_vektor = sp.Matrix([koord for P in liste_punkte_zielsystem for koord in P])
+ l = l_vektor
+
+ P_mat = sp.eye(3 * anzahl_gemeinsame_punkte)
+ l_berechnet_0 = None
+
+ while True:
+ if anzahl_iterationen == 0:
+ zahlen_0 = {
+ dX: float(Translation0[0]),
+ dY: float(Translation0[1]),
+ dZ: float(Translation0[2]),
+ m: float(m0),
+ e1: float(e1_0),
+ e2: float(e2_0),
+ e3: float(e3_0)
+ }
+
+ x0 = sp.Matrix([zahlen_0[dX], zahlen_0[dY], zahlen_0[dZ],
+ zahlen_0[m], zahlen_0[e1], zahlen_0[e2], zahlen_0[e3]])
+
+ l_berechnet_0 = f.subs(zahlen_0).evalf(n=30)
+ dl_0 = l_vektor - l_berechnet_0
+
+ A_0 = A_ohne_zahlen.subs(zahlen_0).evalf(n=30)
+ N = A_0.T * P_mat * A_0
+ n_0 = A_0.T * P_mat * dl_0
+ Qxx_0 = N.inv()
+ dx = Qxx_0 * n_0
+ x = x0 + dx
+ x = sp.N(x, 30)
+
+ anzahl_iterationen += 1
+ print(f"Iteration Nr.{anzahl_iterationen} abgeschlossen")
+ print(dx.evalf(n=3))
+
+ else:
+ zahlen_i = {
+ dX: float(x[0]),
+ dY: float(x[1]),
+ dZ: float(x[2]),
+ m: float(x[3]),
+ e1: float(x[4]),
+ e2: float(x[5]),
+ e3: float(x[6])
+ }
+
+ l_berechnet_i = f.subs(zahlen_i).evalf(n=30)
+ dl_i = l_vektor - l_berechnet_i
+
+ A_i = A_ohne_zahlen.subs(zahlen_i).evalf(n=30)
+ N_i = A_i.T * P_mat * A_i
+ Qxx_i = N_i.inv()
+ n_i = A_i.T * P_mat * dl_i
+
+ dx = Qxx_i * n_i
+ x = sp.Matrix(x + dx)
+
+ anzahl_iterationen += 1
+ print(f"Iteration Nr.{anzahl_iterationen} abgeschlossen")
+ print(dx.evalf(n=3))
+
+ alle_kleiner = True
+ for i in range(dx.rows):
+ wert = float(dx[i])
+ if abs(wert) > schwellenwert:
+ alle_kleiner = False
+
+ if (alle_kleiner and alle_kleiner_vorherige_iteration) or anzahl_iterationen == 100:
+ break
+
+ alle_kleiner_vorherige_iteration = alle_kleiner
+
+ print(l.evalf(n=3))
+ print(l_berechnet_0.evalf(n=3))
+ print(f"x = {x.evalf(n=3)}")
+
+ # --- Neuberechnung Zielsystem ---
+ zahlen_final = {
+ dX: float(x[0]),
+ dY: float(x[1]),
+ dZ: float(x[2]),
+ m: float(x[3]),
+ e1: float(x[4]),
+ e2: float(x[5]),
+ e3: float(x[6])
+ }
+
+ l_berechnet_final = f.subs(zahlen_final).evalf(n=30)
+
+ liste_l_berechnet_final = []
+ for i in range(anzahl_gemeinsame_punkte):
+ Xi = l_berechnet_final[3 * i + 0]
+ Yi = l_berechnet_final[3 * i + 1]
+ Zi = l_berechnet_final[3 * i + 2]
+ liste_l_berechnet_final.append(sp.Matrix([Xi, Yi, Zi]))
+
+ print("")
+ print("l_berechnet_final:")
+ for punktnummer, l_fin in zip(gemeinsame_punktnummern, liste_l_berechnet_final):
+ print(f"{punktnummer}: {float(l_fin[0]):.3f}, {float(l_fin[1]):.3f}, {float(l_fin[2]):.3f}")
+
+ print("Streckendifferenzen:")
+ streckendifferenzen = [
+ (punkt_zielsys - l_final).norm()
+ for punkt_zielsys, l_final in zip(liste_punkte_zielsystem, liste_l_berechnet_final)
+ ]
+ print([round(float(s), 6) for s in streckendifferenzen])
+
+ Schwerpunkt_Zielsystem = sum(liste_punkte_zielsystem, sp.Matrix([0, 0, 0])) / anzahl_gemeinsame_punkte
+ Schwerpunkt_berechnet = sum(liste_l_berechnet_final, sp.Matrix([0, 0, 0])) / anzahl_gemeinsame_punkte
+
+ Schwerpunktsdifferenz = Schwerpunkt_Zielsystem - Schwerpunkt_berechnet
+
+ print("\nDifferenz Schwerpunkt (Vektor):")
+ print(Schwerpunktsdifferenz.evalf(3))
+
+ print("Betrag der Schwerpunkt-Differenz:")
+ print(f"{float(Schwerpunktsdifferenz.norm()):.3f}m")
\ No newline at end of file