Как сделать таблицу длин профилей на 1 кв.м

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
Ответить
Trace
Активный участник
Сообщения: 153
Зарегистрирован: 14 окт 2009, 05:07
Репутация: 0
Откуда: Красноярск
Контактная информация:

Как сделать таблицу длин профилей на 1 кв.м

Сообщение Trace » 09 сен 2011, 06:46

Имеется файл содержащий линии профилей и сетка 1х1км. Нужно разбить все профили по сетке, посчитать длину каждых отрезков профилей в ячейке и присвоить сумму всех длин отрезков в ячейке центральной координате ячейки.
т.е. сделать таблицу длин профилей на 1кв.км.
В какой программе легче будет сделать 3 часть вопроса. Установлено и работает ArcGis, все программы OSGeo4W, ArcView3, PostGis.
Последний раз редактировалось Trace 12 сен 2011, 11:18, всего редактировалось 1 раз.

Saimon
Завсегдатай
Сообщения: 478
Зарегистрирован: 25 фев 2009, 09:00
Репутация: 14
Откуда: Новороссийск-Краснодар-Москва

Re: В какой программе можно сделать...

Сообщение Saimon » 09 сен 2011, 09:09

В свое время я делал такую карту и таблицу с помощью ArcGIS и, если я помню точно, ET Geowizard Tools

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: В какой программе можно сделать...

Сообщение Boris » 09 сен 2011, 12:51

За остальные программы не скажу, но в мапинфо делается в три шага:
а) разрезать (Split) профили сеткой, если она полигональная
б) пространственный запрос на полученные участки целиком входящие в каждую ячейку - получите результат виртуальную таблицу - на каждую ячейку по несколько строк профилей с их атрибутами, в то числе, если скажете, то и длинной
в) агрегирующий запрос по номеру ячейки с суммированием длин линий
PS
Да, я тут все расписал, все предполагая, что речь идет о двух векторных слоях.

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

Re: В какой программе можно сделать...

Сообщение Александр Мурый » 11 сен 2011, 23:16

Как проделать подобное в 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 на картинке), задаём по ней текущий регион

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

g.region vect=profiles

-- создаём в текущем регионе векторную сетку с ячейкой 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
vector_grid_stats.png (112.36 КБ) 5713 просмотров
Редактор материалов, модератор форума

Ответить

Вернуться в «Общий - ПО»

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

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