12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import os
- import sys
- import pandas as pd
- from shapely.geometry import Point
- import numpy as np
- from pathlib import Path
- # 添加项目根目录到Python路径
- project_root = Path(__file__).parent.parent.parent
- sys.path.append(str(project_root))
- # 导入数据库服务
- from app.services.land_use_service import land_use_service
- # 设置要处理的土地类型
- str = "旱地"
- # 从数据库获取土地利用数据,替代原来的SHP文件读取
- print(f"从数据库获取 '{str}' 类型的土地利用数据...")
- land_centers_df = land_use_service.get_land_centers_for_processing(str)
- if land_centers_df is None or land_centers_df.empty:
- print(f"数据库中没有找到 '{str}' 类型的土地利用数据")
- exit(1)
- print(f"从数据库获取到 {len(land_centers_df)} 个 '{str}' 类型的土地数据")
- # 读取 xls 文件
- xls_file = r"..\Data\Irrigation_water_SamplingPoint.xlsx"
- df_xls = pd.read_excel(xls_file)
- # 不再需要为GeoDataFrame添加字段,直接处理数据即可
- # 根据面要素类型设置系数
- A = 711 * 0.524
- B = 427 * 0.599
- C = 200 * 0.7
- Num = 0.0
- if str == "水浇地":
- Num = B
- elif str == "水田":
- Num = A
- else:
- Num = C
- # 创建一个空列表来存储数据行
- data_rows = []
- # 遍历面要素,使用数据库中的中心点坐标
- for index, row in land_centers_df.iterrows():
- # 直接使用数据库中已经转换好的WGS84坐标
- center_lon = row['center_lon']
- center_lat = row['center_lat']
- center_transformed = Point(center_lon, center_lat)
-
- # 计算面要素中心与采样点的距离
- distances = df_xls.apply(lambda x: center_transformed.distance(Point(x['经度'], x['纬度'])), axis=1)
-
- # 找到距离最近的采样点
- min_distance_index = distances.idxmin()
- nearest_sample = df_xls.loc[min_distance_index]
-
- # 计算最近采样点的重金属含量,并乘以系数Num
- cd_value = nearest_sample['Cd (ug/L)'] * Num
- hg_value = nearest_sample['Hg (ug/L)'] * Num
- cr_value = nearest_sample['Cr (ug/L)'] * Num
- pb_value = nearest_sample['Pb (ug/L)'] * Num
- as_value = nearest_sample['As (ug/L)'] * Num
-
- # 将数据行添加到列表中
- data_rows.append({
- '面要素ID': row['gid'], # 使用数据库中的gid
- 'DLMC': row['dlmc'], # 使用数据库中的dlmc字段
- '中心点经度': center_lon,
- '中心点纬度': center_lat,
- '最近采样点ID': nearest_sample.name,
- '采样点经度': nearest_sample['经度'],
- '采样点纬度': nearest_sample['纬度'],
- 'Cd (ug/L)': cd_value,
- 'Hg (ug/L)': hg_value,
- 'Cr (ug/L)': cr_value,
- 'Pb (ug/L)': pb_value,
- 'As (ug/L)': as_value
- })
- # 从列表创建DataFrame
- csv_data = pd.DataFrame(data_rows)
- # 保存结果为CSV文件
- output_dir = Path(__file__).parent.parent / "Data"
- output_dir.mkdir(exist_ok=True)
- csv_file_path = output_dir / f"四县三用地&{str}_DB.csv"
- csv_data.to_csv(csv_file_path, index=False, encoding='utf-8-sig')
- print(f"CSV文件已保存至: {csv_file_path}")
- print(f"总共处理了 {len(csv_data)} 个 {str} 面要素")
|