Gdal: відсікання растра з іншим


14

Я пишу просту утиліту, щоб обрізати партії растрових файлів багатополосних геотифів на ту саму (меншу) область. Використовуючи gdalwarp, я можу легко обрізати файл за допомогою однофагового відсікання форм-файлу:

gdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif

Однак фактична область, яку я хочу вирізати, завжди спочатку визначатиметься іншим растровим файлом геотифа, а не файлом форми. Було б добре, якби я міг використовувати масштаб цього растру як відсічний файл, але я не знаю, як це зробити. Не дивно, що наступне не працює (воно не викликає помилок, воно просто нічого не створює):

gdalwarp -cutline clipper.tif-crop_to_cutline input.tif output.tif

Отже, моє запитання: чи є спосіб поставити растр gdalwarp -cutline? Крім того, чи існує ще одна функція gdal, яка може вирізати растр за допомогою іншого растру? Якщо жодне з цих варіантів неможливо, чи існує дуже простий спосіб створити файл форми з одного многокутника, визначений мірою растра?

Цей код буде обгорнуто більш широким сценарієм python, тому я можу використовувати або утиліти командного рядка gdal, або будь-яке з прив'язок python для gdal.

Як зауваження, я знаю, що я міг би просто створити відсічний формуляр, який охоплює міру мого растру в QGIS. Я можу зробити це, якщо я не знайду прямого рішення, але в кінцевому підсумку я закінчуся використанням цієї утиліти на десятках, якщо не сотнях областей, як частина великого автоматизованого аналізу, тому я вважаю за краще не мати нудного крок вручну, навіть якщо це дуже легко.

Відповіді:


11

Я не знаю, чи можна відрізати растр з іншим растром, але ви можете використовувати gdaltindex для створення файлу форм у розмірі вашого растру.

http://www.gdal.org/gdaltindex.html


4
gdaltindex прекрасно працює, щоб зробити відсічний формуляр з мого початкового растру. Для вирішення проблеми використання I gdaltindex clipper.shp clipper.tif, а потімgdalwarp -cutline clipper.shp -crop_to_cutline input.tif output.tif
Джо

Я використовував цей підхід, але виявив, що іноді це відключений піксель у відрізаній версії. Я думаю, що простіше обчислити цільові розширення a la Xavier відповідь нижче, а потім використовувати gdalwarp і вказати -te_srs для обробки невідповідних CRS.
Джон

7

Для неправильних багатокутників та припускаючи, що ваш растровий файл geotiff є двійковим растром, ви можете використовувати GDAL_Calc :

GDAL_Calc.py -A Mask.tif -B CutBigImageToClip.tif --outfile=SmallerFile.tif --NoDataValue=0 --Calc="B*(A>0)" 

Цей запит заповнюватиме 0, де Mask.tif <= 0 та BigImage, де Маска> 0. Для цього обидва растра повинні бути однакового розміру комірок, рядків та стовпців. Для витягування тих самих розширень використовуйте GDAL_Translate з -projwin ulx uly lrx lryопцією (поле вказано в проектованих координатах), але переконайтесь, що поле projwin не поширюється на краї будь-якого растру.

GDAL_Translate -of GTIFF -projwin ulx uly lrx lry BigImageToClip.tif CutBigImageToClip.tif

Заміщення значень для вікна projwin, отриманого з маски.


1
+1 Це корисна інформація, але я думаю, що я можу вирішити свою проблему за кілька кроків, використовуючи відповідь @ lejedi.
Джо

4

Рішення в Python безпосередньо, не створюючи форми:

import gdal
from gdalconst import GA_ReadOnly

data = gdal.Open('img_mask.tif', GA_ReadOnly)
geoTransform = data.GetGeoTransform()
minx = geoTransform[0]
maxy = geoTransform[3]
maxx = minx + geoTransform[1] * data.RasterXSize
miny = maxy + geoTransform[5] * data.RasterYSize
call('gdal_translate -projwin ' + ' '.join([str(x) for x in [minx, maxy, maxx, miny]]) + ' -of GTiff img_orig.tif img_out.tif', shell=True)

1
Примітка: Це рішення працює лише в тому випадку, якщо вони знаходяться в одній SRS.
Скіліон

@Skylion Але ви можете легко пояснити це, включивши опцію -te_srs, хоча вам також потрібно gdalwarp замість параметра -te.
Джон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.