Как сделать таблицу длин профилей на 1 кв.м
-
- Активный участник
- Сообщения: 153
- Зарегистрирован: 14 окт 2009, 05:07
- Репутация: 0
- Откуда: Красноярск
- Контактная информация:
Как сделать таблицу длин профилей на 1 кв.м
Имеется файл содержащий линии профилей и сетка 1х1км. Нужно разбить все профили по сетке, посчитать длину каждых отрезков профилей в ячейке и присвоить сумму всех длин отрезков в ячейке центральной координате ячейки.
т.е. сделать таблицу длин профилей на 1кв.км.
В какой программе легче будет сделать 3 часть вопроса. Установлено и работает ArcGis, все программы OSGeo4W, ArcView3, PostGis.
т.е. сделать таблицу длин профилей на 1кв.км.
В какой программе легче будет сделать 3 часть вопроса. Установлено и работает ArcGis, все программы OSGeo4W, ArcView3, PostGis.
Последний раз редактировалось Trace 12 сен 2011, 11:18, всего редактировалось 1 раз.
-
- Завсегдатай
- Сообщения: 478
- Зарегистрирован: 25 фев 2009, 09:00
- Репутация: 14
- Откуда: Новороссийск-Краснодар-Москва
Re: В какой программе можно сделать...
В свое время я делал такую карту и таблицу с помощью ArcGIS и, если я помню точно, ET Geowizard Tools
-
- Гуру
- Сообщения: 4231
- Зарегистрирован: 10 апр 2006, 22:34
- Репутация: -344969098
- Откуда: Париж
Re: В какой программе можно сделать...
За остальные программы не скажу, но в мапинфо делается в три шага:
а) разрезать (Split) профили сеткой, если она полигональная
б) пространственный запрос на полученные участки целиком входящие в каждую ячейку - получите результат виртуальную таблицу - на каждую ячейку по несколько строк профилей с их атрибутами, в то числе, если скажете, то и длинной
в) агрегирующий запрос по номеру ячейки с суммированием длин линий
PS
Да, я тут все расписал, все предполагая, что речь идет о двух векторных слоях.
а) разрезать (Split) профили сеткой, если она полигональная
б) пространственный запрос на полученные участки целиком входящие в каждую ячейку - получите результат виртуальную таблицу - на каждую ячейку по несколько строк профилей с их атрибутами, в то числе, если скажете, то и длинной
в) агрегирующий запрос по номеру ячейки с суммированием длин линий
PS
Да, я тут все расписал, все предполагая, что речь идет о двух векторных слоях.
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: В какой программе можно сделать...
Как проделать подобное в GRASS:
Необходимое условие -- атриут. таблицы векторов должны иметь подключение не к DBF (например, к SQLite). "Переподключить" атрибут.таблицы можно так:
---------------------------------------------------------------------
Поехали.
-- пусть имеется векторная карта с линиями профилей "profiles" (1 на картинке), задаём по ней текущий регион
-- создаём в текущем регионе векторную сетку с ячейкой 1x1 км (2 на картинке)
-- разрезаем профили сеткой на отдельные линии (3 на картинке, каждая линия имеет случайный цвет)
-- добавляем в атрибут.таблицу для резанных профилей поле "length" и получаем длину каждой линии
Получается примерно такая таблица:
-- добавляем в атрибут.таблицу для сетки поле "length_sum" и с помощью SQL и группировки по номеру ячейки (GROUP BY) считаем общую длину всех линий в каждой ячейке
Тут, скорее всего, можно на чистом SQL (погуглил "GROUP BY + INSERT", но так и не дошло), сделал в виде shell-скрипта
В итоге атрибут. таблица нашей сетки имеет вид:
Вывод на экран -- номер 4 на картинке.
Необходимое условие -- атриут. таблицы векторов должны иметь подключение не к 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 на картинке.
Редактор материалов, модератор форума
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя