Имеется файл содержащий линии профилей и сетка 1х1км. Нужно разбить все профили по сетке, посчитать длину каждых отрезков профилей в ячейке и присвоить сумму всех длин отрезков в ячейке центральной координате ячейки.
т.е. сделать таблицу длин профилей на 1кв.км.
В какой программе легче будет сделать 3 часть вопроса. Установлено и работает ArcGis, все программы OSGeo4W, ArcView3, PostGis.
			
			
													Как сделать таблицу длин профилей на 1 кв.м
- 
				Trace
- Активный участник
- Сообщения: 153
- Зарегистрирован: 14 окт 2009, 05:07
- Репутация: 0
- Откуда: Красноярск
- Контактная информация:
							 Как сделать таблицу длин профилей на 1 кв.м
						Как сделать таблицу длин профилей на 1 кв.м
		
													
							
						
			
			
			
			
			
					Последний раз редактировалось Trace 12 сен 2011, 11:18, всего редактировалось 1 раз.
									
			
						
										
						- 
				Saimon
- Завсегдатай
- Сообщения: 478
- Зарегистрирован: 25 фев 2009, 09:00
- Репутация: 14
- Откуда: Новороссийск-Краснодар-Москва
Re: В какой программе можно сделать...
В свое время я делал такую карту и таблицу с помощью ArcGIS и, если я помню точно, ET Geowizard Tools
			
			
									
						
										
						- 
				Boris
- Гуру
- Сообщения: 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 на картинке.
Редактор материалов, модератор форума
			
						Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 31 гость