visualization.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. """
  2. 可视化模块
  3. Visualization Module
  4. 基于通用绘图模块 app.utils.mapping_utils 的封装
  5. 提供与原有接口兼容的可视化功能
  6. """
  7. import os
  8. import sys
  9. import logging
  10. # 添加项目根目录到路径
  11. sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
  12. # 导入通用绘图模块
  13. from app.utils.mapping_utils import MappingUtils, COLORMAPS
  14. import config
  15. class Visualizer:
  16. """
  17. 可视化器
  18. 负责创建栅格地图和直方图
  19. 基于通用绘图模块的封装,保持原有接口兼容性
  20. """
  21. def __init__(self):
  22. """
  23. 初始化可视化器
  24. """
  25. self.logger = logging.getLogger(__name__)
  26. self.mapping_utils = MappingUtils()
  27. def create_raster_map(self,
  28. shp_path=None,
  29. tif_path=None,
  30. color_map_name=None,
  31. title_name="Prediction Cd",
  32. output_path=None,
  33. output_size=None,
  34. high_res=False):
  35. """
  36. 创建栅格地图
  37. @param shp_path: 输入的矢量数据的路径
  38. @param tif_path: 输入的栅格数据的路径
  39. @param color_map_name: 使用的色彩方案
  40. @param title_name: 输出数据的图的名称
  41. @param output_path: 输出保存的图片的路径
  42. @param output_size: 图片尺寸
  43. @param high_res: 是否使用高分辨率输出(默认False,DPI=300)
  44. @return: 输出图片路径
  45. """
  46. try:
  47. # 使用默认值
  48. if shp_path is None:
  49. shp_path = config.ANALYSIS_CONFIG["boundary_shp"]
  50. if tif_path is None:
  51. tif_path = config.ANALYSIS_CONFIG["output_raster"]
  52. if color_map_name is None:
  53. color_map_name = config.VISUALIZATION_CONFIG["color_maps"][config.VISUALIZATION_CONFIG["default_colormap"]]
  54. if output_path is None:
  55. output_path = os.path.join(config.OUTPUT_PATHS["figures_dir"], "Prediction_results")
  56. if output_size is None:
  57. output_size = config.VISUALIZATION_CONFIG["figure_size"]
  58. # 检查边界文件是否存在
  59. if shp_path and not os.path.exists(shp_path):
  60. self.logger.warning(f"边界文件不存在: {shp_path},将跳过边界绘制")
  61. shp_path = None
  62. # 设置DPI
  63. dpi = 600 if high_res else config.VISUALIZATION_CONFIG["dpi"]
  64. # 调用通用绘图模块
  65. return self.mapping_utils.create_raster_map(
  66. shp_path=shp_path,
  67. tif_path=tif_path,
  68. output_path=output_path,
  69. colormap=color_map_name,
  70. title=title_name,
  71. output_size=output_size,
  72. dpi=dpi
  73. )
  74. except Exception as e:
  75. self.logger.error(f"栅格地图创建失败: {str(e)}")
  76. raise
  77. def create_histogram(self,
  78. file_path=None,
  79. figsize=None,
  80. xlabel='Cd content',
  81. ylabel='Frequency',
  82. title='County level Cd Frequency',
  83. save_path=None,
  84. high_res=False):
  85. """
  86. 绘制GeoTIFF文件的直方图
  87. @param file_path: GeoTIFF 文件路径
  88. @param figsize: 图像尺寸,如 (10, 6)
  89. @param xlabel: 横坐标标签
  90. @param ylabel: 纵坐标标签
  91. @param title: 图标题
  92. @param save_path: 可选,保存图片路径(含文件名和扩展名)
  93. @param high_res: 是否使用高分辨率输出(默认False,DPI=300)
  94. @return: 输出图片路径
  95. """
  96. try:
  97. # 使用默认值
  98. if file_path is None:
  99. file_path = config.ANALYSIS_CONFIG["output_raster"]
  100. if figsize is None:
  101. figsize = (6, 6)
  102. if save_path is None:
  103. save_path = os.path.join(config.OUTPUT_PATHS["figures_dir"], "Prediction_frequency.jpg")
  104. # 设置DPI
  105. dpi = 600 if high_res else config.VISUALIZATION_CONFIG["dpi"]
  106. # 调用通用绘图模块
  107. return self.mapping_utils.create_histogram(
  108. file_path=file_path,
  109. save_path=save_path,
  110. figsize=figsize,
  111. xlabel=xlabel,
  112. ylabel=ylabel,
  113. title=title,
  114. dpi=dpi
  115. )
  116. except Exception as e:
  117. self.logger.error(f"直方图创建失败: {str(e)}")
  118. raise
  119. if __name__ == "__main__":
  120. # 测试代码
  121. visualizer = Visualizer()
  122. # 测试栅格地图创建
  123. try:
  124. map_output = visualizer.create_raster_map()
  125. print(f"栅格地图创建完成: {map_output}")
  126. except Exception as e:
  127. print(f"栅格地图创建失败: {e}")
  128. # 测试直方图创建
  129. try:
  130. histogram_output = visualizer.create_histogram()
  131. print(f"直方图创建完成: {histogram_output}")
  132. except Exception as e:
  133. print(f"直方图创建失败: {e}")