|
@@ -62,20 +62,23 @@ class CdPredictionService:
|
|
|
|
|
|
@returns {Dict[str, Dict]} 支持的县市配置信息
|
|
|
"""
|
|
|
+ # 获取Cd预测系统的基础路径
|
|
|
+ cd_system_base = self.config.get_cd_system_path()
|
|
|
+
|
|
|
return {
|
|
|
"乐昌市": {
|
|
|
- "boundary_file": "output/raster/lechang.shp",
|
|
|
- "template_file": "output/raster/meanTemp.tif",
|
|
|
- "coordinate_file": "data/coordinates/坐标.csv",
|
|
|
+ "boundary_file": os.path.join(cd_system_base, "output/raster/lechang.shp"),
|
|
|
+ "template_file": os.path.join(cd_system_base, "output/raster/meanTemp.tif"),
|
|
|
+ "coordinate_file": os.path.join(cd_system_base, "data/coordinates/坐标.csv"),
|
|
|
"region_code": "440282",
|
|
|
"display_name": "乐昌市",
|
|
|
"province": "广东省"
|
|
|
},
|
|
|
# 可扩展添加更多县市
|
|
|
# "韶关市": {
|
|
|
- # "boundary_file": "output/raster/shaoguan.shp",
|
|
|
- # "template_file": "output/raster/shaoguan_template.tif",
|
|
|
- # "coordinate_file": "data/coordinates/韶关_坐标.csv",
|
|
|
+ # "boundary_file": os.path.join(cd_system_base, "output/raster/shaoguan.shp"),
|
|
|
+ # "template_file": os.path.join(cd_system_base, "output/raster/shaoguan_template.tif"),
|
|
|
+ # "coordinate_file": os.path.join(cd_system_base, "data/coordinates/韶关_坐标.csv"),
|
|
|
# "region_code": "440200",
|
|
|
# "display_name": "韶关市",
|
|
|
# "province": "广东省"
|
|
@@ -319,9 +322,8 @@ class CdPredictionService:
|
|
|
|
|
|
# 如果提供了自定义数据文件,使用它替换默认数据
|
|
|
if data_file:
|
|
|
- # 这里需要将自定义数据文件复制到Cd预测系统的输入目录
|
|
|
- # 并更新配置以使用新的数据文件
|
|
|
- self._prepare_custom_data(data_file, county_name)
|
|
|
+ # 准备作物Cd模型的自定义数据
|
|
|
+ self._prepare_crop_cd_custom_data(data_file, county_name)
|
|
|
|
|
|
# 在线程池中运行CPU密集型任务
|
|
|
loop = asyncio.get_event_loop()
|
|
@@ -358,7 +360,8 @@ class CdPredictionService:
|
|
|
|
|
|
# 如果提供了自定义数据文件,使用它替换默认数据
|
|
|
if data_file:
|
|
|
- self._prepare_custom_data(data_file, county_name)
|
|
|
+ # 准备有效态Cd模型的自定义数据
|
|
|
+ self._prepare_effective_cd_custom_data(data_file, county_name)
|
|
|
|
|
|
# 在线程池中运行CPU密集型任务
|
|
|
loop = asyncio.get_event_loop()
|
|
@@ -374,9 +377,9 @@ class CdPredictionService:
|
|
|
self.logger.error(f"为{county_name}生成有效态Cd预测失败: {str(e)}")
|
|
|
raise
|
|
|
|
|
|
- def _prepare_custom_data(self, data_file: str, county_name: str):
|
|
|
+ def _prepare_crop_cd_custom_data(self, data_file: str, county_name: str):
|
|
|
"""
|
|
|
- 准备自定义数据文件
|
|
|
+ 准备作物Cd模型的自定义数据文件
|
|
|
|
|
|
@param {str} data_file - 数据文件路径
|
|
|
@param {str} county_name - 县市名称
|
|
@@ -402,7 +405,7 @@ class CdPredictionService:
|
|
|
coordinates_df.to_csv(coord_file_path, index=False, encoding='utf-8-sig')
|
|
|
self.logger.info(f"坐标文件已保存: {coord_file_path}")
|
|
|
|
|
|
- # 2. 准备作物Cd模型的训练数据(包含所有列,用于预测)
|
|
|
+ # 2. 准备作物Cd模型的训练数据
|
|
|
crop_cd_data_dir = os.path.join(cd_system_path, "models", "crop_cd_model", "data")
|
|
|
crop_target_file = os.path.join(crop_cd_data_dir, "areatest.csv")
|
|
|
|
|
@@ -410,6 +413,7 @@ class CdPredictionService:
|
|
|
if os.path.exists(crop_target_file):
|
|
|
backup_file = f"{crop_target_file}.backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
|
|
|
shutil.copy2(crop_target_file, backup_file)
|
|
|
+ self.logger.info(f"作物Cd模型原始数据已备份: {backup_file}")
|
|
|
|
|
|
# 提取环境因子数据(去掉前两列的经纬度)
|
|
|
environmental_data = df.iloc[:, 2:].copy() # 从第3列开始的所有列
|
|
@@ -418,7 +422,41 @@ class CdPredictionService:
|
|
|
environmental_data.to_csv(crop_target_file, index=False, encoding='utf-8-sig')
|
|
|
self.logger.info(f"作物Cd模型数据文件已保存: {crop_target_file}, 数据形状: {environmental_data.shape}")
|
|
|
|
|
|
- # 3. 准备有效态Cd模型的训练数据
|
|
|
+ self.logger.info(f"作物Cd模型自定义数据文件已准备完成,县市: {county_name}")
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ self.logger.error(f"准备作物Cd模型自定义数据文件失败: {str(e)}")
|
|
|
+ raise
|
|
|
+
|
|
|
+ def _prepare_effective_cd_custom_data(self, data_file: str, county_name: str):
|
|
|
+ """
|
|
|
+ 准备有效态Cd模型的自定义数据文件
|
|
|
+
|
|
|
+ @param {str} data_file - 数据文件路径
|
|
|
+ @param {str} county_name - 县市名称
|
|
|
+ """
|
|
|
+ try:
|
|
|
+ import pandas as pd
|
|
|
+
|
|
|
+ # 读取用户上传的CSV文件
|
|
|
+ df = pd.read_csv(data_file, encoding='utf-8')
|
|
|
+
|
|
|
+ # 获取Cd预测系统的数据目录
|
|
|
+ cd_system_path = self.config.get_cd_system_path()
|
|
|
+
|
|
|
+ # 1. 提取坐标信息并保存为独立的坐标文件
|
|
|
+ coordinates_df = pd.DataFrame({
|
|
|
+ 'longitude': df.iloc[:, 0], # 第一列为经度
|
|
|
+ 'latitude': df.iloc[:, 1] # 第二列为纬度
|
|
|
+ })
|
|
|
+
|
|
|
+ # 保存坐标文件到系统数据目录
|
|
|
+ coord_file_path = os.path.join(cd_system_path, "data", "coordinates", "坐标.csv")
|
|
|
+ os.makedirs(os.path.dirname(coord_file_path), exist_ok=True)
|
|
|
+ coordinates_df.to_csv(coord_file_path, index=False, encoding='utf-8-sig')
|
|
|
+ self.logger.info(f"坐标文件已保存: {coord_file_path}")
|
|
|
+
|
|
|
+ # 2. 准备有效态Cd模型的训练数据
|
|
|
effective_cd_data_dir = os.path.join(cd_system_path, "models", "effective_cd_model", "data")
|
|
|
effective_target_file = os.path.join(effective_cd_data_dir, "areatest.csv")
|
|
|
|
|
@@ -452,13 +490,10 @@ class CdPredictionService:
|
|
|
else:
|
|
|
self.logger.warning(f"用户数据环境因子列数不足且未找到备份文件,继续使用当前数据")
|
|
|
|
|
|
- # 4. 更新系统配置,确保使用新的坐标文件
|
|
|
- # 这里可能需要根据底层系统的配置方式进行调整
|
|
|
-
|
|
|
- self.logger.info(f"自定义数据文件已准备完成,县市: {county_name}")
|
|
|
+ self.logger.info(f"有效态Cd模型自定义数据文件已准备完成,县市: {county_name}")
|
|
|
|
|
|
except Exception as e:
|
|
|
- self.logger.error(f"准备自定义数据文件失败: {str(e)}")
|
|
|
+ self.logger.error(f"准备有效态Cd模型自定义数据文件失败: {str(e)}")
|
|
|
raise
|
|
|
|
|
|
def _run_crop_cd_prediction_with_county(self, county_name: str,
|