控制网复测平面基准归算程序(包含控制网复测平面基准计算,平面控制网稳定性计算,水准测段高差稳定计算三个程序功能)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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