Читання, модифікація та запис геотифа з GDAL в python


11

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

Будь-які коментарі чи пропозиції вітаються, але особливо зауважують, чому маніпульований растр не відображається в результаті.

import os
import gdal

gdal.AllRegister()

file = "c:\~\LC81980242015071LGN00.tiff"
(fileRoot, fileExt) = os.path.splitext(file)
outFileName = fileRoot + "_mod" + fileExt

ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()

[cols, rows] = arr.shape
arr_min = arr.Min()
arr_max = arr.Max()
arr_mean = int(arr.mean())

arr_out = numpy.where((arr < arr_mean), 10000, arr)

driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outband = outdata.GetRasterBand(1)
outband.WriteArray(arr_out)
outdata = None

print arr_min
> 0
print arr_max
> 65535
print arr_mean
> 4856

Я використовую Python 2.7.1 на 32-бітній машині Windows 7.


Я змусив його працювати над DEM (Ubuntu, python 2.7.1), і він дав очікуваний результат, при цьому все нижче середнього значення встановлено на 10000 і записано до нового tiff. Ви не копіюєте геотрансформацію на нове зображення, щоб воно було непроектоване, тому вам, можливо, знадобиться це врахувати, намагаючись переглянути його (для цього є однолінійка, але мені потрібно це викопати). Якщо ви можете відредагувати своє запитання з результатами gdainfo -stats original.tiffта gdal-config --versionнадто, що може допомогти.
Стівен Кей

Привіт, дякую за те, що вивчив це! Я знаю, що нехтував геотрансформою, думав пережовувати це пізніше. Я бачу все вихідне зображення, хоча (використовуючи Irfanview), так що це не може бути, я думаю. Я згенерую інформацію, яку ви запитували, коли я сьогодні завітаю на своє місце.
Ганс Ролофсен

Привіт, я намагаюся надати інформацію, яку ви запитували. Я використовую прив'язку Python GDAL, і я не впевнений, як вказані вами команди відповідають команді Python. У будь-якому випадку, я використовую GDAL-1.11.2-cp27-none-win32, як придбано звідси . Я оновлю свою публікацію деякими статистичними даними щодо оригіналу .tiff.
Ганс Ролофсен

що буде arr_min?
fluidmotion

arr_min = 0. Я оновив публікацію, щоб це показати. Дякую!
Ганс Ролофсен

Відповіді:


13

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

import os
import gdal

file = "path+filename"
ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()
[cols, rows] = arr.shape
arr_min = arr.min()
arr_max = arr.max()
arr_mean = int(arr.mean())
arr_out = numpy.where((arr < arr_mean), 10000, arr)
driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outdata.SetGeoTransform(ds.GetGeoTransform())##sets same geotransform as input
outdata.SetProjection(ds.GetProjection())##sets same projection as input
outdata.GetRasterBand(1).WriteArray(arr_out)
outdata.GetRasterBand(1).SetNoDataValue(10000)##if you want these values transparent
outdata.FlushCache() ##saves to disk!!
outdata = None
band=None
ds=None

Відхилення не проектується. Я читаю файл HDF5 і вибираю проекцію з діапазону, який я хочу експортувати, GetProjection()доставляє правильний EPSG, але він, здається, не застосовується. GDAL деформація відсутня? Дякую!
Майкл

на що мені слід замінити, outdata.GetRasterBand(1).WriteArray(arr_out)щоб написати багатоспектральне зображення, яке містить більше однієї смуги?
Сай Кіран

"1" у драйвері.Create () вказує кількість діапазонів. Тоді ви можете писати на кожен діапазон за допомогою outdata.GetRasterBand (band_number). Починається з 1, а не з нуля.
Андреа Массетті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.