GRASS Graphical Modeler для начинающих

Ответить
Vedmed
Участник
Сообщения: 70
Зарегистрирован: 19 янв 2012, 14:48
Репутация: 6

GRASS Graphical Modeler для начинающих

Сообщение Vedmed » 31 май 2017, 12:38

GRASS 7.1
Есть ряд вопросов по график моделеру. Не программист, поэтому со скриптами туго и моделер интуитивно понятнее.
Сначала об обнаруженной проблеме:
1. r.mapcalc отказался воспринимать карты вида map@permanent, но нормально работал с картами вида map. Т.е. тормозился и выдавал ошибку на собаке - @. Почему, не знаю, да это мне и не особо важно, просто вдруг кому пригодится;

Теперь вопросы:
1. Можно ли задавать имена карт не целиком, а частично?
Предположим у меня четыре карты: Name100, Name101, Name200 и Name201. Нужно вычесть бОльшие номера из меньших (newmap1=Name100-Name200 и newmap2=Name 101-Name201) с помощью цикла (loop).
Если использовать переменную %map, которая задается при создании цикла (map in [Name100, Name101, Name200, Name201], то вычесть вторую карту из первой не получится. %map - это имя одной и той же карты на данной итерации цикла. Нелья ли для этого задать часть имени в r.mapcalc (в цикле), например: new.%map=Name1* - Name2* (где * - групповой шаблон для ряда неизвестных символов)?

2. Переменные. Нельзя ли задать в одну переменную несколько значений сразу, чтобы эти значения последовательно подставлялись в цикле?

3. Если, то, иначе - реализованы в моделере?

Vedmed
Участник
Сообщения: 70
Зарегистрирован: 19 янв 2012, 14:48
Репутация: 6

Re: GRASS Graphical Modeler для начинающих

Сообщение Vedmed » 01 июн 2017, 10:05

Сам себе отвечу. Вопрос 1 - решен. Можно подставить в цикл вместо полного имени карт небольшую часть, например (для приведенного примера выше):
1. задаем в loop:
map in [00, 01]
2. выражение в r.mapcalc:
new.%map=Name1%map - Name2%map

Остальные вопросы остаются. Особенно интересует озвученная в мануале возможность if-else в цикле - https://grass.osgeo.org/grass72/manuals ... deler.html
"...define loops (e.g. map series) and conditions (if-else statements)..."

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

Re: GRASS Graphical Modeler для начинающих

Сообщение Александр Мурый » 01 июн 2017, 13:20

Учтите, что моделлер этот сделал по-простому, и ждать многого от него не надо.
Вопрос встречный: а откуда такие требования? Вы в каком-нибудь моделлере такое видели? Например, в том же ArcGIS.
По поводу нескольких значений в переменной - сильно сомневаюсь, но надо пробовать.

Сам моделлером в GRASS не пользовался для дела, только игрался, т.к. для серьёзной работы он не годится. Вы вот уже упёрлись в такие вопросы, что проще написать нормальный скрипт на Питоне.
Редактор материалов, модератор форума

Vedmed
Участник
Сообщения: 70
Зарегистрирован: 19 янв 2012, 14:48
Репутация: 6

Re: GRASS Graphical Modeler для начинающих

Сообщение Vedmed » 02 июн 2017, 13:18

Александр Мурый писал(а):Учтите, что моделлер этот сделал по-простому, и ждать многого от него не надо.
Вопрос встречный: а откуда такие требования? Вы в каком-нибудь моделлере такое видели? Например, в том же ArcGIS.
Эээ... это вообще первый моделер, который я увидел. В АркГИСе работал совсем немного и до таких нюансов не докопался. Напрягла жадность капиталистов из ESRI. Фиг с ней с ценой самой ГИС, но когда приезжает лицензия, а ты не можешь выполнить элементарные действия, вроде сложения-вычитания растров, из-за того, что модуль умеющий это стоит отдельных денег... Не, они может быть и корифеи от геоинформатики, и продукт делают качественный, но совесть тоже надо иметь.


Набросал тут пример по циклам, может кому и будет кстати.
Желающие понять, что происходит, могут обратиться к статье - Краткое описание GRASS Graphical Modeler. Здесь же будет рассмотрен вопрос создания циклов в моделере, позволяющих производить пакетную обработку геоданных. Несмотря на то, что существует пример описания работы с циклами на странице g.gui.gmodeler, этот пример излишне лаконичен и, на наш взгляд, годится больше для опытных пользователей ГИС, нежели для начинающих.
В качестве примера, ниже будет разобран цикл склейки гранул MODIS NDVI в GRASS 7.0-7.1.

Склейку нескольких растров в одно изображение можно произвести с помощью модуля r.patch. Однако, если стоит вопрос склейки, например, 320 растров, относящихся к 160 временным интервалам, задача существенно усложняется. Очевидно, что производить операцию склейки 160 раз, чересчур время- и трудозатратно. На помощь здесь может прийти GRASS Graphical Modeler, позволяющий автоматизировать этот утомительный процесс.

Дальнейшее описание предполагает, что регион GRASS установлен и склеиваемые растры импортированы в проект.
Данные. Названия обрабатываемых растров: NDVI_2000129_v03, NDVI_2000129_v04, NDVI_2000145_v03, NDVI_2000145_v04, NDVI_2000161_v03, NDVI_2000177_v04 и так далее еще 314 раз.
где NDVI - вид данных (геоботанический индекс); 2000129 - год и номер дня года, т.е. время получения данных; v03 - номер гранулы (листа склеиваемого растра).
Все растры являются целочисленными (min = -3000; max = 10000), значению “нет данных” соответствует значение -3000.

Задача состоит в том, чтобы объединить разные гранулы (v03 и v04) одного временного периода друг с другом.
Итак, каким образом создать цикл обработки растров?

1. Необходимо запустить GRASS Graphical Modeler (File > Graphical Modeler);
2. Добавить цикл (выбрать в моделере из меню вверху Model > Add loop/series; можно использовать Ctrl+L), при этом откроется окно настроек цикла (рисунок 1). С помощью кнопки “Series” можно выбрать нужные растры из имеющихся в проекте. Можно также задать условия вручную в строке Condition.
Изображение
Рисунок 1 - Окно настроек цикла в GRASS Graphical Modeler

В нашем случае лучше задать условия вручную, потому что число итераций цикла вдвое меньше, нежели число карт. Соответственно, использовать все имена растров в цикле нельзя (их будет 320, вместо 160). Кроме того, если задать имя растра не полностью, а частично, впоследствии его можно будет дополнить до конкретно нужного при составлении выражений. Сократим имя, убрав из него номер гранулы, тогда название первого растра станет - NDVI_2000129_v, второго - NDVI_2000145_v и т.д.
Следует учесть, что при создании цикла задается и переменная, которая впоследствии может быть использована при составлении выражения. По умолчанию используется переменная map. Тогда наше выражение в строке Condition будет выглядеть как:
map in [NDVI_2000129_v, NDVI_2000145_v, NDVI_2000161_v,...]
где вместо ... - оставшиеся 157 названий растров (“отрезать” им номер гранулы и удалить дубли можно в любом текстовом редакторе или электронных таблицах, а вывести с помощью модуля g.list);
3. Поскольку все растры целочисленные, а NDVI величина дробная, меняющаяся в пределах от -1 до 1, растры нуждаются в калибровке. Чтобы привести значения пикселей к реальной величине геоботанического индекса, нужно умножить их на 0.0001.
Кроме того, значения “-3000” (соответствующие значению “нет данных”) одной гранулы могут перекрывать значения другой гранулы. Чтобы устранить подобные пересечения, следует перевести их в категорию “Null”.
3.1 Выполнить эти действия можно с помощью калькулятора растров - r.mapcalc. Следует добавить его в схему с помощью меню (Model > Add command; или Ctrl+A). В открывшемся окне добавления команд, необходимо указать, что добавляется именно растровый калькулятор (Рисунок 2). После нажатия на ОК, откроется окно растрового калькулятора, где нужно будет задать выражение для расчета. Объединяемых гранулы две и первое выражение будет обсчитывать гранулу v03:
%map_03=0.0001*if(%map03==-3000,1/0,%map03)
где %map - обозначение переменной (для первой итерации цикла это будет NDVI_2000129_v); _03 - дополнение к имени результирующей карты (в этом случае название результирующей карты будет NDVI_2000129_v_03)
После этого нажмите “ОК” и к схеме окажется добавлен блок калькулятора;
Изображение
Рисунок 2 - Добавление растрового калькулятора в схему цикла

3.2 Теперь следует добавить в схему еще один блок растрового калькулятор, для обсчета гранулы v04. Выражение будет следующим:
%map_04=0.0001*if(%map04==-3000,1/0,%map04)
4. Растры готовы для склеивания. Достаточно добавить блок модуля r.patch, в котором именами объединяемых слоев указать: %map_03,%map_04, а результирующим слоем Patch_%map... Точнее, этого было бы достаточно в GRASS версии 7.3, а в GRASS 7.1 название результирующего слоя не может быть взято из переменной. Возникает проблема - цикл работает, но вместо ста шестидесяти изображений создается всего один склеенный растр. Займемся ее решением.
Раз переменная все равно неприемлема, зададим результирующий слой просто как Patch, нажмем “ОК” и перейдем к следующему пункту;
5. Все действия в цикле выполняются последовательно, а значит мы можем воспользоваться другим модулем, для переименования того растра, что выдает r.patch. И пусть r.patch создает 160 раз разные слои под одним и тем же именем, g.rename те же 160 раз их переименует в то название, которое необходимо. Добавим соответствующий блок в схему, указав в качестве переименовываемого и выходного растров:
Patch,Patch_%map
6. Теперь удалим ненужные растры. Воспользуемся для этого модулем g.remove. Создадим блок проставив маркеры напротив силового удаления растровых карт и зададим паттерн поиска удаляемых карт:
*_v_0*
7. Осталось объединить все блоки в цикл. Для этого нужно нажать на первый из них (начало цикла) и проставить маркеры напротив действий объединяемых в цикл (рисунок 3);
Изображение
Рисунок 3 - Окно настроек создания цикла

После этого цикл готов к выполнению (рисунок 4).
Изображение
Рисунок 4 - Схема готового к выполнению цикла

Ну и напоследок, пара моментов способных облегчить работу с моделером:
1. Порядок выполнения блоков можно изменить на вкладке Items (левый нижний угол), выделив нужную команду и передвигая ее вверх-вниз соответствующими кнопками справа;
2. GRASS недружелюбно относится к письменности, организованной не на латинице. В случае возникновения проблем с кодировкой (например, использования подписей или заметок на кириллице в модели), можно открыть файл модели любым текстовым редактором (например, блокнотом) и поправить кодировку в первой строке.

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

Re: GRASS Graphical Modeler для начинающих

Сообщение KolesovDmitry » 26 июл 2017, 10:23

Ничего себе вы сообщение накидали %) Тянет на отдельную статью на сайте. Не хотите дооформить ее?

Vedmed
Участник
Сообщения: 70
Зарегистрирован: 19 янв 2012, 14:48
Репутация: 6

Re: GRASS Graphical Modeler для начинающих

Сообщение Vedmed » 15 авг 2017, 11:30

И рад бы, но со временем засада. А подробно описал, чтобы самому не забыть :D Потом подумал и выложил, вдруг еще кому пригодится.
Какие, кстати, правила по оформлению? Может быть, когда-нибудь, время все же появится...

Ответить

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

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

Сейчас этот форум просматривают: Bing [Bot] и 4 гостя