Объединение функций GDALPython

Программы на Python
Ответить
Anonymous
 Объединение функций GDAL

Сообщение Anonymous »

Я пытаюсь прочитать три одноканальных изображения и объединить их в одно трехканальное изображение с помощью gdal/python.
Я нашел рабочее решение, но оно не кажется оптимальным:

Код: Выделить всё

from osgeo import gdal
import numpy as np

red_path = "F:/B4.TIF"
green_path = "F:/B2.TIF"
blue_path = "F:/B1.TIF"

red = gdal.Open(red_path)
gt = red.GetGeoTransform()
prj = red.GetProjection()

red_img = gdal.Open(red_path)
red_band = red_img.GetRasterBand(1)
red_array = red_band.ReadAsArray().astype(np.float32)

green_img = gdal.Open(green_path)
green_band = green_img.GetRasterBand(1)
green_array = green_band.ReadAsArray().astype(np.float32)

blue_img = gdal.Open(blue_path)
blue_band = blue_img.GetRasterBand(1)
blue_array = blue_band.ReadAsArray().astype(np.float32)

driver = gdal.GetDriverByName("GTiff")
driver.Register()

final_img = driver.Create("combined_colors.tiff",
xsize=red_array.shape[1],
ysize=red_array.shape[0],
bands=3,
eType=gdal.GDT_Float32)
final_img.SetGeoTransform(gt)
final_img.SetProjection(prj)

first_band = final_img.GetRasterBand(1)
first_band.WriteArray(red_array)
first_band.SetNoDataValue(np.nan)
first_band.FlushCache()
first_band = None

second_band = final_img.GetRasterBand(2)
second_band.WriteArray(green_array)
second_band.SetNoDataValue(np.nan)
second_band.FlushCache()
second_band = None

third_band = final_img.GetRasterBand(3)
third_band.WriteArray(blue_array)
third_band.SetNoDataValue(np.nan)
third_band.FlushCache()
third_band = None

final_img = None
Теперь я хочу проделать те же действия, но с более чистым синтаксисом, поэтому я попробовал выполнить несколько операций в одной строке, но это больше не работает.

Код: Выделить всё

from osgeo import gdal
import numpy as np

red_path = "F:/B4.TIF"
green_path = "F:/B2.TIF"
blue_path = "F:/B1.TIF"

red = gdal.Open(red_path)
gt = red.GetGeoTransform()
prj = red.GetProjection()

red = gdal.Open(red_path).GetRasterBand(1).ReadAsArray().astype(np.float32)
green = gdal.Open(green_path).GetRasterBand(1).ReadAsArray().astype(np.float32)
blue = gdal.Open(blue_path).GetRasterBand(1).ReadAsArray().astype(np.float32)

driver = gdal.GetDriverByName("GTiff")
driver.Register()

final_img = driver.Create("combined_colors.tiff",
xsize=red.shape[1],
ysize=red.shape[0],
bands=3,
eType=gdal.GDT_Float32)
final_img.SetGeoTransform(gt)
final_img.SetProjection(prj)

final_img.GetRasterBand(1).WriteArray(red)
final_img.GetRasterBand(2).WriteArray(green)
final_img.GetRasterBand(3).WriteArray(blue)
final_img.FlushCache()

final_img = None
Кто-нибудь знает, почему второй код не работает?
Заранее спасибо

Подробнее здесь: https://stackoverflow.com/questions/793 ... -functions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»