Как посчитать кол-во объектов каждого ранга

Ответить
bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

Как посчитать кол-во объектов каждого ранга

Сообщение bolotoved » 08 дек 2013, 13:22

Есть точечный векторный слой, в атрибутивной таблице - колонка с годами. Нужно посчитать количество точек приходящихся на каждый год. Пробовал следующие модули и команды GRASS:

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

v.category input=mod14_hmao option=report type=point
v.db.univar table=mod14_hmao column=year
v.to.db -p map=mod14_hmao type=point option=count
Нужного результата не получилю
Получается считать с пом. v.univar и запроса по конкретномку году, но тогда нужно вручную выковыривать значения за каждый год:

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

v.univar -e map=mod14_hmao column=year where="year=2007"
Какую команду нужно использовать, чтобы получить отчет вида:

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

year      point_count
2000     2346
2001     3456
2002     7539
....     ....

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

Re: Как посчитать кол-во объектов каждого ранга

Сообщение rhot » 08 дек 2013, 14:33

Команда db.select:

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

db.select sql="SELECT DISTINCT year, count(*) AS point_count FROM mod14_hmao" driver=pg
Условие: таблицы должны храниться в PostgreSQL :)
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

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

Re: Как посчитать кол-во объектов каждого ранга

Сообщение KolesovDmitry » 08 дек 2013, 14:45

Запрашиваемой команды не знаю, но если команда
bolotoved писал(а):

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

v.univar -e map=mod14_hmao column=year where="year=2007"
делает то, что нужно, то можно просто ее зациклить по годам:

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

for YEAR in $(v.db.select -c mod14_hmao col='year' where="not year is null" | sort -u)
do 
  v.univar -e map=mod14_hmao column=year where="year=$YEAR"
done

bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

Re: Как посчитать кол-во объектов каждого ранга

Сообщение bolotoved » 08 дек 2013, 14:59

rhot писал(а):Условие: таблицы должны храниться в PostgreSQL :)
Это крутоватое условие, особенно для пользователей windows.

bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

Re: Как посчитать кол-во объектов каждого ранга

Сообщение bolotoved » 08 дек 2013, 15:01

KolesovDmitry писал(а):Запрашиваемой команды не знаю, но если команда
bolotoved писал(а):

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

v.univar -e map=mod14_hmao column=year where="year=2007"
делает то, что нужно, то можно просто ее зациклить по годам:

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

for YEAR in $(v.db.select -c mod14_hmao col='year' where="not year is null" | sort -u)
do 
  v.univar -e map=mod14_hmao column=year where="year=$YEAR"
done
Эта команда работает, но на выходе получается неудобоваримое, требующее парсинга:

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

GRASS_INFO_WARNING(3323,1): Incompatible vector type(s) specified, only number of features, minimum, maximum and range can be calculated
GRASS_INFO_END(3323,1)
number of features with non NULL attribute: 2699
number of missing attributes: 114146
number of NULL attributes: 0
minimum: 2000
maximum: 2000
range: 0
sum: 0

GRASS_INFO_WARNING(3332,1): Incompatible vector type(s) specified, only number of features, minimum, maximum and range can be calculated
GRASS_INFO_END(3332,1)
number of features with non NULL attribute: 1208
number of missing attributes: 115637
number of NULL attributes: 0
minimum: 2001
maximum: 2001
range: 0
sum: 0

GRASS_INFO_WARNING(3343,1): Incompatible vector type(s) specified, only number of features, minimum, maximum and range can be calculated
GRASS_INFO_END(3343,1)
number of features with non NULL attribute: 2544
number of missing attributes: 114301
number of NULL attributes: 0
minimum: 2002
maximum: 2002
range: 0
sum: 0

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

Re: Как посчитать кол-во объектов каждого ранга

Сообщение KolesovDmitry » 08 дек 2013, 16:17

bolotoved писал(а):
KolesovDmitry писал(а):Запрашиваемой команды не знаю, но если команда
bolotoved писал(а):

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

v.univar -e map=mod14_hmao column=year where="year=2007"
делает то, что нужно, то можно просто ее зациклить по годам:
Эта команда работает, но на выходе получается неудобоваримое, требующее парсинга:
Нужно просто настроить вывод, например, сказать, что тебе интересны только точки (type=point) и, опционально, вывод в машинно читаемом виде (-g)

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

for YEAR in $(v.db.select -c mod14_hmao col='year' where="not year is null" | sort -u)
do 
  v.univar -g map=mod14_hmao column=year type=point where="year=$YEAR"
done
Полученный вывод будет легко офильтровать:

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

for YEAR in $(v.db.select -c mod14_hmao col='year' where="not year is null" | sort -u)
do 
  v.univar -g map=mod14_hmao column=year type=point where="year=$YEAR"
done | grep "n="
Выглядит не очень удобно для использования, но на этой основе легко сделать свой собственный модуль v.stat.group -- один раз написать код и потом вызывать его по мере надобности.

bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Репутация: 236
Откуда: Ханты-Мансийск
Контактная информация:

Re: Как посчитать кол-во объектов каждого ранга

Сообщение bolotoved » 09 дек 2013, 18:53

Работает, но при grep "n=" много еще лишнего отфильтровывается:

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

n=2699
min=2000
mean=2000
population_coeff_variation=0
n=1208
min=2001
mean=2001
population_coeff_variation=0
n=2544
min=2002
mean=2002
population_coeff_variation=0
n=8253
min=2003
mean=2003
population_coeff_variation=0
Видимо, нужно действительно экспортировать в какую-нибудь БД для запросов...

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

Re: Как посчитать кол-во объектов каждого ранга

Сообщение Александр Мурый » 09 дек 2013, 19:38

bolotoved писал(а):Работает, но при grep "n=" много еще лишнего отфильтровывается:
Видимо, нужно действительно экспортировать в какую-нибудь БД для запросов...
DBF --> SQLite?
Редактор материалов, модератор форума

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

Re: Как посчитать кол-во объектов каждого ранга

Сообщение KolesovDmitry » 09 дек 2013, 20:02

bolotoved писал(а):Работает, но при grep "n=" много еще лишнего отфильтровывается
Можно указать, что "n=" должен быть в начале строки:

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

... | grep "^n="
Или вообще использовать тяжелую артиллерию -- выполнить вывод команды v.univar -g map=mod14_hmao column=year type=point where="year=$YEAR" как программу, тогда вместо вывода на печать

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

n=2699
min=2000
mean=2000
population_coeff_variation=0
...
будет производиться присваивание, т.е. переменным n, min, mean, population_coeff_variation будут назначены соответствующие значения, и с полученными переменными можно делать уже все, что душа пожелает:

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

for YEAR in $(v.db.select -c mod14_hmao col='year' where="not year is null" | sort -u)
do
  eval $(v.univar -g map=mod14_hmao column=year type=point where="year=$YEAR")
  echo $YEAR ---> $n
done

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

Re: Как посчитать кол-во объектов каждого ранга

Сообщение KolesovDmitry » 09 дек 2013, 20:04

Александр Мурый писал(а):
bolotoved писал(а):Работает, но при grep "n=" много еще лишнего отфильтровывается:
Видимо, нужно действительно экспортировать в какую-нибудь БД для запросов...
DBF --> SQLite?
Кстати, вполне себе вариант. В нормальной базе работать гораздо удобнее.

Ответить

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

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

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