|
@@ -0,0 +1,344 @@
|
|
1
|
+import os
|
|
2
|
+import sqlite3
|
|
3
|
+import math
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+def calculate_absolute_height_differences(db_path, file_name, field_name):
|
|
7
|
+ """
|
|
8
|
+ 从数据库指定表中读取所有记录的字段,并计算其绝对值。
|
|
9
|
+ """
|
|
10
|
+ abs_values = []
|
|
11
|
+ with sqlite3.connect(db_path) as conn:
|
|
12
|
+ cursor = conn.cursor()
|
|
13
|
+ query = f"SELECT {field_name} FROM GC_Input_Point WHERE TableName = ?"
|
|
14
|
+ cursor.execute(query, (file_name,))
|
|
15
|
+ for row in cursor.fetchall():
|
|
16
|
+ # 检查是否为 None,如果是,则停止读取
|
|
17
|
+ if row[0] is None:
|
|
18
|
+ continue # 停止读取
|
|
19
|
+ else:
|
|
20
|
+ abs_value = abs(row[0])
|
|
21
|
+ abs_values.append(abs_value)
|
|
22
|
+ return abs_values
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+# 获取上期稳定测段
|
|
26
|
+def get_last_stable_section(values):
|
|
27
|
+ last_stable_section = sum(values)
|
|
28
|
+ return last_stable_section
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+# 获取本期稳定测段
|
|
32
|
+def get_current_stable_section(abs_new_hdiffs, length_of_last_section):
|
|
33
|
+ current_stable_section = sum(abs_new_hdiffs[:length_of_last_section])
|
|
34
|
+ return current_stable_section
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+# 获取较差
|
|
38
|
+def calculate_differences(abs_last_hdiffs, abs_new_hdiffs):
|
|
39
|
+ differences = [(last - new) * 1000 for last, new in zip(abs_last_hdiffs, abs_new_hdiffs[:len(abs_last_hdiffs)])]
|
|
40
|
+ return differences
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+# 稳定测段的较差
|
|
44
|
+def calculate_stable_differences(last_stable_section, current_stable_section):
|
|
45
|
+ stable_differences = (current_stable_section - last_stable_section) * 1000
|
|
46
|
+ return stable_differences
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+# 获取限值 total=True获取总路线长的限值 total=False获取单个测量点的限值 默认为False
|
|
50
|
+def calculate_limits(db_path, file_name, total=False):
|
|
51
|
+ try:
|
|
52
|
+ with sqlite3.connect(db_path) as conn:
|
|
53
|
+ cursor = conn.cursor()
|
|
54
|
+ query_last_rlen = "SELECT Last_RLen FROM GC_Input_Point WHERE TableName = ?"
|
|
55
|
+ query_new_rlen = "SELECT New_RLen FROM GC_Input_Point WHERE TableName = ?"
|
|
56
|
+ cursor.execute(query_last_rlen, (file_name,))
|
|
57
|
+ last_rlens = []
|
|
58
|
+ for row in cursor.fetchall():
|
|
59
|
+ if row[0] is None:
|
|
60
|
+ continue
|
|
61
|
+ last_rlens.append(row[0])
|
|
62
|
+ cursor.execute(query_new_rlen, (file_name,))
|
|
63
|
+ new_rlens = []
|
|
64
|
+ for row in cursor.fetchall():
|
|
65
|
+ if row[0] is None:
|
|
66
|
+ continue
|
|
67
|
+ new_rlens.append(row[0])
|
|
68
|
+ if not total:
|
|
69
|
+ # 计算单个测量点的限值
|
|
70
|
+ limit_values = []
|
|
71
|
+ for last_rlen, new_rlen in zip(last_rlens, new_rlens):
|
|
72
|
+ if last_rlen is None:
|
|
73
|
+ break
|
|
74
|
+ calculated_value = 2 * math.sqrt(last_rlen + new_rlen)
|
|
75
|
+ if calculated_value < 0.47:
|
|
76
|
+ limit_values.append(0.47)
|
|
77
|
+ else:
|
|
78
|
+ limit_values.append(calculated_value)
|
|
79
|
+ return limit_values
|
|
80
|
+ else:
|
|
81
|
+ # 计算总路线长的限值
|
|
82
|
+ total_last_rlen = sum([rlen for rlen in last_rlens if rlen is not None])
|
|
83
|
+ total_new_rlen = sum(new_rlens[:len(last_rlens)])
|
|
84
|
+ calculated_value = 2 * math.sqrt(total_last_rlen + total_new_rlen)
|
|
85
|
+ if calculated_value < 0.47:
|
|
86
|
+ total_limit = 0.47
|
|
87
|
+ else:
|
|
88
|
+ total_limit = calculated_value
|
|
89
|
+ return total_limit
|
|
90
|
+ except sqlite3.Error as e:
|
|
91
|
+ print(f"Database error: {e}")
|
|
92
|
+ return []
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+# 高程较差的变形判定 变形的位置存储为 "变形",未变形的位置存储为 None
|
|
96
|
+def detect_deformation(differences, limit_values):
|
|
97
|
+ deformation_results = [None] * len(differences)
|
|
98
|
+ for i, diff in enumerate(differences):
|
|
99
|
+ if abs(diff) > limit_values[i]:
|
|
100
|
+ deformation_results[i] = "变形"
|
|
101
|
+ return deformation_results
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+# 第一次稳定分析
|
|
105
|
+def calculate_corrected_old_height_difference(abs_last_hdiffs, transformation_point):
|
|
106
|
+ # 上期改正高差
|
|
107
|
+ corrected_sum = 0.0
|
|
108
|
+ for i, value in enumerate(abs_last_hdiffs):
|
|
109
|
+ if transformation_point[i] != "变形":
|
|
110
|
+ corrected_sum += value
|
|
111
|
+ return corrected_sum
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+def calculate_corrected_new_height_difference(abs_new_hdiffs, transformation_point, abs_last_hdiffs):
|
|
115
|
+ # 本期改正高差
|
|
116
|
+ n = len(abs_last_hdiffs) # 使用 abs_last_hdiffs 的长度作为限制
|
|
117
|
+ corrected_sum = 0.0
|
|
118
|
+ for i in range(n):
|
|
119
|
+ if transformation_point[i] != "变形":
|
|
120
|
+ corrected_sum += abs_new_hdiffs[i]
|
|
121
|
+ return corrected_sum
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+def calculate_corrected_height_differences(abs_new_hdiffs, corrected_sum_last, corrected_sum_new):
|
|
125
|
+ # 改正高差绝对值
|
|
126
|
+ n = len(abs_new_hdiffs)
|
|
127
|
+ corrected_height_differences = []
|
|
128
|
+ for i in range(n):
|
|
129
|
+ corrected_value = abs_new_hdiffs[i] * (corrected_sum_last / corrected_sum_new)
|
|
130
|
+ corrected_height_differences.append(corrected_value)
|
|
131
|
+ return corrected_height_differences
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+def detect_corrected_deformation(corrected_height_differences, abs_last_hdiffs, limit_values):
|
|
135
|
+ # 变形判定
|
|
136
|
+ deformation_results = [None] * len(corrected_height_differences)
|
|
137
|
+ for i in range(min(len(corrected_height_differences), len(limit_values))):
|
|
138
|
+ difference = abs((corrected_height_differences[i] - abs_last_hdiffs[i]) * 1000)
|
|
139
|
+ if difference > limit_values[i]:
|
|
140
|
+ deformation_results[i] = "变形"
|
|
141
|
+ # 对于超出部分,直接设置为 None
|
|
142
|
+ for i in range(len(limit_values), len(corrected_height_differences)):
|
|
143
|
+ deformation_results[i] = None
|
|
144
|
+ return deformation_results
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+# 计算修正系数并更新数据库
|
|
148
|
+def update_correction_factor(db_path, file_name, corrected_sum_last_5, corrected_sum_new_5):
|
|
149
|
+ correction_factor = corrected_sum_last_5 / corrected_sum_new_5
|
|
150
|
+ # 更新数据库中的修正系数
|
|
151
|
+ with sqlite3.connect(db_path) as conn:
|
|
152
|
+ cursor = conn.cursor()
|
|
153
|
+ update_query = "UPDATE GC_Input_Param SET Correct_Factor = ? WHERE TableName = ?"
|
|
154
|
+ cursor.execute(update_query, (correction_factor, file_name))
|
|
155
|
+ conn.commit()
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+# 从数据库中获取 New_HDiff 字段的数据
|
|
159
|
+def get_new_hdiffs(db_path, file_name):
|
|
160
|
+ new_hdiffs = []
|
|
161
|
+ with sqlite3.connect(db_path) as conn:
|
|
162
|
+ cursor = conn.cursor()
|
|
163
|
+ query = "SELECT New_HDiff FROM GC_Input_Point WHERE TableName = ?"
|
|
164
|
+ cursor.execute(query, (file_name,))
|
|
165
|
+ for row in cursor.fetchall():
|
|
166
|
+ if row[0] is None:
|
|
167
|
+ continue
|
|
168
|
+ else:
|
|
169
|
+ new_hdiffs.append(row[0])
|
|
170
|
+ return new_hdiffs
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+def get_old_hdiffs(db_path, file_name):
|
|
174
|
+ old_hdiffs = []
|
|
175
|
+ with sqlite3.connect(db_path) as conn:
|
|
176
|
+ cursor = conn.cursor()
|
|
177
|
+ query = "SELECT Last_HDiff FROM GC_Input_Point WHERE TableName = ?"
|
|
178
|
+ cursor.execute(query, (file_name,))
|
|
179
|
+ for row in cursor.fetchall():
|
|
180
|
+ if row[0] is None:
|
|
181
|
+ continue
|
|
182
|
+ else:
|
|
183
|
+ old_hdiffs.append(row[0])
|
|
184
|
+ return old_hdiffs
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+# 计算修正高差
|
|
188
|
+def calculate_corrected_height_differences_with_sin(new_hdiffs, corrected_height_differences_5):
|
|
189
|
+ corrected_height_differences_with_sin = []
|
|
190
|
+ for new_hdiff, corrected_diff in zip(new_hdiffs, corrected_height_differences_5):
|
|
191
|
+ corrected_diff_with_sin = math.copysign(1, new_hdiff) * corrected_diff
|
|
192
|
+ corrected_height_differences_with_sin.append(corrected_diff_with_sin)
|
|
193
|
+ return corrected_height_differences_with_sin
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+# 计算修正数
|
|
197
|
+def calculate_correction_numbers(result_height_differences, new_hdiffs):
|
|
198
|
+ correction_numbers = [(rhd - nh) * 1000 for rhd, nh in zip(result_height_differences, new_hdiffs)]
|
|
199
|
+ return correction_numbers
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+# 计算期间差异
|
|
203
|
+def calculate_period_differences(old_hdiffs, result_height_differences):
|
|
204
|
+ period_differences = []
|
|
205
|
+ for old_hdiff, result_diff in zip(old_hdiffs, result_height_differences):
|
|
206
|
+ if (old_hdiff >= 0 and result_diff >= 0) or (old_hdiff < 0 and result_diff < 0):
|
|
207
|
+ diff = (old_hdiff - result_diff) * 1000
|
|
208
|
+ else:
|
|
209
|
+ diff = (-old_hdiff - result_diff) * 1000
|
|
210
|
+ period_differences.append(diff)
|
|
211
|
+ return period_differences
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+# 插入数据到Outpoint数据库
|
|
215
|
+def insert_records_to_output_table(db_path, file_name, dis_ass, new_hdiff, correction_numbers, period_differences):
|
|
216
|
+ with sqlite3.connect(db_path) as conn:
|
|
217
|
+ cursor = conn.cursor()
|
|
218
|
+ # 查询 GC_Input_Point 表中的数据
|
|
219
|
+ query = """
|
|
220
|
+ SELECT New_ID, New_ResultName, New_SPName, New_EPName, New_RLen, TableName
|
|
221
|
+ FROM GC_Input_Point
|
|
222
|
+ WHERE TableName = ?
|
|
223
|
+ """
|
|
224
|
+ cursor.execute(query, (file_name,))
|
|
225
|
+ records = cursor.fetchall()
|
|
226
|
+ # 检查是否存在相同的 TableName
|
|
227
|
+ check_query = """
|
|
228
|
+ SELECT COUNT(*)
|
|
229
|
+ FROM GC_Output_Point
|
|
230
|
+ WHERE TableName = ?
|
|
231
|
+ """
|
|
232
|
+ cursor.execute(check_query, (file_name,))
|
|
233
|
+ count = cursor.fetchone()[0]
|
|
234
|
+ # 获取最长数组的长度
|
|
235
|
+ max_length = max(len(dis_ass), len(new_hdiff), len(correction_numbers), len(period_differences))
|
|
236
|
+ # 填充缺失值
|
|
237
|
+ dis_ass = dis_ass + [None] * (max_length - len(dis_ass))
|
|
238
|
+ new_hdiff = new_hdiff + [None] * (max_length - len(new_hdiff))
|
|
239
|
+ correction_numbers = correction_numbers + [None] * (max_length - len(correction_numbers))
|
|
240
|
+ period_differences = period_differences + [None] * (max_length - len(period_differences))
|
|
241
|
+ if count > 0:
|
|
242
|
+ # 更新操作
|
|
243
|
+ update_query = """
|
|
244
|
+ UPDATE GC_Output_Point
|
|
245
|
+ SET Dis_Ass = ?, New_HDiff = ?, Correct_Factor = ?, Period_Diff = ?
|
|
246
|
+ WHERE New_ID = ? AND TableName = ?
|
|
247
|
+ """
|
|
248
|
+ updated_records = []
|
|
249
|
+ for record, deformation_result, height_difference, correction, period_diff in zip(records, dis_ass,
|
|
250
|
+ new_hdiff,
|
|
251
|
+ correction_numbers,
|
|
252
|
+ period_differences):
|
|
253
|
+ updated_record = [deformation_result, height_difference, correction, period_diff, record[0], file_name]
|
|
254
|
+ updated_records.append(updated_record)
|
|
255
|
+ cursor.executemany(update_query, updated_records)
|
|
256
|
+ else:
|
|
257
|
+ # 插入操作
|
|
258
|
+ insert_query = """
|
|
259
|
+ INSERT INTO GC_Output_Point (New_ID, New_ResultName, New_SPName, New_EPName, New_RLen, TableName, Dis_Ass, New_HDiff, Correct_Factor, Period_Diff)
|
|
260
|
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
261
|
+ """
|
|
262
|
+ updated_records = []
|
|
263
|
+ for record, deformation_result, height_difference, correction, period_diff in zip(records, dis_ass,
|
|
264
|
+ new_hdiff,
|
|
265
|
+ correction_numbers,
|
|
266
|
+ period_differences):
|
|
267
|
+ updated_record = list(record) + [deformation_result, height_difference, correction, period_diff]
|
|
268
|
+ updated_records.append(updated_record)
|
|
269
|
+ cursor.executemany(insert_query, updated_records)
|
|
270
|
+ conn.commit()
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+def main_function(file_path, db_path):
|
|
274
|
+ # 获取文件名
|
|
275
|
+ file_name = os.path.basename(file_path)
|
|
276
|
+ file_name_utf8 = file_name.encode('utf-8')
|
|
277
|
+ # 处理查询结果
|
|
278
|
+ abs_last_hdiffs = calculate_absolute_height_differences(db_path, file_name_utf8, "Last_HDiff")
|
|
279
|
+ abs_new_hdiffs = calculate_absolute_height_differences(db_path, file_name_utf8, "New_HDiff")
|
|
280
|
+ # 获取稳定测段
|
|
281
|
+ # last_stable_section = get_last_stable_section(abs_last_hdiffs)
|
|
282
|
+ # current_stable_section = get_current_stable_section(abs_new_hdiffs, len(abs_last_hdiffs))
|
|
283
|
+ # 计算较差
|
|
284
|
+ differences = calculate_differences(abs_last_hdiffs, abs_new_hdiffs)
|
|
285
|
+ # stable_differences = calculate_stable_differences(last_stable_section, current_stable_section)
|
|
286
|
+ # 计算限值
|
|
287
|
+ limit_values = calculate_limits(db_path, file_name_utf8)
|
|
288
|
+ # total_limit = calculate_limits(db_path, file_name, total=True)
|
|
289
|
+ # 高程较差的变形判定
|
|
290
|
+ deformation_results = detect_deformation(differences, limit_values)
|
|
291
|
+ # 第一次稳定分析
|
|
292
|
+ corrected_sum_last_1 = calculate_corrected_old_height_difference(abs_last_hdiffs, deformation_results) # 上期改正高差
|
|
293
|
+ corrected_sum_new_1 = calculate_corrected_new_height_difference(abs_new_hdiffs, deformation_results,
|
|
294
|
+ abs_last_hdiffs) # 本期改正高差
|
|
295
|
+ corrected_height_differences_1 = calculate_corrected_height_differences(abs_new_hdiffs, corrected_sum_last_1,
|
|
296
|
+ corrected_sum_new_1) # 改正高差绝对值
|
|
297
|
+ first_deformation_results = detect_corrected_deformation(corrected_height_differences_1, abs_last_hdiffs,
|
|
298
|
+ limit_values) # 第一次稳定分析的变形判定
|
|
299
|
+ # 第二次稳定分析
|
|
300
|
+ corrected_sum_last_2 = calculate_corrected_old_height_difference(abs_last_hdiffs, first_deformation_results)
|
|
301
|
+ corrected_sum_new_2 = calculate_corrected_new_height_difference(abs_new_hdiffs, first_deformation_results,
|
|
302
|
+ abs_last_hdiffs)
|
|
303
|
+ corrected_height_differences_2 = calculate_corrected_height_differences(abs_new_hdiffs, corrected_sum_last_2,
|
|
304
|
+ corrected_sum_new_2)
|
|
305
|
+ second_deformation_results = detect_corrected_deformation(corrected_height_differences_2, abs_last_hdiffs,
|
|
306
|
+ limit_values)
|
|
307
|
+ # 第三次稳定分析
|
|
308
|
+ corrected_sum_last_3 = calculate_corrected_old_height_difference(abs_last_hdiffs, second_deformation_results)
|
|
309
|
+ corrected_sum_new_3 = calculate_corrected_new_height_difference(abs_new_hdiffs, second_deformation_results,
|
|
310
|
+ abs_last_hdiffs)
|
|
311
|
+ corrected_height_differences_3 = calculate_corrected_height_differences(abs_new_hdiffs, corrected_sum_last_3,
|
|
312
|
+ corrected_sum_new_3)
|
|
313
|
+ third_deformation_results = detect_corrected_deformation(corrected_height_differences_3, abs_last_hdiffs,
|
|
314
|
+ limit_values)
|
|
315
|
+ # 第四次稳定分析
|
|
316
|
+ corrected_sum_last_4 = calculate_corrected_old_height_difference(abs_last_hdiffs, third_deformation_results)
|
|
317
|
+ corrected_sum_new_4 = calculate_corrected_new_height_difference(abs_new_hdiffs, third_deformation_results,
|
|
318
|
+ abs_last_hdiffs)
|
|
319
|
+ corrected_height_differences_4 = calculate_corrected_height_differences(abs_new_hdiffs, corrected_sum_last_4,
|
|
320
|
+ corrected_sum_new_4)
|
|
321
|
+ fourth_deformation_results = detect_corrected_deformation(corrected_height_differences_4, abs_last_hdiffs,
|
|
322
|
+ limit_values)
|
|
323
|
+ # 第五次稳定分析
|
|
324
|
+ corrected_sum_last_5 = calculate_corrected_old_height_difference(abs_last_hdiffs, fourth_deformation_results)
|
|
325
|
+ corrected_sum_new_5 = calculate_corrected_new_height_difference(abs_new_hdiffs, fourth_deformation_results,
|
|
326
|
+ abs_last_hdiffs)
|
|
327
|
+ corrected_height_differences_5 = calculate_corrected_height_differences(abs_new_hdiffs, corrected_sum_last_5,
|
|
328
|
+ corrected_sum_new_5)
|
|
329
|
+ fifth_deformation_results = detect_corrected_deformation(corrected_height_differences_5, abs_last_hdiffs,
|
|
330
|
+ limit_values) # 第五次稳定分析的变形判定
|
|
331
|
+ # 更新数据库中的修正系数
|
|
332
|
+ update_correction_factor(db_path, file_name_utf8, corrected_sum_last_5, corrected_sum_new_5)
|
|
333
|
+ # 成果的高差
|
|
334
|
+ new_hdiffs = get_new_hdiffs(db_path, file_name_utf8)
|
|
335
|
+ old_hdiffs = get_old_hdiffs(db_path, file_name_utf8)
|
|
336
|
+ result_height_differences = calculate_corrected_height_differences_with_sin(new_hdiffs,
|
|
337
|
+ corrected_height_differences_5) # 结果高差
|
|
338
|
+ # 修正数
|
|
339
|
+ correction_numbers = calculate_correction_numbers(result_height_differences, new_hdiffs)
|
|
340
|
+ # 计算期间差异
|
|
341
|
+ period_differences = calculate_period_differences(old_hdiffs, result_height_differences)
|
|
342
|
+ # 插入数据到Outpoint数据库表
|
|
343
|
+ insert_records_to_output_table(db_path, file_name_utf8, fifth_deformation_results, result_height_differences,
|
|
344
|
+ correction_numbers, period_differences)
|