Получение значений пикселей по полигонам

Ответить
xen87
Активный участник
Сообщения: 168
Зарегистрирован: 08 апр 2009, 14:44
Репутация: 18
Откуда: Кострома

Получение значений пикселей по полигонам

Сообщение xen87 » 20 дек 2013, 14:19

Здравствуйте, уважаемые ГРАССоведы!!!
На сайте Гис-Лаба есть замечательная статья: "Получение значений пикселей по полигональным профилям из многоканальных растровых данных в Arcview"
Собственно вопрос - можно ли получить такой же результат средствами GRASS ???
Может кто-нить уже решал подобную задачу и готов поделиться решением ...
Заранее спасибо!!!

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Получение значений пикселей по полигонам

Сообщение rhot » 20 дек 2013, 15:25

Первое, что пришло в голову
1) Конвертировать векторные полигоны в растр: v.to.rast
2) Замасковать исходный растр: r.mask
3) Вытащить значения исходного растра в точечный вектор: r.to.vect
4) Экспортировать значения: db.out.ogr

Вышеописанный алгоритм действует только для одной категории вектора и для одного растра (канала снимка).
Далее автоматизируйте сами, через python или GUI.
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

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

Re: Получение значений пикселей по полигонам

Сообщение KolesovDmitry » 20 дек 2013, 16:35

Можно придумать много способов, например тот, который предложил rhot, но многое зависит от того, в каком виде нужно получить результат.

Смущает сама постановка вопроса: в GRASS удобно работать работать с растрами напрямую, есть большое количество модулей в том числе для анализа ДЗЗ, поэтому не очень понятно, зачем вам нужно сделать именно так, как в той статье. Единственное предположение -- для экспорта данных в другое ПО, но в этом случае тем более хочется подробностей о формате выходных данных.

Резюме: сделать так, как вы просите, не трудно. Но вы уверены, что вы хотите именно этого ))? Если вам нужно решить определенную задачу, то лучше описать саму задачу, а если вам нужно экспортировать данные, то лучше описать формат выходных данных.

xen87
Активный участник
Сообщения: 168
Зарегистрирован: 08 апр 2009, 14:44
Репутация: 18
Откуда: Кострома

Re: Получение значений пикселей по полигонам

Сообщение xen87 » 20 дек 2013, 17:53

Если вам нужно решить определенную задачу, то лучше описать саму задачу
Задача: имеется n-ое количество полигонов (в одном шейп-файле) и серия обработанных изображений.
Необходимо: получить значения всех пикселей попадающих в каждый полигон по канально (по серийно).
а если вам нужно экспортировать данные, то лучше описать формат выходных данных
действительное, мне необходимо экспортировать данные по полигонам для дальнейшей стат. обработки.
Как я себе представляю результат экспорта: для каждого полигона отдельный числовой файл следующей структуры:
снимок 1|снимок 2| снимок 3 | . . . . . . .| - заголовок
значение|значение|значение | . . . . . . . | - значения
значение|значение|значение | . . . . . . . | - значения
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Почему ГРАСС: дело в том, что вся подготовка и обработка изображений ведется в ГРАСС, поэтому не хотелось "бегать" ("прыгать") между программами.

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Получение значений пикселей по полигонам

Сообщение rhot » 20 дек 2013, 18:22

ну вот, сохраняйте в один вектор, для каждого канала задавая отдельный атрибут (параметр column).
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

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

Re: Получение значений пикселей по полигонам

Сообщение KolesovDmitry » 20 дек 2013, 19:11

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.

xen87
Активный участник
Сообщения: 168
Зарегистрирован: 08 апр 2009, 14:44
Репутация: 18
Откуда: Кострома

Re: Получение значений пикселей по полигонам

Сообщение xen87 » 21 дек 2013, 22:24

Большое спасибо rhot за предложенный алгоритм решения задачи!!!
Большое спасибо Дмитрию за приведенный код!!! Потихоньку буду его разбирать, но боюсь, что без помощи уважаемых форумчан мне не справиться )) Поэтому тему пока не закрываю ...

Ответить

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

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

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