gdal. пакетное сохранение каналов растра
- soov
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 17 мар 2018, 11:40
- Репутация: 1
- Откуда: Санкт-Петербург
gdal. пакетное сохранение каналов растра
Здравствуйте. Помогите, пожалуйста.
У меня следующая задача: Есть много растров. Много! Из них нужно вытащить один канал (первый) и соответственно сохранить. Я понимаю, как это сделать по одному снимку используя gdal.
gdalBand = gdalData.GetRasterBand( 1 )
Далее Create()
Но это дико медленно. В итоге перешёл на scanex. Но всё же, понимаю, что это не должно быть сложно... в gdal всё это сделать...
Я пытаюсь создать список растров в txt. Считываю его python' ом, но у меня ничего не выходит.
f = open("list.txt",'r')
image_list = f.read()
открываю
gdal'ом
gdalData = gdal.Open( image_list)
А так оно вообще можно? и куда двигаться? Или это вообще в другую сторону.
Я с языком сильно на вы. Задача ключевая, по форуму искал, но не нашёл, та бы тему конечно же не множил. Помогите, товарищи, строчкой кода.
У меня следующая задача: Есть много растров. Много! Из них нужно вытащить один канал (первый) и соответственно сохранить. Я понимаю, как это сделать по одному снимку используя gdal.
gdalBand = gdalData.GetRasterBand( 1 )
Далее Create()
Но это дико медленно. В итоге перешёл на scanex. Но всё же, понимаю, что это не должно быть сложно... в gdal всё это сделать...
Я пытаюсь создать список растров в txt. Считываю его python' ом, но у меня ничего не выходит.
f = open("list.txt",'r')
image_list = f.read()
открываю
gdal'ом
gdalData = gdal.Open( image_list)
А так оно вообще можно? и куда двигаться? Или это вообще в другую сторону.
Я с языком сильно на вы. Задача ключевая, по форуму искал, но не нашёл, та бы тему конечно же не множил. Помогите, товарищи, строчкой кода.
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: gdal. пакетное сохранение каналов растра
Я бы использовал простой цикл на Питоне или шелле (зависит от ОС) с утилитой <gdal_translate> c параметром "-b 1" для каждого растра.
Пример на шелле:
В случае Питона и GDAL >=2.1 можно ещё так:
https://gis.stackexchange.com/a/237411
Пример на шелле:
Код: Выделить всё
for rast in *.tif; do
gdal_translate -b 1 $rast $(basename $rast .tif)_b1.tif
done
https://gis.stackexchange.com/a/237411
Редактор материалов, модератор форума
- soov
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 17 мар 2018, 11:40
- Репутация: 1
- Откуда: Санкт-Петербург
Re: gdal. пакетное сохранение каналов растра
Александр Мурый, это ок, спасибо. "gdal_translate> c параметром "-b 1" для каждого растра."
Но не подскажите как мне перебрать все растры типа *.tiff, в папке и соответственно и чтобы он сохранял типа в другую директорию, с доп. буквой новой в названии растра или типа того. Стандартным циклом у меня не получается, я так понимаю, gdal должен каждый растр открыть. Или не так?
По subprocess вообще не понял, к чему это.
Но не подскажите как мне перебрать все растры типа *.tiff, в папке и соответственно и чтобы он сохранял типа в другую директорию, с доп. буквой новой в названии растра или типа того. Стандартным циклом у меня не получается, я так понимаю, gdal должен каждый растр открыть. Или не так?
По subprocess вообще не понял, к чему это.
-
- Гуру
- Сообщения: 964
- Зарегистрирован: 22 май 2010, 20:20
- Репутация: 154
Re: gdal. пакетное сохранение каналов растра
В R вашу задачу через библиотеку "raster" можно решить
"многострочно-пошагово" через процедурный for-цикл
(без семейства директив apply и map функциональной парадигмы, которая, конечно, в R славная-таки доминанта - но так "привычно-понятней" и детализировать, и комментировать можно каждый
"шажок"):
Если есть коллеги у вас, которые c R работали, - то помогут его поставить за минут 10-15-ть...
Нет таковых ребят рядом - та и сами можете по-Google'ить и за полчасика-академический чвс справиться... Успеха, Удачи!
"многострочно-пошагово" через процедурный for-цикл
(без семейства директив apply и map функциональной парадигмы, которая, конечно, в R славная-таки доминанта - но так "привычно-понятней" и детализировать, и комментировать можно каждый
"шажок"):
Код: Выделить всё
#Подключаем библиотеку "raster"
library("raster")
#Папка с исходными
InputDir <- file.path("C:", "Input")
#Папка с записываемыми
OutputDir <- file.path("C:", "Output")
#Получаем список исходных
ListInput <- list.files(InputDir, full.names = TRUE)
#Сколько всего исходных
nFiles <- length(ListInput)
#Цикл по списку исходных
for ( i in seq_along(ListInput) ) {
#Имя текущего файла
NameInputRstr <- ListInput [ i ]
#Короткое имя текущего файла
BaseName <- basename( NameInputRstr )
#Читаем исходный
CurrentBrickRstr <- raster::brick( NameInputRstr )
#Извлекаем первый band
BandFirst <- CurrentBrickRstr [[ 1 ]]
#Генерируем короткое имя выходного
NameOutputBand <- paste0( "FirstBand_", BaseName)
#Полное имя выходного
PathNameOutputRstr <- file.path( OutputDir, NameOutputBand )
#Пишем первый band в файл
writeRaster(BandFirst, PathNameOutputRstr, format="GTiff", overwrite=TRUE)
#Удаляем из памяти то, с чем отработали
rm(CurrentBrickRstr)
rm(BandFirst)
#Информационная строка о ходе работы (базовые имена входного, выходного, какой по счёту файл...)
StringPrint <- paste0( BaseName, " ==> ", NameOutputBand, " Counter: ", as.character(i), " from ", as.character(nFiles) )
#Печать информационной строки
print( StringPrint )
}
Нет таковых ребят рядом - та и сами можете по-Google'ить и за полчасика-академический чвс справиться... Успеха, Удачи!
- Игорь Белов
- Гуру
- Сообщения: 2230
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1503
- Откуда: Казань
Re: gdal. пакетное сохранение каналов растра
Александр уже практически ответил на этот вопрос. Добавьте путь к выходным файлам в bash-скрипте:
Код: Выделить всё
for rast in *.tif
do
gdal_translate -b 1 $rast другая_директория/${rast%.*}_b1.tif
done
Получить эмулятор терминала UNIX под Windows очень просто:
[Старт] → [QGIS] → [Setup] и добавить модуль msys.
The purpose of computing is insight, not numbers
-
- Гуру
- Сообщения: 4205
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: gdal. пакетное сохранение каналов растра
А чем плох встроенный в CMD (Windows XP - 10) оператор FOR?
Они, конечно не так крут как bash, но такую незамысловатую работу как перебор файлов, делает превосходно:
Они, конечно не так крут как bash, но такую незамысловатую работу как перебор файлов, делает превосходно:
Код: Выделить всё
for %b in ("исходная_директория\*.tif") do gdal_translate -b 1 "%~fb" "другая_директория\%~nb_b1.%~xb"
- soov
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 17 мар 2018, 11:40
- Репутация: 1
- Откуда: Санкт-Петербург
Re: gdal. пакетное сохранение каналов растра
Игорь Белов, Большое спасибо, работает и быстро.
- soov
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 17 мар 2018, 11:40
- Репутация: 1
- Откуда: Санкт-Петербург
Re: gdal. пакетное сохранение каналов растра
Ещё вопрос, а можно ли таким образом клеить растры, типа один канал с одного, второй и третий канал из другого растра, на выходе получаем типа RGB, экстент у них само-собой идентичный ?
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: gdal. пакетное сохранение каналов растра
Сначала вытащите все нужные каналы из растров, затем "gdal_merge.py -separate".
https://gis.stackexchange.com/a/267949
Редактор материалов, модератор форума
-
- Гуру
- Сообщения: 4205
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: 433
- Откуда: Париж
Re: gdal. пакетное сохранение каналов растра
По моему, формат VRT позволяет виртуально выбирать каналы. И быстрее, и проще оперировать.Александр Мурый писал(а): ↑14 июн 2018, 17:48Сначала вытащите все нужные каналы из растров, затем "gdal_merge.py -separate".
Кроме того, если немного полистать документацию, то где там спрятано и как сделать сборный поканальный виртуальный растр (SimpleSource:).
http://www.gdal.org/gdal_vrttut.html
А уже настроенный виртуальный растр можно и сохранить в реальный через gdal_translate.
- Игорь Белов
- Гуру
- Сообщения: 2230
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1503
- Откуда: Казань
Re: gdal. пакетное сохранение каналов растра
gdalbuildvrt
Просто создайте виртуальную мозаику:
Просто создайте виртуальную мозаику:
Код: Выделить всё
gdalbuildvrt большой_растр.vrt *.tif
The purpose of computing is insight, not numbers
- soov
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 17 мар 2018, 11:40
- Репутация: 1
- Откуда: Санкт-Петербург
Re: gdal. пакетное сохранение каналов растра
Чуть-чуть по-медленнее, пожалуйста, у меня получается две директории:
в одной папке растры - 1 канал. (NIR)
в другой папке растры - 2 канала.(GB)
я сваливаю всё в одну директорию... виртуальный растр, ок, но мне нужно сохранить исходное количество файлов... (количество растров в NIR или RGB)
gdal_merge тоже ок, - но там, как я, на данный момент, понимаю, надо вручную подставлять растры на вход и выход. количество растров непростительное, да оно так работает, но подставлять вручную приходится
Но быть может, есть какая то подстановка, в msys, файлы же переименовать не проблема.
Извините, за незнание. Помогите, плиз...
в одной папке растры - 1 канал. (NIR)
в другой папке растры - 2 канала.(GB)
я сваливаю всё в одну директорию... виртуальный растр, ок, но мне нужно сохранить исходное количество файлов... (количество растров в NIR или RGB)
gdal_merge тоже ок, - но там, как я, на данный момент, понимаю, надо вручную подставлять растры на вход и выход. количество растров непростительное, да оно так работает, но подставлять вручную приходится
Но быть может, есть какая то подстановка, в msys, файлы же переименовать не проблема.
Извините, за незнание. Помогите, плиз...
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 793
- Ваше звание: званий не имею
- Откуда: Москва
Re: gdal. пакетное сохранение каналов растра
Лучше покажите скриншоты, что и где у вас там лежит. Потому что так непонятно.
И ещё раз просьба внятно объяснить, из каких растров у вас должен получаться трёхканальный растр.
И ещё раз просьба внятно объяснить, из каких растров у вас должен получаться трёхканальный растр.
Редактор материалов, модератор форума
- Игорь Белов
- Гуру
- Сообщения: 2230
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1503
- Откуда: Казань
Re: gdal. пакетное сохранение каналов растра
Прям завидую, умеют же люди задавать абстрактные вопросы, таинственно скрывая суть задачи
Ладно. Предположим, имеются две папки, "nir" с одноканальными растрами и "gb" с двухканальными. Каждому растру из одной папки соответствует растр из другой по имени и геометрии. Нужно создать папку "out" и поместить туда растры с теми же именами из трёх каналов в таком порядке: gb 1, gb 2, nir.
Ладно. Предположим, имеются две папки, "nir" с одноканальными растрами и "gb" с двухканальными. Каждому растру из одной папки соответствует растр из другой по имени и геометрии. Нужно создать папку "out" и поместить туда растры с теми же именами из трёх каналов в таком порядке: gb 1, gb 2, nir.
Код: Выделить всё
#!/usr/bin/env bash
mkdir -p out
for p in gb/*.tif
do
gdal_translate -b 1 ${p} tmp1.tif
gdal_translate -b 2 ${p} tmp2.tif
q=$(basename ${p})
gdalbuildvrt -separate tmp.vrt tmp1.tif tmp2.tif nir/${q}
gdal_translate tmp.vrt out/${q}
rm -f tmp*
done
The purpose of computing is insight, not numbers
- soov
- Новоприбывший
- Сообщения: 12
- Зарегистрирован: 17 мар 2018, 11:40
- Репутация: 1
- Откуда: Санкт-Петербург
Re: gdal. пакетное сохранение каналов растра
Задача сводилась к получению растров в False-color (nir, green, blue), и благодаря вам всё отлично работает.
Спасибо большое! Вы лучшие!
Спасибо большое! Вы лучшие!
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 15 гостей