Calculate.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import os
  2. import sys
  3. import pandas as pd
  4. from shapely.geometry import Point
  5. import numpy as np
  6. from pathlib import Path
  7. # 添加项目根目录到Python路径
  8. project_root = Path(__file__).parent.parent.parent
  9. sys.path.append(str(project_root))
  10. # 导入数据库服务
  11. from app.services.land_use_service import land_use_service
  12. # 设置要处理的土地类型
  13. str = "旱地"
  14. # 从数据库获取土地利用数据,替代原来的SHP文件读取
  15. print(f"从数据库获取 '{str}' 类型的土地利用数据...")
  16. land_centers_df = land_use_service.get_land_centers_for_processing(str)
  17. if land_centers_df is None or land_centers_df.empty:
  18. print(f"数据库中没有找到 '{str}' 类型的土地利用数据")
  19. exit(1)
  20. print(f"从数据库获取到 {len(land_centers_df)} 个 '{str}' 类型的土地数据")
  21. # 读取 xls 文件
  22. xls_file = r"..\Data\Irrigation_water_SamplingPoint.xlsx"
  23. df_xls = pd.read_excel(xls_file)
  24. # 不再需要为GeoDataFrame添加字段,直接处理数据即可
  25. # 根据面要素类型设置系数
  26. A = 711 * 0.524
  27. B = 427 * 0.599
  28. C = 200 * 0.7
  29. Num = 0.0
  30. if str == "水浇地":
  31. Num = B
  32. elif str == "水田":
  33. Num = A
  34. else:
  35. Num = C
  36. # 创建一个空列表来存储数据行
  37. data_rows = []
  38. # 遍历面要素,使用数据库中的中心点坐标
  39. for index, row in land_centers_df.iterrows():
  40. # 直接使用数据库中已经转换好的WGS84坐标
  41. center_lon = row['center_lon']
  42. center_lat = row['center_lat']
  43. center_transformed = Point(center_lon, center_lat)
  44. # 计算面要素中心与采样点的距离
  45. distances = df_xls.apply(lambda x: center_transformed.distance(Point(x['经度'], x['纬度'])), axis=1)
  46. # 找到距离最近的采样点
  47. min_distance_index = distances.idxmin()
  48. nearest_sample = df_xls.loc[min_distance_index]
  49. # 计算最近采样点的重金属含量,并乘以系数Num
  50. cd_value = nearest_sample['Cd (ug/L)'] * Num
  51. hg_value = nearest_sample['Hg (ug/L)'] * Num
  52. cr_value = nearest_sample['Cr (ug/L)'] * Num
  53. pb_value = nearest_sample['Pb (ug/L)'] * Num
  54. as_value = nearest_sample['As (ug/L)'] * Num
  55. # 将数据行添加到列表中
  56. data_rows.append({
  57. '面要素ID': row['gid'], # 使用数据库中的gid
  58. 'DLMC': row['dlmc'], # 使用数据库中的dlmc字段
  59. '中心点经度': center_lon,
  60. '中心点纬度': center_lat,
  61. '最近采样点ID': nearest_sample.name,
  62. '采样点经度': nearest_sample['经度'],
  63. '采样点纬度': nearest_sample['纬度'],
  64. 'Cd (ug/L)': cd_value,
  65. 'Hg (ug/L)': hg_value,
  66. 'Cr (ug/L)': cr_value,
  67. 'Pb (ug/L)': pb_value,
  68. 'As (ug/L)': as_value
  69. })
  70. # 从列表创建DataFrame
  71. csv_data = pd.DataFrame(data_rows)
  72. # 保存结果为CSV文件
  73. output_dir = Path(__file__).parent.parent / "Data"
  74. output_dir.mkdir(exist_ok=True)
  75. csv_file_path = output_dir / f"四县三用地&{str}_DB.csv"
  76. csv_data.to_csv(csv_file_path, index=False, encoding='utf-8-sig')
  77. print(f"CSV文件已保存至: {csv_file_path}")
  78. print(f"总共处理了 {len(csv_data)} 个 {str} 面要素")