Как добавить растры разных размеров в GDAL, чтобы результат был только в пересеченной области


11

Я пишу метод Python, который добавляет два растра и генерирует один выходной растр. По независящим от меня причинам экстенты входных растров отличаются, но они перекрываются.

Можно ли работать исключительно с входными растровыми пикселями, которые перекрываются в 2 перекрывающихся областях, чтобы генерировать мой выходной сигнал таким образом, чтобы экстент выходного растра был только пересекающейся областью двух входных сигналов?

Ответы:


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.