解决不同影像裁剪后栅格数据行列不一致问题

前言

在处理栅格数据时,尽管用同一个矢量文件裁剪栅格数据,不同数据来源的栅格行列数也会出现不一致的情况。如果忽略或解决不好,会导致后续数据处理出现意想不到的误差或错误,尤其是利用编程实现数据处理时。因此,应当首先对栅格行列不一致的数据进行匹配处理,以降低出现BUG的风险。

本文利用Python算法实现栅格数据行列匹配,通过案例说明算法的有效性。

1、思路

利用同一个矢量文件裁剪的栅格数据,尽管会出现栅格行列数不一致的情况,但行列数差别不大,而且通过观察可以看出两个数据行列数的具体差别。

可以选择一个基准数据,将其余数据进行对比与匹配。

添加或删减数据某侧指定的行数或列数,输出与基准数据空间位置相一致的匹配结果。

2、代码实现

这里遥感影像读取主要使用GDAL读取。

# -*- coding: utf-8 -*-
 
import sys
import numpy
 
def DataMacth(in_base_raster, in_mtc_raster, out_raster, rc=[0, 0, 0, 0]):
    '''
    :param in_base_raster:
    :param in_mtc_raster:
    :param out_raster:
    :param rc: <up, down, left, right>
    :return:
    '''
    # 读取基准栅格数据与待匹配栅格数据及其属性参数
    r_in_mtc = ReadRaster(in_mtc_raster)
    r_in_base = ReadRaster(in_base_raster)
    mtcdata = r_in_mtc.data
    nCols = r_in_base.nCols
    nRows = r_in_base.nRows
    geoTrans = r_in_base.geotrans
    srs = r_in_base.srs
    NDV = r_in_mtc.noDataValue
     
    # 新建与基准栅格数据行列一致的空矩阵
    data_new = numpy.zeros((nRows, nCols))
    # 根据指定的行列数进行增添与删减处理
    for m in range(nRows):
        for n in range(nCols):
            if (m < rc[0] or m > nRows - rc[1] - 1) or (n < rc[2] or n > nCols - rc[3] - 1):
                data_new[m][n] = NDV
            else:
                data_new[m][n] = mtcdata[m - rc[0]][n - rc[2]]
 
    # 输出栅格数据
    WriteGTiffFile(out_raster, nRows, nCols, data_new, geoTrans, srs, NDV, gdal.GDT_Float32)
    print("\tSave as: %s" % out_raster)

调用方法与案例:

上述算法函数中的参数之一rc是一个数组类型的参数,即指定的行数或列数,四个数组元素分别表示“up”, “down”, “left”, “right”四个方位

例如:[-1, 0, 0, 0]表示数据上方减去一行。

具体调用方式如下

if __name__ == "__main__":
    rootdir = <input data direction>
    in_base_raster = rootdir + os.sep + r"in_base_raster.tif"
    in_mtc_raster = rootdir + os.sep + r"in_mtc_raster.tif"
    out_raster = rootdir + os.sep + r"out_raster.tif"
    rc=[-1, 1, 0, 0]
    DataMacth(in_base_raster, in_mtc_raster, out_raster, rc=rc)

3、案例

匹配前,基准栅格100 x 125,待匹配栅格101 x 126,像元数值与空间位置均不匹配。

rc = [0, -1, 0, -1]

程序执行后,基准栅格100 x 125,待匹配栅格100 x 125,像元数值与空间位置香匹配。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾城一少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值