python实现栅格滑动窗口统计值

任务目标:在25km的栅格内统计90m栅格的均值

任务转化:构建一个滑动窗口统计均值

主要代码如下:

def zonal_statisticDEM(zonal_tif, data_tif, out_tif):
    zonal = gdal.Open(zonal_tif)
    if zonal is None:
        print('打开数据' + zonal_tif + '失败!')
        sys.exit(1)
    # 读取栅格数据集的x方向像素数,y方向像素数
    zonal_cols = zonal.RasterXSize
    zonal_rows = zonal.RasterYSize

    data = gdal.Open(data_tif)

    if data is None:
        print('打开数据' + data_tif + '失败!')
        sys.exit(1)
    # 读取栅格数据集的x方向像素数,y方向像素数
    data_cols = data.RasterXSize
    data_rows = data.RasterYSize
    data_band = data.GetRasterBand(1)
    data_img = data_band.ReadAsArray(0, 0, data_cols, data_rows)

    d_col = data_cols / zonal_cols
    d_row = data_rows / zonal_rows

    outimg = np.zeros((zonal_rows, zonal_cols))
    for i in range(zonal_rows):
        for j in range(zonal_cols):
            counts = data_img[int(i * d_row):int((1 + i) * d_row), int(j * d_col):int((1 + j) * d_col)]
            # outimg[i, j] = np.std(counts)
            outimg[i, j] = np.average(counts)
    outimg = outimg.astype(np.float)
    # 创建并输出图像
    driver = zonal.GetDriver()
    outimage = driver.Create(out_tif, zonal_cols, zonal_rows, 1, gdal.GDT_Float32)
    geotransform = zonal.GetGeoTransform()
    im_proj = zonal.GetProjection()
    outimage.SetGeoTransform(geotransform)
    outimage.SetProjection(im_proj)
    # 在写入之前,还需要先引入波段对象
    outBand = outimage.GetRasterBand(1)
    # 波段对象支持直接写入矩阵,两个参数分别为x向偏移和y向偏移
    outBand.WriteArray(outimg, 0, 0)
    # 设定NoData值
    outBand.SetNoDataValue(255)
    outBand.FlushCache()
    outBand.GetStatistics(0, 1)
    outimage = None
    print('数据处理成功')

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值