Как проделать подобное в GRASS:
Необходимое условие -- атриут. таблицы векторов должны иметь подключение
не к DBF (например, к SQLite). "Переподключить" атрибут.таблицы можно так:
Код: Выделить всё
db.connect driver=sqlite database=/путь/к/вашей/базе.sqlite
v.db.reconnect.all old_database=$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/ new_database=/путь/к/вашей/базе.sqlite
---------------------------------------------------------------------
Поехали.
-- пусть имеется векторная карта с линиями профилей "profiles" (
1 на картинке), задаём по ней текущий регион
-- создаём в текущем регионе векторную сетку с ячейкой 1x1 км (
2 на картинке)
Код: Выделить всё
v.mkgrid map=grid_1km grid=10,10 position=region
-- разрезаем профили сеткой на отдельные линии (
3 на картинке, каждая линия имеет случайный цвет)
Код: Выделить всё
v.overlay ainput=profiles atype=line binput=grid_1km operator=and out=profiles_parts
-- добавляем в атрибут.таблицу для резанных профилей поле "length" и получаем длину каждой линии
Код: Выделить всё
v.db.addcol map=profiles_parts col="length double"
v.to.db map=profiles_parts option=length col=length
Получается примерно такая таблица:
Код: Выделить всё
cat a_cat b_cat b_row b_col b_rown b_coln length
1 1 1 10 1 J A 428.63861
2 3 4 10 4 J D 245.687834
3 6 28 8 8 H H 607.625541
4 7 71 3 1 C A 461.793565
5 9 95 1 5 A E 929.552621
6 10 25 8 5 H E 379.969092
7 11 73 3 3 C C 628.197767
8 12 29 8 9 H I 479.090412
9 2 2 10 2 J B 294.183353
-- добавляем в атрибут.таблицу для сетки поле "length_sum" и с помощью SQL и группировки по номеру ячейки (GROUP BY) считаем общую длину всех линий в каждой ячейке
Код: Выделить всё
v.db.addcol grid_1km col="length_sum double"
Тут, скорее всего, можно на чистом SQL (погуглил "GROUP BY + INSERT", но так и не дошло), сделал в виде shell-скрипта
Код: Выделить всё
#!/bin/sh
echo "SELECT b_cat,SUM(length) FROM profiles_parts GROUP BY b_cat" | db.select -c | while read line; do
CAT=$(echo "$line" | cut -d"|" -f1)
SUM=$(echo "$line" | cut -d"|" -f2)
echo "UPDATE grid_1km SET length_sum = $SUM WHERE cat = $CAT" | db.execute
done
В итоге атрибут. таблица нашей сетки имеет вид:
Код: Выделить всё
cat row col rown coln length_sum
1 10 1 J A 428.63861
2 10 2 J B 294.183353
3 10 3 J C
4 10 4 J D 245.687834
5 10 5 J E
6 10 6 J F
7 10 7 J G
8 10 8 J H
9 10 9 J I
Вывод на экран -- номер
4 на картинке.

- vector_grid_stats.png (112.36 КБ) 5725 просмотров