Як додати растри різного розміру в 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])(що , ймовірно, переверніть один з растрів по діагоналі)?
дас-г

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.