Страница 1 из 1

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

Добавлено: 08 дек 2013, 13:22
bolotoved
Есть точечный векторный слой, в атрибутивной таблице - колонка с годами. Нужно посчитать количество точек приходящихся на каждый год. Пробовал следующие модули и команды 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
....     ....

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

Добавлено: 08 дек 2013, 14:33
rhot
Команда db.select:

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

db.select sql="SELECT DISTINCT year, count(*) AS point_count FROM mod14_hmao" driver=pg
Условие: таблицы должны храниться в PostgreSQL :)

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

Добавлено: 08 дек 2013, 14:45
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

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

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

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

Добавлено: 08 дек 2013, 15:01
bolotoved
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

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

Добавлено: 08 дек 2013, 16:17
KolesovDmitry
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 -- один раз написать код и потом вызывать его по мере надобности.

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

Добавлено: 09 дек 2013, 18:53
bolotoved
Работает, но при 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
Видимо, нужно действительно экспортировать в какую-нибудь БД для запросов...

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

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

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

Добавлено: 09 дек 2013, 20:02
KolesovDmitry
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

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

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