如何自动批量获取土耳其81个省份的VIIRS数据并计算汇总值?
批量处理土耳其省份VIIRS数据的代码调整方案
核心思路
把原代码中针对单个美国区域的逻辑,改成遍历81个省份Shapefile的循环,每个省份重复「加载边界→提取VIIRS数据→计算汇总→收集结果」的流程,最后统一导出Excel。
具体代码调整步骤
1. 搭建循环框架与路径配置
假设你的Shapefile都存放在turkey_provinces文件夹下,命名格式为01.shp、02.shp…81.shp,先构建遍历逻辑:
import os import geopandas as gpd import pandas as pd import rasterio from rasterio.mask import mask # 配置路径 shp_folder = "turkey_provinces" viirs_data_path = "your_viirs_data.tif" # 替换为你的VIIRS数据路径 results_list = [] # 遍历01到81的省份文件 for province_code in [f"{i:02d}" for i in range(1, 82)]: shp_path = os.path.join(shp_folder, f"{province_code}.shp") if not os.path.exists(shp_path): print(f"警告:未找到省份{province_code}的Shapefile,跳过") continue
2. 替换区域加载与数据提取逻辑
把原代码中加载美国边界的部分,替换为当前循环的省份Shapefile,并提取对应范围的VIIRS数据:
# 加载当前省份边界并匹配坐标系 province_gdf = gpd.read_file(shp_path) with rasterio.open(viirs_data_path) as src: province_gdf = province_gdf.to_crs(src.crs) # 提取省份范围内的VIIRS数据 out_image, out_transform = mask(src, province_gdf.geometry, crop=True) # 过滤无效值 viirs_values = out_image[out_image != src.nodata]
3. 复用汇总计算逻辑
直接复用原代码的汇总计算逻辑(比如平均值、总和等),计算当前省份的指标并收集:
# 计算汇总指标(按需调整) province_summary = { "省份代码": province_code, "VIIRS平均值": viirs_values.mean(), "VIIRS总和": viirs_values.sum(), "VIIRS最大值": viirs_values.max(), "有效像素数": len(viirs_values) } results_list.append(province_summary)
4. 统一导出Excel
循环结束后,将所有结果合并为DataFrame并导出:
# 转换为DataFrame并导出 results_df = pd.DataFrame(results_list) results_df.to_excel("土耳其省份VIIRS汇总结果.xlsx", index=False) print("批量处理完成,结果已导出")
关键注意事项
- 坐标系匹配:必须确保VIIRS栅格与Shapefile坐标系一致,代码中已加入
to_crs转换,若仍有问题需手动指定投影参数。 - 无效值处理:不同VIIRS产品的NoData值可能不同(如-9999),需确认
src.nodata是否正确,若不正确可手动替换。 - 异常防护:可在循环中加入
try-except块,避免单个省份处理失败导致程序中断:
try: # 加载边界、提取数据、计算汇总的代码 except Exception as e: print(f"处理省份{province_code}时出错:{str(e)}") continue
- 性能优化:若VIIRS数据量极大,可使用
concurrent.futures实现并行处理,提升运行速度。
内容的提问来源于stack exchange,提问作者ayça tabakoğlu
相关产品推荐
相关产品推荐

