如何在GDAL中添加不同大小的栅格,以便结果仅在相交的区域中


11

我正在编写一个添加两个栅格并生成单个栅格输出的Python方法。由于我无法控制的原因,输入栅格的范围不同,但是它们确实重叠。

是否可以仅对在两个重叠区域中重叠的输入栅格像素进行运算以生成输出,使得输出栅格范围仅是两个输入的相交区域?

Answers:


12

首先要做的是确定地理空间坐标中的重叠矩形。为此,您需要获取每个源图像的地理转换:

gt1 = ds1.GetGeoTransform()
# r1 has left, top, right, bottom of dataset's bounds in geospatial coordinates.
r1 = [gt1[0], gt1[3], gt1[0] + (gt1[1] * ds1.RasterXSize), gt1[3] + (gt1[5] * ds1.RasterYSize)]

# Do the same for dataset 2 ...

intersection = [max(r1[0], r2[0]), min(r1[1], r2[1]), min(r1[2], r2[2]), max(r1[3], r2[3])]

然后,通过减去顶部和左侧坐标并除以像素大小,将该矩形转换为每个图像的像素,然后四舍五入。

在这里,您可以调用ReadRaster()每个图像,为其提供刚刚计算出的像素范围:

band.ReadRaster(px1[0], px1[1], px1[2] - px1[0], px1[3] - px1[1], px1[2] - px1[0], px1[3] - px1[1],
                # <band's datatype here>
)

我有点累,所以如果这没有什么意义,请告诉我!


这对于具有不同投影的栅格(也称为坐标参考系统/空间参考系统)也适用吗?并且即使预测是相同的:如果gt1[1]gt2[1](或gt1[5]gt2[5])具有相反的符号,这是否也有效?(这将翻转栅格的一个垂直或水平,我想。)或者,如果abs(gt1[2])abs(gt1[4])比也大abs(gt1[1])abs(gt1[5]),但abs(gt2[2])abs(gt2[4])比小abs(gt2[1])abs(gt2[5])(这可能会翻转栅格的一个对角线)?
das-g

6

相交的第三个元素应为min(r1 [2],r2 [2]):

intersection = [max(r1[0], r2[0]), min(r1[1], r2[1]), min(r1[2], r2[2]), max(r1[3], r2[3])]

另外,我将建议一些逻辑来检查数据集是否真正相交。

这是一种方法:

if (intersection[2] < intersection[0]) or (intersection[1] < intersection[3]):
    intersection = None
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.