控制网复测平面基准归算程序(包含控制网复测平面基准计算,平面控制网稳定性计算,水准测段高差稳定计算三个程序功能)
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

GCcompute.py 17KB

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