基于python对栅格数据批量分区统计

基于python对栅格数据批量分区统计

前言

如何基于python对tif格式的栅格数据批量进行分区统计。使用 Python 对 .tif 格式的栅格数据进行批量分区统计,通常可以通过 rasterio 和 numpy 等库来实现。具体步骤包括读取栅格数据、进行分区处理(如基于掩膜或特定区域划分),然后计算统计信息(如均值、最大值、最小值等)。以下是实现这一流程的典型代码框架:


一、主要步骤

读取栅格文件:使用 rasterio 来加载 .tif 栅格数据。
定义分区掩膜:可以根据已有的矢量边界文件(如 .shp 文件)或自定义掩膜对栅格数据进行区域划分。
分区统计:对每个区域进行统计分析,如均值、最大值、最小值等。

二、使用步骤

1.代码

# -*- encoding:utf-8 -*-

import geopandas as gpd
import rasterio
from rasterio.mask import mask
import numpy as np
import pandas as pd
import os

# 读取shapefile文件
shp_path = r'shp数据.shp'
gdf = gpd.read_file(shp_path)

# 获取FID字段
fid_field = 'Ecosystem'  # 根据你的shapefile的FID字段名称进行修改

# 存放结果的列表
results = []

# 读取每年的tif文件夹路径
tif_folder = r'tif数据'
tif_files = [os.path.join(tif_folder, f) for f in os.listdir(tif_folder) if f.endswith('.tif')]

# 遍历所有tif文件
for tif_file in tif_files:
    year = os.path.basename(tif_file).split('.')[0]  # 假设文件名包含年份信息

    # 打开tif文件
    with rasterio.open(tif_file) as src:
        # 遍历每个FID对应的geometry
        for _, row in gdf.iterrows():
            geom = [row['geometry']]
            fid = row[fid_field]

            # 裁剪栅格数据
            out_image, out_transform = mask(src, geom, crop=True)
            out_image = out_image[0]  # 提取第一个波段

            # 计算非空像元的均值
            if np.any(out_image):
                mean_value = np.mean(out_image[out_image != src.nodata])
            else:
                mean_value = np.nan
#def batch_process_rasters(raster_dir, shp_path):
  #  results = []
   # for filename in os.listdir(raster_dir):
   #     if filename.endswith(".tif"):
      #      raster_path = os.path.join(raster_dir, filename)
       #     masked_raster = mask_raster_with_shapefile(raster_path, shp_path)
       #     stats = calculate_statistics(masked_raster)
         #   results.append({
         #       'file': filename,
          #      'mean': stats[0],
          #      'max': stats[1],
           #     'min': stats[2]
       #     })
   # return results


            # 保存结果
            results.append({
                'FID': fid,
                'Year': year,
                'Mean': mean_value
            })

# 将结果转换为DataFrame并保存为CSV
df = pd.DataFrame(results)
df.to_csv(r'F:\output.csv', index=False)

print("统计完成,结果已保存到output.csv")

解释:

read_raster 函数:用于读取 .tif 栅格文件的第一波段数据。
read_shapefile 函数:读取分区掩膜的矢量文件(例如 .shp 文件),用于后续的区域裁剪。
mask_raster_with_shapefile 函数:将矢量文件作为掩膜,裁剪栅格文件,从而对特定区域进行分析。
calculate_statistics 函数:针对每个裁剪后的栅格区域,计算统计信息(如均值、最大值、最小值)。
batch_process_rasters 函数:对多个 .tif 文件批量进行处理,并计算每个文件的分区统计值。

依赖库:

rasterio:用于读取和操作栅格数据。
geopandas:用于处理矢量数据(如 .shp 文件)。
numpy:用于计算统计信息。

注意事项:

NoData 值处理:代码中假设栅格文件存在 NoData 值(如 -9999),统计计算时需排除这些值。
分辨率匹配:确保栅格和矢量文件的坐标参考系相同,避免出现坐标系统不匹配的情况。
批量处理:通过遍历目录实现对多个 .tif 文件的批量处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值