From c7e16eed9c2f552724a3a55479bac8f080e342f2 Mon Sep 17 00:00:00 2001 From: Tian jianyong <11429339@qq.com> Date: Fri, 7 Nov 2025 16:07:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/mock_airport.py | 105 +++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 57 deletions(-) diff --git a/tools/mock_airport.py b/tools/mock_airport.py index 27e203a7..dca2312c 100644 --- a/tools/mock_airport.py +++ b/tools/mock_airport.py @@ -201,7 +201,7 @@ def get_aircraft_route_params(): "data": None }), 404 - logging.info(f"进港路由参数查询: flightNo={flight_no}, params={route_params}") + logger.info(f"进港路由参数查询: flightNo={flight_no}, params={route_params}") return jsonify({ "status": 200, "msg": "进港路由参数查询成功", @@ -225,7 +225,7 @@ def get_aircraft_route_params(): "data": None }), 404 - logging.info(f"出港路由参数查询: flightNo={flight_no}, params={route_params}") + logger.info(f"出港路由参数查询: flightNo={flight_no}, params={route_params}") return jsonify({ "status": 200, "msg": "出港路由参数查询成功", @@ -1069,11 +1069,11 @@ def convert_route_to_cgcs2000(route_data: dict) -> dict: try: # 检查当前坐标系类型 current_coordinate_system = route_data.get("coordinateSystem", "WGS84") - logging.info(f"转换路由数据坐标系: 当前={current_coordinate_system} -> 目标=CGCS2000") + logger.info(f"转换路由数据坐标系: 当前={current_coordinate_system} -> 目标=CGCS2000") # 如果已经是CGCS2000坐标系,直接返回 if current_coordinate_system == "CGCS2000": - logging.info("路由数据已经是CGCS2000坐标系,无需转换") + logger.info("路由数据已经是CGCS2000坐标系,无需转换") return converted_route # 如果是WGS84坐标系,需要转换为CGCS2000 @@ -1081,7 +1081,7 @@ def convert_route_to_cgcs2000(route_data: dict) -> dict: geo_path = converted_route.get("geoPath", {}) features = geo_path.get("features", []) - logging.info(f"开始转换WGS84坐标到CGCS2000,共有 {len(features)} 个feature") + logger.info(f"开始转换WGS84坐标到CGCS2000,共有 {len(features)} 个feature") for feature in features: geometry = feature.get("geometry", {}) @@ -1099,7 +1099,7 @@ def convert_route_to_cgcs2000(route_data: dict) -> dict: x, y = coordinate_system.wgs84_to_cgcs2000(latitude, longitude) converted_coordinates.append([x, y]) - logging.debug(f"WGS84坐标转换: lon={longitude}, lat={latitude} -> CGCS2000: x={x}, y={y}") + logger.debug(f"WGS84坐标转换: lon={longitude}, lat={latitude} -> CGCS2000: x={x}, y={y}") # 更新坐标数据 geometry["coordinates"] = converted_coordinates @@ -1107,12 +1107,12 @@ def convert_route_to_cgcs2000(route_data: dict) -> dict: # 更新坐标系标识 converted_route["coordinateSystem"] = "CGCS2000" - logging.info(f"WGS84到CGCS2000坐标转换完成,共转换 {len(features)} 个feature") + logger.info(f"WGS84到CGCS2000坐标转换完成,共转换 {len(features)} 个feature") return converted_route except Exception as e: - logging.error(f"路由数据坐标转换失败: {str(e)}") + logger.error(f"路由数据坐标转换失败: {str(e)}") # 转换失败时返回原始数据,但确保坐标系标识为CGCS2000 converted_route["coordinateSystem"] = "CGCS2000" return converted_route @@ -1135,9 +1135,9 @@ def merge_discontinuous_route_for_flight(route_data: dict, flight_no: str) -> di codes_str = route_data.get("codes", "") if codes_str: code_order = [code.strip() for code in codes_str.split(",")] - logging.info(f"航班 {flight_no} codes顺序: {code_order}") + logger.info(f"航班 {flight_no} codes顺序: {code_order}") else: - logging.warning(f"航班 {flight_no} 缺少codes字段,无法验证方向") + logger.warning(f"航班 {flight_no} 缺少codes字段,无法验证方向") code_order = [] # 收集所有LineString路径段,并记录每段的code标识 @@ -1161,7 +1161,7 @@ def merge_discontinuous_route_for_flight(route_data: dict, flight_no: str) -> di # 如果成功合并为单条路径 if isinstance(merged_geometry, LineString): continuous_coords = list(merged_geometry.coords) - logging.info(f"✅ 航班 {flight_no} 合并为连续路径,包含 {len(continuous_coords)} 个坐标点") + logger.info(f"✅ 航班 {flight_no} 合并为连续路径,包含 {len(continuous_coords)} 个坐标点") # 基于codes字段验证和修正路径方向 if len(code_order) >= 2: @@ -1182,14 +1182,14 @@ def merge_discontinuous_route_for_flight(route_data: dict, flight_no: str) -> di else: # 无法合并就报错,不能保持原样掩盖问题 error_msg = f"❌ 航班 {flight_no} 路径无法合并为连续路径,存在不连续段" - logging.error(error_msg) + logger.error(error_msg) raise RuntimeError(error_msg) except ImportError: - logging.warning(f"Shapely库未安装,跳过路径合并") + logger.warning(f"Shapely库未安装,跳过路径合并") return route_data except Exception as e: - logging.error(f"航班 {flight_no} 路径合并失败: {str(e)}") + logger.error(f"航班 {flight_no} 路径合并失败: {str(e)}") return route_data @@ -1224,26 +1224,26 @@ def _verify_and_correct_path_direction(continuous_coords: list, original_feature start_code = find_point_code(continuous_coords[0]) end_code = find_point_code(continuous_coords[-1]) - logging.info(f"航班 {flight_no} 端点检查: 起点在{start_code}, 终点在{end_code}, 期望顺序{code_order}") + logger.info(f"航班 {flight_no} 端点检查: 起点在{start_code}, 终点在{end_code}, 期望顺序{code_order}") # 检查方向是否正确 - 只使用实际存在的路径段codes进行判断 expected_start = code_order[0] # F1 # 对于MU5123进港,应该从F1开始,但终点138不是路径段code,所以检查起点即可 - logging.info(f"航班 {flight_no} 方向检查: 期望从{expected_start}开始, 实际起点{start_code}, 终点{end_code}") + logger.info(f"航班 {flight_no} 方向检查: 期望从{expected_start}开始, 实际起点{start_code}, 终点{end_code}") # 通用路径方向检查逻辑 if start_code == expected_start: - logging.info(f"✅ 航班 {flight_no} 路径方向正确: 从{expected_start}开始") + logger.info(f"✅ 航班 {flight_no} 路径方向正确: 从{expected_start}开始") else: # 方向相反,需要反转 continuous_coords.reverse() - logging.info(f"✅ 航班 {flight_no} 路径方向已修正: 从{expected_start}开始 (原起点: {start_code})") + logger.info(f"✅ 航班 {flight_no} 路径方向已修正: 从{expected_start}开始 (原起点: {start_code})") return continuous_coords except Exception as e: - logging.error(f"航班 {flight_no} 路径方向验证失败: {str(e)}") + logger.error(f"航班 {flight_no} 路径方向验证失败: {str(e)}") return continuous_coords def validate_route_data_integrity(route_data: dict, flight_no: str) -> dict: @@ -1262,10 +1262,10 @@ def validate_route_data_integrity(route_data: dict, flight_no: str) -> dict: features = geo_path.get("features", []) if len(features) == 0: - logging.warning(f"⚠️ 航班 {flight_no} 路径数据为空,无路径段") + logger.warning(f"⚠️ 航班 {flight_no} 路径数据为空,无路径段") return route_data - logging.info(f"✅ 航班 {flight_no} 路径数据完整:包含 {len(features)} 个路径段") + logger.info(f"✅ 航班 {flight_no} 路径数据完整:包含 {len(features)} 个路径段") # 验证每个路径段的数据完整性 valid_segments = 0 @@ -1282,22 +1282,22 @@ def validate_route_data_integrity(route_data: dict, flight_no: str) -> dict: if len(coordinates) >= 2: valid_segments += 1 total_coordinates += len(coordinates) - logging.debug(f" 路径段 {i+1}: 代码={code}, 坐标点数={len(coordinates)} ✅") + logger.debug(f" 路径段 {i+1}: 代码={code}, 坐标点数={len(coordinates)} ✅") else: - logging.warning(f" 路径段 {i+1}: 代码={code}, 坐标点数不足({len(coordinates)}) ⚠️") + logger.warning(f" 路径段 {i+1}: 代码={code}, 坐标点数不足({len(coordinates)}) ⚠️") else: - logging.warning(f" 路径段 {i+1}: 非LineString类型 ({geometry.get('type')}) ⚠️") + logger.warning(f" 路径段 {i+1}: 非LineString类型 ({geometry.get('type')}) ⚠️") - logging.info(f"✅ 航班 {flight_no} 数据验证完成:{valid_segments}/{len(features)} 有效路径段,共 {total_coordinates} 个坐标点") + logger.info(f"✅ 航班 {flight_no} 数据验证完成:{valid_segments}/{len(features)} 有效路径段,共 {total_coordinates} 个坐标点") # 验证坐标系信息 coordinate_system = route_data.get("coordinateSystem", "未知") - logging.info(f"✅ 航班 {flight_no} 坐标系:{coordinate_system}") + logger.info(f"✅ 航班 {flight_no} 坐标系:{coordinate_system}") return route_data except Exception as e: - logging.error(f"航班 {flight_no} 路径数据完整性验证异常: {str(e)}") + logger.error(f"航班 {flight_no} 路径数据完整性验证异常: {str(e)}") return route_data def parse_route_path(route_data: dict) -> list[tuple[float, float]]: @@ -1315,12 +1315,12 @@ def parse_route_path(route_data: dict) -> list[tuple[float, float]]: try: # 检查坐标系类型 coordinate_system_type = route_data.get("coordinateSystem", "CGCS2000") - logging.info(f"路由数据坐标系: {coordinate_system_type}") + logger.info(f"路由数据坐标系: {coordinate_system_type}") geo_path = route_data.get("geoPath", {}) features = geo_path.get("features", []) - logging.info(f"解析路径,共有 {len(features)} 个feature") + logger.info(f"解析路径,共有 {len(features)} 个feature") for feature in features: geometry = feature.get("geometry", {}) @@ -1335,23 +1335,23 @@ def parse_route_path(route_data: dict) -> list[tuple[float, float]]: if coordinate_system_type == "WGS84": # 如果已经是WGS84坐标,直接使用 (经度, 纬度) lat, lon = y, x - logging.debug(f"WGS84坐标直接使用: lon={lon}, lat={lat}") + logger.debug(f"WGS84坐标直接使用: lon={lon}, lat={lat}") else: # 如果是CGCS2000坐标,需要转换 lat, lon = coordinate_system.cgcs2000_to_wgs84(x, y) - logging.debug(f"CGCS2000坐标转换: {x},{y} -> lat={lat}, lon={lon}") + logger.debug(f"CGCS2000坐标转换: {x},{y} -> lat={lat}, lon={lon}") path_points.append((lat, lon)) - logging.info(f"路径解析完成,坐标系={coordinate_system_type},共生成 {len(path_points)} 个坐标点") + logger.info(f"路径解析完成,坐标系={coordinate_system_type},共生成 {len(path_points)} 个坐标点") # 暂时禁用过滤,保留所有路径点用于测试 - logging.info(f"保留所有 {len(path_points)} 个路径点") + logger.info(f"保留所有 {len(path_points)} 个路径点") return path_points except Exception as e: - logging.error(f"路径解析失败: {str(e)}") + logger.error(f"路径解析失败: {str(e)}") return [] def haversine_distance(lat1: float, lon1: float, lat2: float, lon2: float) -> float: @@ -1398,7 +1398,7 @@ class AircraftRouteFollower: # 根据航班号获取对应的路由数据 flight_routes = aircraft_routes.get(self.flight_no) if not flight_routes: - logging.warning(f"未找到航班 {self.flight_no} 的路由数据,使用MU5123的路由作为默认") + logger.warning(f"未找到航班 {self.flight_no} 的路由数据,使用MU5123的路由作为默认") flight_routes = aircraft_routes.get("MU5123", {}) # 解析进港路径 @@ -1406,20 +1406,20 @@ class AircraftRouteFollower: # 验证MU5123进港路径的数据完整性,然后合并为连续路径 if self.flight_no == "MU5123" and arrival_route: - logging.info(f"验证 {self.flight_no} 进港路径数据完整性") + logger.info(f"验证 {self.flight_no} 进港路径数据完整性") arrival_route = validate_route_data_integrity(arrival_route, self.flight_no) # 将31个路径段合并为连续路径,让飞机能够完整运行 - logging.info(f"将 {self.flight_no} 的分散路径段合并为连续路径") + logger.info(f"将 {self.flight_no} 的分散路径段合并为连续路径") arrival_route = merge_discontinuous_route_for_flight(arrival_route, self.flight_no) self.arrival_points = parse_route_path(arrival_route) - logging.info(f"航空器 {self.flight_no} 进港路径: {len(self.arrival_points)} 个点") + logger.info(f"航空器 {self.flight_no} 进港路径: {len(self.arrival_points)} 个点") # 解析出港路径 departure_route = flight_routes.get("departure", {}) self.departure_points = parse_route_path(departure_route) - logging.info(f"航空器 {self.flight_no} 出港路径: {len(self.departure_points)} 个点") + logger.info(f"航空器 {self.flight_no} 出港路径: {len(self.departure_points)} 个点") # 设置机位坐标(138号机位的大概位置) if self.arrival_points: @@ -1431,7 +1431,7 @@ class AircraftRouteFollower: self.gate_position = (36.354068, 120.083410) except Exception as e: - logging.error(f"路径解析失败: {str(e)}") + logger.error(f"路径解析失败: {str(e)}") self.arrival_points = [] self.departure_points = [] self.gate_position = (36.354068, 120.083410) @@ -1446,7 +1446,7 @@ class AircraftRouteFollower: self.is_at_gate = False self.flight_status = 'in_route' # 设置为路径运行状态 self.wait_until = 0.0 # 清除等待时间 - logging.info(f"航空器 {self.flight_no} 开始进港路径跟随") + logger.info(f"航空器 {self.flight_no} 开始进港路径跟随") elif route_type == "departure" and self.departure_points: self.current_route_type = "departure" @@ -1456,10 +1456,10 @@ class AircraftRouteFollower: self.is_at_gate = False self.flight_status = 'in_route' # 设置为路径运行状态 self.wait_until = 0.0 # 清除等待时间 - logging.info(f"航空器 {self.flight_no} 开始出港路径跟随") + logger.info(f"航空器 {self.flight_no} 开始出港路径跟随") else: - logging.warning(f"航空器 {self.flight_no} 无效的路径类型: {route_type}") + logger.warning(f"航空器 {self.flight_no} 无效的路径类型: {route_type}") def update_position_on_route(self, aircraft: dict[str, Any], speed_kmh: float, elapsed_time: float) -> bool: """ @@ -1522,7 +1522,7 @@ class AircraftRouteFollower: self.flight_status = 'at_gate' if self.is_at_gate else 'completed' # 设置5秒等待时间 self.wait_until = current_time + self.waiting_duration - logging.info(f"航空器 {self.flight_no} 完成 {self.current_route_type} 路径,等待{self.waiting_duration}秒后重新开始") + logger.info(f"航空器 {self.flight_no} 完成 {self.current_route_type} 路径,等待{self.waiting_duration}秒后重新开始") return True # 更新到下一个目标点 @@ -1622,12 +1622,12 @@ class AircraftRouteManager: if follower.route_points: aircraft["latitude"] = follower.route_points[0][0] aircraft["longitude"] = follower.route_points[0][1] - logging.info(f"航空器 {aircraft.get('flightNo')} 等待结束,重新开始进港路径") + logger.info(f"航空器 {aircraft.get('flightNo')} 等待结束,重新开始进港路径") route_completed = follower.update_position_on_route(aircraft, speed, elapsed_time) if route_completed and follower.flight_status != 'waiting': # 路径完成,已设置5秒等待时间,无需立即重新开始 - logging.info(f"航空器 {aircraft.get('flightNo')} 进港完成,将等待{follower.waiting_duration}秒后重新开始") + logger.info(f"航空器 {aircraft.get('flightNo')} 进港完成,将等待{follower.waiting_duration}秒后重新开始") def _update_departure_only_aircraft(self, aircraft: dict[str, Any], follower: AircraftRouteFollower, speed: float, elapsed_time: float): @@ -1641,12 +1641,12 @@ class AircraftRouteManager: if follower.route_points: aircraft["latitude"] = follower.route_points[0][0] aircraft["longitude"] = follower.route_points[0][1] - logging.info(f"航空器 {aircraft.get('flightNo')} 等待结束,重新开始出港路径") + logger.info(f"航空器 {aircraft.get('flightNo')} 等待结束,重新开始出港路径") route_completed = follower.update_position_on_route(aircraft, speed, elapsed_time) if route_completed and follower.flight_status != 'waiting': # 路径完成,已设置5秒等待时间,无需立即重新开始 - logging.info(f"航空器 {aircraft.get('flightNo')} 出港完成,将等待{follower.waiting_duration}秒后重新开始") + logger.info(f"航空器 {aircraft.get('flightNo')} 出港完成,将等待{follower.waiting_duration}秒后重新开始") # 创建全局路径跟随管理器 @@ -2025,7 +2025,6 @@ class BackgroundUpdateManager: self.update_thread = threading.Thread(target=self._update_loop, daemon=True) self.update_thread.start() logger.info("后台更新管理器已启动") - logger.handlers[0].flush() # 立即刷新日志 def stop(self): """停止后台更新线程""" @@ -2052,19 +2051,11 @@ class BackgroundUpdateManager: update_vehicle_position(vehicle, UPDATE_INTERVAL) vehicle["time"] = int(current_time * 1000) - # 定期刷新日志到文件(每10个周期) - if int(current_time) % 10 == 0: - for handler in logger.handlers: - handler.flush() - # 休眠到下一个更新周期 time.sleep(UPDATE_INTERVAL) except Exception as e: logger.error(f"后台更新出错: {str(e)}") - # 错误发生时立即刷新日志 - for handler in logger.handlers: - handler.flush() time.sleep(1.0) # 出错时短暂休眠后继续 # 全局后台更新管理器实例