GRASS, привязка и bash-скрипт

Ответить
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

GRASS, привязка и bash-скрипт

Сообщение Александр Мурый » 27 фев 2010, 22:37

Представим "картину маслом":
- есть 100.. растров (пусть здесь это *jpg), их надо привязать в GRASS. Поехали:

1. Пакетный импорт растров в отдельные области (X,Y) для последующей
привязки:

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

> cd ~/папка_с_растрами/
> for file in ./*jpg; do r.in.gdal input=$file output=$(basename $file) \ 
location=$file -e; done
2. Заходим по очереди в созданные области с растрами (*.red,*.green,*.blue),
подгоняем текущий регион под размеры растров:

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

#!/bin/sh
for raster in $(g.mlist type=rast pattern=*); do g.region rast=$raster; done

echo `g.region -g`

eval `g.gisenv`

r.composite -d levels=32 red=$(g.mlist type=rast pattern=*red) \
green=$(g.mlist type=rast pattern=*green) \
blue=$(g.mlist type=rast pattern=*blue) output=$LOCATION_NAME.RGB

for raster in $(g.mlist type=rast pattern=*); do g.region rast=$raster; done
ВОПРОС: как соединить шаги 1 и 2 в один шелл-скрипт с автоматическим заходом по очереди во все XY области? а то мышка уже дымится.

Пробовал играть с переменными $LOCATION и $MAPSET -- чего-то не выходит.

Буду благодарен за помощь.
Редактор материалов, модератор форума

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: GRASS, привязка и bash-скрипт

Сообщение KolesovDmitry » 02 мар 2010, 10:10

amuriy писал(а): - есть 100.. растров (пусть здесь это *jpg), их надо привязать в GRASS.
1. Пакетный импорт растров в отдельные области (X,Y) для последующей
привязки:
2. Заходим по очереди в созданные области с растрами (*.red,*.green,*.blue),
подгоняем текущий регион под размеры растров

ВОПРОС: как соединить шаги 1 и 2 в один шелл-скрипт с автоматическим заходом по очереди во все XY области?
Чтобы зайти в нужный MAPSET, LOCATION и DATABASE, достаточно при вызове GRASS указать полный путь, например:

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

grass /home/laboro/grass/topo/PERMANENT/
Встречный вопрос: если вы собираетесь привязывать растры, то зачем их импортировать в разные области XY? Импортируйте все в одну и в ней работайте.

Пара замечаний по поводу скриптов.
1.1 Строка

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

r.in.gdal input=$file output=$(basename $file) location=$file -e
уже создает область, подогнанную под растр. Какова же тогда цель второго скрипта? Может, создание композитного слоя?
1.2 Лучше писать не

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

for file in ./*jpg
do
   r.in.gdal input=$file output=$(basename $file) 
....
а

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

for file in ./*jpg
do
   r.in.gdal input=$file output=$(basename $file .jpg) 
....
поскольку

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

file="/home/rastr.jpg"
(basename $file) == rastr.jpg
(basename $file .jpg) == rastr
2.1 Строка

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

for raster in $(g.mlist type=rast pattern=*); do g.region rast=$raster; done
последовательно пробегает по всем растрам и последовательно подгоняет разрешение и охват под каждый растр. В результате выполнения строки разрешение и охват области будут соответствовать разрешению и охвату последнего растра.
2.2 Строка

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

r.composite -d levels=32 red=$(g.mlist type=rast pattern=*red) ...
не сработает, если в текущей области есть несколько растров, оканчивающихся на *red

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: GRASS, привязка и bash-скрипт

Сообщение Александр Мурый » 02 мар 2010, 13:43

Дмитрий, спасибо за подробный ответ, все пойдет в дело.
если вы собираетесь привязывать растры, то зачем их импортировать в разные области XY?
Я просто погорячился, теперь осознал, что все растры можно "валить" в одну область.

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

r.composite -d levels=32 red=$(g.mlist type=rast pattern=*red) ...
не сработает, если в текущей области есть несколько растров, оканчивающихся на *red
Использовать basename?

Подскажите, правильно я понял алгоритм или нет?
1. Экспорт всех растров в одну область XY.
Получается куча групп {*red, *green, *blue} для jpg/tiff/png... и просто растр для *gif.
2. Последовательный "подгон" региона под разрешение и размер каждой группы {*red, *green, *blue} и создание RGB растров. Наверно, можно сразу i.group --> включить только RGB-растр (чтоб не засорять)
3. Открываем область, куда будем привязывать --> привязываем;)
Редактор материалов, модератор форума

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: GRASS, привязка и bash-скрипт

Сообщение KolesovDmitry » 02 мар 2010, 15:59

amuriy писал(а): Использовать basename?
Наверное, можно, но, мне кажется проще будет перебрать все имена в цикле:

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

for map in `g.mlist rast pat="*red"`
do
 сделать то, что нужно, используя имя $map
done
amuriy писал(а): Подскажите, правильно я понял алгоритм или нет?
1. Экспорт всех растров в одну область XY.
Получается куча групп {*red, *green, *blue} для jpg/tiff/png... и просто растр для *gif.
2. Последовательный "подгон" региона под разрешение и размер каждой группы {*red, *green, *blue} и создание RGB растров. Наверно, можно сразу i.group --> включить только RGB-растр (чтоб не засорять)
3. Открываем область, куда будем привязывать --> привязываем;)
Я понял все, кроме фразы "можно сразу i.group --> включить только RGB-растр (чтоб не засорять)". Если ее не учитывать, то алгоритм, вероятно, такой.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: GRASS, привязка и bash-скрипт

Сообщение Александр Мурый » 02 мар 2010, 16:43

Еще раз спасибо.

"можно сразу i.group --> включить только RGB-растр (чтоб не засорять)" =
= "после создания RGB для всех растров отмечаем в группы для последующей привязки только эти RGB, а не все {*red, *green, *blue}, чтобы не замусоривать конечную область привязанными {*red, *green, *blue}" ;)

Сорри, это были мысли вслух.
Редактор материалов, модератор форума

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: GRASS, привязка и bash-скрипт

Сообщение KolesovDmitry » 02 мар 2010, 20:53

amuriy писал(а): = "после создания RGB для всех растров отмечаем в группы для последующей привязки только эти RGB, а не все {*red, *green, *blue}, чтобы не замусоривать конечную область привязанными {*red, *green, *blue}" ;)
Тогда еще один коментарий: при импорте многоканального растра автоматически создается группа с нужным именем, содержащая все каналы. Поэтому делать i.group необходимости нет.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

[SOLVED] GRASS, привязка и bash-скрипт

Сообщение Александр Мурый » 22 авг 2010, 17:42

Действующий вариант для создания серии растров RGB из кучи *jpg, импортированных в одну область:

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

for raster in `g.mlist rast pat="*red" | sed 's/.red//g'` ; do g.region rast=$raster.red ; r.composite -d \
red=$raster.red green=$raster.green blue=$raster.blue output=`echo $raster.rgb ; done
Потом (для гурманов) можно поменять все символы "-" в названиях на "_":

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

for maps in `g.mlist rast pat="*rgb"` ; do g.rename rast=$maps,`echo $maps | sed 's/-/_/g'` ; done
Затем убираем все {*red, *green, *blue} - растры из групп и добавляем туда только *rgb

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

for groups in `g.mlist group` ; do i.group -r group=$groups input=$groups.red,$groups.green,$groups.blue ; 
i.group group=$groups input=`echo $groups | sed 's/-/_/g'`.rgb ; done
Редактор материалов, модератор форума

Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей