Страница 1 из 1
Получение значений пикселей по полигонам
Добавлено: 20 дек 2013, 14:19
xen87
Здравствуйте, уважаемые ГРАССоведы!!!
На сайте Гис-Лаба есть замечательная статья:
"Получение значений пикселей по полигональным профилям из многоканальных растровых данных в Arcview"
Собственно вопрос - можно ли получить такой же результат средствами GRASS ???
Может кто-нить уже решал подобную задачу и готов поделиться решением ...
Заранее спасибо!!!
Re: Получение значений пикселей по полигонам
Добавлено: 20 дек 2013, 15:25
rhot
Первое, что пришло в голову
1) Конвертировать векторные полигоны в растр: v.to.rast
2) Замасковать исходный растр: r.mask
3) Вытащить значения исходного растра в точечный вектор: r.to.vect
4) Экспортировать значения: db.out.ogr
Вышеописанный алгоритм действует только для одной категории вектора и для одного растра (канала снимка).
Далее автоматизируйте сами, через python или GUI.
Re: Получение значений пикселей по полигонам
Добавлено: 20 дек 2013, 16:35
KolesovDmitry
Можно придумать много способов, например тот, который предложил rhot, но многое зависит от того, в каком виде нужно получить результат.
Смущает сама постановка вопроса: в GRASS удобно работать работать с растрами напрямую, есть большое количество модулей в том числе для анализа ДЗЗ, поэтому не очень понятно, зачем вам нужно сделать именно так, как в той статье. Единственное предположение -- для экспорта данных в другое ПО, но в этом случае тем более хочется подробностей о формате выходных данных.
Резюме: сделать так, как вы просите, не трудно. Но вы уверены, что вы хотите именно этого ))? Если вам нужно решить определенную задачу, то лучше описать саму задачу, а если вам нужно экспортировать данные, то лучше описать формат выходных данных.
Re: Получение значений пикселей по полигонам
Добавлено: 20 дек 2013, 17:53
xen87
Если вам нужно решить определенную задачу, то лучше описать саму задачу
Задача: имеется n-ое количество полигонов (в одном шейп-файле) и серия обработанных изображений.
Необходимо: получить значения всех пикселей попадающих в каждый полигон по канально (по серийно).
а если вам нужно экспортировать данные, то лучше описать формат выходных данных
действительное, мне необходимо экспортировать данные по полигонам для дальнейшей стат. обработки.
Как я себе представляю результат экспорта: для каждого полигона отдельный числовой файл следующей структуры:
снимок 1|снимок 2| снимок 3 | . . . . . . .| - заголовок
значение|значение|значение | . . . . . . . | - значения
значение|значение|значение | . . . . . . . | - значения
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Почему ГРАСС: дело в том, что вся подготовка и обработка изображений ведется в ГРАСС, поэтому не хотелось "бегать" ("прыгать") между программами.
Re: Получение значений пикселей по полигонам
Добавлено: 20 дек 2013, 18:22
rhot
ну вот, сохраняйте в один вектор, для каждого канала задавая отдельный атрибут (параметр column).
Re: Получение значений пикселей по полигонам
Добавлено: 20 дек 2013, 19:11
KolesovDmitry
xen87 писал(а): мне необходимо экспортировать данные по полигонам для дальнейшей стат. обработки.
Так под словами "описать задачу" я и имел в виду описать необходимую стат.обработку

(возможно ее можно сделать напрямую в GRASS или в считать данные напрямую из GRASS в R, а уж там -- все что душе угодно). Но не буду вас мучить вопросами, лучше расширю рекомендацию rhot (код на bash, если нужен python или еще что-то --- легко переписать на ваш язык):
Код: Выделить всё
# Предполагаем, что нам нужны данные по растрам B10,B20,B30
BANDS=B10,B20,B30
# Полигоны лежат в растре test
v.to.rast input=test output=test use=cat
# Цикл по категориям
for CATEGORY in $(v.db.select -c map=test col=cat)
do
r.mask input=test maskcat=$CATEGORY
r.to.vect input=test output=tmp feature=point --o
# Пробегаем по всем пикселям, пишем в файл данные с растров
for COORDS in $(v.out.ascii tmp fs=, | cut -d, -f1,2)
do
r.what input=$BANDS east_north=$COORDS
done > RESULT_$CATEGORY.txt
g.remove rast=MASK
done
Здесь я заменил цикл по растрам B* на цикл по пикселям (исходя из предположения, что если у вас растров больше 254, то в один dbf файл не влезет столько полей). В результате на больших растрах все будет работать медленно. Если у вас заведомо небольшое число растров, то db.out.ogr будет лучше, чем r.what.
Re: Получение значений пикселей по полигонам
Добавлено: 21 дек 2013, 22:24
xen87
Большое спасибо rhot за предложенный алгоритм решения задачи!!!
Большое спасибо Дмитрию за приведенный код!!! Потихоньку буду его разбирать, но боюсь, что без помощи уважаемых форумчан мне не справиться )) Поэтому тему пока не закрываю ...