main.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. """
  2. 主执行脚本 - Cd预测集成系统
  3. Main execution script for Cd Prediction Integrated System
  4. Description: 集成运行作物Cd模型、有效态Cd模型和数据分析可视化的完整流程
  5. """
  6. import os
  7. import sys
  8. import logging
  9. from datetime import datetime
  10. # 添加项目根目录到Python路径
  11. sys.path.append(os.path.dirname(os.path.abspath(__file__)))
  12. import config
  13. from models.crop_cd_model.predict import CropCdPredictor
  14. from models.effective_cd_model.predict import EffectiveCdPredictor
  15. from analysis.data_processing import DataProcessor
  16. from analysis.mapping import RasterMapper
  17. from analysis.visualization import Visualizer
  18. from utils.common import setup_logging, validate_files
  19. def main():
  20. """
  21. 主执行函数
  22. 执行完整的Cd预测分析流程
  23. """
  24. # 设置日志
  25. log_file = os.path.join(config.OUTPUT_PATHS["reports_dir"],
  26. f"execution_log_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log")
  27. setup_logging(log_file)
  28. logger = logging.getLogger(__name__)
  29. logger.info("=" * 60)
  30. logger.info("开始执行Cd预测集成系统")
  31. logger.info("=" * 60)
  32. try:
  33. # 确保目录存在
  34. config.ensure_directories()
  35. logger.info("项目目录结构检查完成")
  36. # 步骤1: 运行作物Cd模型预测
  37. if config.WORKFLOW_CONFIG["run_crop_model"]:
  38. logger.info("步骤1: 运行作物Cd模型预测...")
  39. crop_predictor = CropCdPredictor()
  40. crop_output = crop_predictor.predict()
  41. logger.info(f"作物Cd模型预测完成,输出文件: {crop_output}")
  42. # 步骤2: 运行有效态Cd模型预测
  43. if config.WORKFLOW_CONFIG["run_effective_model"]:
  44. logger.info("步骤2: 运行有效态Cd模型预测...")
  45. effective_predictor = EffectiveCdPredictor()
  46. effective_output = effective_predictor.predict()
  47. logger.info(f"有效态Cd模型预测完成,输出文件: {effective_output}")
  48. # 步骤3: 数据整合处理
  49. if config.WORKFLOW_CONFIG["combine_predictions"]:
  50. logger.info("步骤3: 整合预测结果与坐标数据...")
  51. data_processor = DataProcessor()
  52. final_data_files = data_processor.combine_predictions_with_coordinates()
  53. logger.info(f"数据整合完成,生成文件: {list(final_data_files.keys())}")
  54. # 步骤4: 为每个模型生成栅格文件和可视化图
  55. model_outputs = {}
  56. for model_name, final_data_file in final_data_files.items():
  57. if model_name == 'combined': # 跳过合并文件的可视化
  58. continue
  59. # 只为当前工作流配置中启用的模型生成输出文件
  60. if model_name == 'crop_cd' and not config.WORKFLOW_CONFIG.get("run_crop_model", False):
  61. logger.info(f"跳过{model_name}模型的可视化(工作流配置中未启用)")
  62. continue
  63. if model_name == 'effective_cd' and not config.WORKFLOW_CONFIG.get("run_effective_model", False):
  64. logger.info(f"跳过{model_name}模型的可视化(工作流配置中未启用)")
  65. continue
  66. logger.info(f"为{model_name}模型生成栅格和可视化...")
  67. # 为每个模型确定显示名称
  68. if model_name == 'crop_cd':
  69. display_name = "作物Cd"
  70. title_name = "Crop Cd Prediction"
  71. elif model_name == 'effective_cd':
  72. display_name = "有效态Cd"
  73. title_name = "Effective Cd Prediction"
  74. else:
  75. display_name = model_name
  76. title_name = f"{model_name} Prediction"
  77. model_outputs[model_name] = {}
  78. # 步骤4a: 生成栅格文件
  79. if config.WORKFLOW_CONFIG["generate_raster"]:
  80. logger.info(f"步骤4a: 为{display_name}模型生成栅格文件...")
  81. raster_mapper = RasterMapper()
  82. # 为每个模型创建独立的输出路径
  83. output_raster_path = os.path.join(
  84. config.OUTPUT_PATHS["raster_dir"],
  85. f"output_{model_name}.tif"
  86. )
  87. output_raster = raster_mapper.csv_to_raster(
  88. final_data_file,
  89. output_raster=output_raster_path,
  90. output_shp=os.path.join(
  91. config.OUTPUT_PATHS["raster_dir"],
  92. f"points_{model_name}.shp"
  93. )
  94. )
  95. model_outputs[model_name]['raster'] = output_raster
  96. logger.info(f"{display_name}模型栅格文件生成完成: {output_raster}")
  97. # 步骤4b: 创建可视化地图
  98. if config.WORKFLOW_CONFIG["create_visualization"]:
  99. logger.info(f"步骤4b: 为{display_name}模型创建可视化地图...")
  100. visualizer = Visualizer()
  101. # 为每个模型创建独立的地图输出路径
  102. map_output_path = os.path.join(
  103. config.OUTPUT_PATHS["figures_dir"],
  104. f"Prediction_results_{model_name}"
  105. )
  106. map_output = visualizer.create_raster_map(
  107. tif_path=output_raster,
  108. title_name=title_name,
  109. output_path=map_output_path
  110. )
  111. model_outputs[model_name]['map'] = map_output
  112. logger.info(f"{display_name}模型地图可视化完成: {map_output}")
  113. # 步骤4c: 创建直方图
  114. if config.WORKFLOW_CONFIG["create_histogram"]:
  115. logger.info(f"步骤4c: 为{display_name}模型创建预测值分布直方图...")
  116. # 为每个模型创建独立的直方图输出路径
  117. histogram_output_path = os.path.join(
  118. config.OUTPUT_PATHS["figures_dir"],
  119. f"Prediction_frequency_{model_name}.jpg"
  120. )
  121. # 为了避免中文字体问题,使用英文标题
  122. if model_name == 'crop_cd':
  123. hist_title = 'Crop Cd Prediction Frequency'
  124. hist_xlabel = 'Crop Cd Content (mg/kg)'
  125. elif model_name == 'effective_cd':
  126. hist_title = 'Effective Cd Prediction Frequency'
  127. hist_xlabel = 'Effective Cd Content (mg/kg)'
  128. else:
  129. hist_title = f'{model_name} Prediction Frequency'
  130. hist_xlabel = f'{model_name} Content'
  131. histogram_output = visualizer.create_histogram(
  132. file_path=output_raster,
  133. title=hist_title,
  134. xlabel=hist_xlabel,
  135. save_path=histogram_output_path
  136. )
  137. model_outputs[model_name]['histogram'] = histogram_output
  138. logger.info(f"{display_name}模型直方图创建完成: {histogram_output}")
  139. logger.info("=" * 60)
  140. logger.info("所有流程执行完成!")
  141. logger.info("=" * 60)
  142. # 打印结果摘要
  143. print_summary(model_outputs)
  144. except Exception as e:
  145. logger.error(f"执行过程中发生错误: {str(e)}")
  146. logger.exception("详细错误信息:")
  147. raise
  148. def print_summary(model_outputs):
  149. """打印执行结果摘要"""
  150. print("\n" + "=" * 60)
  151. print("[SUCCESS] Cd预测集成系统执行完成!")
  152. print("=" * 60)
  153. print(f"[INFO] 总输出目录: {config.OUTPUT_PATHS}")
  154. print()
  155. # 显示每个模型的输出文件
  156. for model_name, outputs in model_outputs.items():
  157. if model_name == 'crop_cd':
  158. display_name = "作物Cd模型"
  159. elif model_name == 'effective_cd':
  160. display_name = "有效态Cd模型"
  161. else:
  162. display_name = f"{model_name}模型"
  163. print(f"[MODEL] {display_name}:")
  164. for output_type, file_path in outputs.items():
  165. if output_type == 'raster':
  166. print(f" [RASTER] 栅格文件: {file_path}")
  167. elif output_type == 'map':
  168. print(f" [MAP] 地图文件: {file_path}")
  169. elif output_type == 'histogram':
  170. print(f" [CHART] 直方图文件: {file_path}")
  171. print()
  172. print(f"[LOG] 日志文件目录: {config.OUTPUT_PATHS['reports_dir']}")
  173. print("=" * 60)
  174. if __name__ == "__main__":
  175. main()