Страница 1 из 2
					
				Подписи линий, точек и т.д.
				Добавлено: 21 сен 2010, 12:28
				 Александр Мурый
				Trace спросил:
Возможно ли в Грасс подписать пикеты, расположенные вдоль профилей, перпендикулярно профилям, не задавая никаких полей? или есть какой-нить скрипт, в котором в таблицу с точками занесутся углы поворота подписей, чтобы они были перпендикулярны профилям? ну или хотя бы параллельны?
Если кратко: ДА, подписывать векторные объекты можно, причем разными способами.
 
			 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 21 сен 2010, 13:06
				 Александр Мурый
				Допустим, у нас есть векторный слой 
profile_sample, в котором содержится 1 линия профиля и 6 точек пикетов вдоль линии. Как слой был создан -- неважно, это отдельный разговор. 
-- У точек пикетов есть аттрибуты (далее я пишу в командной строке, но с тем же успехом это все работает в графич. режиме): 
 v.info -c profile_sample
Код: Выделить всё
Отобразить типы/имена полей для связи БД со слоем 1:
INTEGER|cat
DOUBLE PRECISION|pikety
Код: Выделить всё
 cat|pikety
1|5.5
2|10.5
3|15.7
4|23.2
5|31.1
6|43
-- Теперь надо выбрать способ нанесения подписей:
1) можно создать особый "слой" подписей с нужными свойствами (
v.label), затем вынести подписи на экран (
d.label или через графич. интерфейс).  
2) можно отобразить вект. слой сразу с подписями (но без нужного нам поворота)
3) можно наносить подписи прямо на экран (модули 
d.text или 
d.text.freetype), с поворотом и с русскими символами.
--- Самым удобным в нашем случае будет вариант 1. Поехали.
- Создаем "слой" подписей:
Код: Выделить всё
v.label -a labels=profile_sample_labels map=profile_sample column=pikety type=point color=red rotation=270 reference=left size=50 font=DejaVuSansMono
- Выводим профиль и подписи на экран:
Код: Выделить всё
d.vect profile_sample width=2 size=9
d.labels labels=profile_sample_labels
- Получается так:
			
		
				
			 
- labels.png (14.98 КБ) 15993 просмотра
 
----------------------------------------------------------------------------------------------------
Конечно, параметры подписей (угол поворота, цвет, шрифт, размер, положение и т.д.) можно менять. См. соответствующий мануал:
http://grass.gis-lab.info/grass64/manua ... label.html 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 21 сен 2010, 18:06
				 Trace
				спасибо Вам большое за объяснение.
Хотел бы у Вас уточнить 2 часть вопроса, есть ли какой нить скрипт который позволит сделать каждую подпись перпендикулярно линии. и занести значение угла в таблицы атрибутов к слою точек?
чтобы автоматом расставит подпись как на рисунке...
			 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 21 сен 2010, 18:35
				 Александр Мурый
				Т.е., надо, чтобы в каждой точке подпись была перпендикулярна к линии, так? 
Надо подумать. Навскидку ответить не могу. Встроенной команды для переноса угла подписей в аттрибуты нет.
Кстати, у вас пример взят из статьи про LRS, вообще, там использовались команды v.lrs.*. Но я в них не силен..
			 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 22 сен 2010, 08:58
				 Trace
				именно так и надо. чтобы в каждой точке подпись была перпендикулярна к линии. вопрос заинтерисовал после того как увидет статью. т.к. кугис неумеет подписывать так как мне надо. а возможно как то определить этот угол? например посчитать углы между точками, потом присвоить значения с +90°?
			 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 22 сен 2010, 09:53
				 Александр Мурый
				В общем, в результате хитрых манипупяций с модулями 
v.parallel и 
v.distance получилось так:
			
		
				
			 
- 2010-09-22-023046_1022x717_scrot.png (15.84 КБ) 15952 просмотра
 
Чуть попозже распишу подробнее. Заносить углы между вект.объектами в таблицу тоже можно с пом. 
v.distance, разберусь -- отпишусь.
 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 13 окт 2010, 04:41
				 Trace
				amuriy, если вас незатруднит, то опишите как Вы посчитали угол поворота подписи...
			 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 13 окт 2010, 21:05
				 Александр Мурый
				Сорри, как говорится, забыл совсем про эту тему..
Напишу, только вот найду проект ("область") GRASS, созданный для этого дела.
			 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 09 дек 2010, 11:00
				 Trace
				Кажется я понял как вы добились результата. но вот у меня не получается правильно сдвинуть точки. т.е. они не сдвигаются...
пример файла можно взять из 
этой темы (подпись пикетов)
 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 09 дек 2010, 13:34
				 Александр Мурый
				Хорошо, как раз хотел вернуться к этой теме.
Нашёл-таки те область/набор, где делал эксперименты 

 Скоро отпишусь здесь.
 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 14 дек 2010, 10:13
				 Александр Мурый
				Выкладываю скопом всё, что накопал. Потом разберёмся ..))
Для примера используется файл из 
вот этой темы.
Подписи для параллельных линий 
 -  Имеем: текстовый файл в 4 поля. Сортируем по 1-му полю (Line), выносим значения всех столбцов по уникальным значениям в файлы с именем этих уникальных значений (номер линии). Разбираем пикеты с их координатами по линиям, если короче. 
 Код: Выделить всё  Line    Piket   X       Y
941     1625    65007.5 69165.3
941     1626    65053.0 69144.6
941     1627    65098.5 69123.8
941     1628    65143.9 69103.1
... 	...	...	...
 
Код: Выделить всё  for lines in `awk 'NR>2 {print $1}' primer.txt | sort -n | uniq` ; do
 awk -v lines="$lines" '{if($1==lines){print $1, $2, $3, $4}}' primer.txt > $lines ; done
 
 
 Получается 72 файла с именами из номеров линий (941, 947 ... 1349)
-  Дальше массово импортируем файлы в GRASS (фильтруем с пом. grep, чтоб читались только файлы с "числовым" именем. Даём SQL-совместимые имена (т.е. начинающиеся НЕ с цифры и БЕЗ точек)):
 
 Код: Выделить всё  for list in `echo ./* | grep -o '[0-9]\+'` ; do cat $list | awk '{print $2, $3, $4}' | v.in.ascii fs=" " columns="cat int,x double precision, y double precision" x=2 y=3 cat=1 output=pts_$list ; done
 
 
 Получилось 72 точечных векторных карты по линиям с именами (pts_941 ... pts_1349)
-  Задать регион по всем этим векторам :
 Код: Выделить всё g.region res=50 vect=`g.mlist vect pat="pts_*" separator=","` -p
 
 
-  Отрисовать все вектора:
 Код: Выделить всё  for i in `g.mlist vect pat="pts_*"` ; do d.vect -c $i; done
 
 
-  Создаём линии из точек (нужен скрипт v.in.lines):
 Код: Выделить всё  for i in `g.mlist vect pat="pts_*"` ; do v.out.ascii in=$i format=point fs="," | cut -d',' -f1,2 | ./v.in.lines in=- out=${i}_line fs="," ; done
 
 
-  Добавляем ко всем картам точек атрибутивные таблицы с их же именами и полями cat,x,y, потом можно (если надо) занести в таблицу координаты точек (v.to.db):
 Код: Выделить всё  for pts in `g.mlist vect pat="pts_*"` ; do v.db.addtable map=$pts columns="cat int,x double precision,y double precision" ; done
 
 
-  Назначаем категории для линий (для связи с таблицами):
 Код: Выделить всё  for lines in `g.mlist vect pat="pts*line"` ; do v.category input=$lines output=${lines}_cat option=add; done
 
 
-  Заносим категории линий в их атрибутивные таблицы в поле "cat":
 Код: Выделить всё   for lines in `g.mlist vect pat="pts*_cat"` ; do v.to.db map=$lines option=cat type=line; done
 
 
-  Заносим длины линий в их атрибутивные таблицы в поле "length":
 Код: Выделить всё   for lines in `g.mlist vect pat="pts*_cat"` ; do v.to.db map=$lines option=length type=line col=length units=me; done
 
 
-  Сами подписи:
 Подписи перпендикулярно к прямой линии - оценить угол поворота подписей против часовой стрелки (в нашем случае около 65 град.) --> v.label --> d.label:
 Код: Выделить всё  v.label -a map=pts_995 column=cat font=DejaVuSansMono fontsize=9 rotation=65 reference=left where="cat >= 1710 and cat <= 1730"
 
 
-   Создать файлы подписей с одинаковыми характеристиками для нескольких соседних линий  и отобразить их на экране:
 Код: Выделить всё  for i in 977 983 1001 ; do v.label map=pts_$i column=cat font=DejaVuSansMono fontsize=9 hcolor=yellow hwidth=1 rotation=65 reference=right where="cat >= 1710 and cat <= 1730" ; d.labels label=pts_$i ; done
 
 
-  Для регулирования положения подписей относительно точек исп-ся параметр модуля v.label "reference" и параметры "xoffset" (вдоль линии и точек) и "yoffset" (поперёк). Чтобы немного "отъехать" от точек, исп-м "yoffset=-2"
 Код: Выделить всё  for i in 977 983 1001 ; do v.label map=pts_$i column=cat font=DejaVuSansMono fontsize=9 rotation=65 reference=right xoffset=0 yoffset=-2 ; d.labels label=pts_$i ; done
 
 
-  Для создания подписей с особыми условиями (например, подписывать только пикеты 1710-1730 через 5 значений) -- используем SQL. НЕ для всех БД, с DBF не пойдёт (надо скопировать таблицу в SQLite, установив перед этим с ней связь):
 Код: Выделить всё  eval `g.gisenv`
 
 db.connect driver=sqlite database='$GISDBASE/$LOCATION_NAME/$MAPSET/sqlite.db'
 
 db.copy from_driver=dbf from_database='$GISDBASE/$LOCATION_NAME/$MAPSET/dbf' from_table=pts_995 to_driver=sqlite to_database='$GISDBASE/$LOCATION_NAME/$MAPSET/sqlite.db' to_table=pts_995
 
 for i in 989 995 ; do v.db.connect -o map=pts_$i driver=sqlite table=pts_$i  ; done
 
 
 Затем можно выборочно показать подписи на экране (d.vect, без поворота):
 Код: Выделить всё  d.vect map=vector where="cat BETWEEN 10 AND 30 AND (cat LIKE '%5' OR cat LIKE '%0')"
 
 
 
 Либо сделать файл подписей и вывести его (v.label --> d.label с поворотом):
 Код: Выделить всё   for i in 989 995 ; do v.label map=pts_$i column=cat font=DejaVuSansMono fontsize=9 hcolor=yellow hwidth=1 rotation=65 reference=left xoffset=0 yoffset=0  where="cat BETWEEN 1710 AND 1730 AND (cat LIKE '%5' OR cat LIKE '%0')"; done
 
 
Результат:
			
		
				
			 
- pts_labels_paral.png (98.52 КБ) 15183 просмотра
  
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 14 дек 2010, 13:13
				 Александр Мурый
				Продолжим упражнения.
Подписи перпендикулярно к произвольной ломаной линии (на примере подписей вершин этой линии).
 -  Оцифруем произвольную ломаную линию в новой векторной карте (рис. 1):
 
			
		
				
			 
- sample_line.png (2.78 КБ) 15173 просмотра
 
 
-  Создадим вект. карту с вершинами созданной линии "sample_line" (получится 2 слоя, во 2-м категории собственно самих точек)
 Код: Выделить всё  v.to.points -v in=sample_line out=sample_line_pts
 
 
			
		
				
			 
- sample_line_pts.png (3.27 КБ) 15173 просмотра
 
 
-  Создадим линию, параллельную исходной, с левой стороны на расстоянии 150 единиц карты (можно создавать с любой, в т.ч. сразу с обоих):
 Код: Выделить всё  v.parallel in=sample_line out=sample_line__paral_left side=left distance=150
 
 
			
		
				
			 
- sample_line__paral_left.png (4.35 КБ) 15173 просмотра
 
 
 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 14 дек 2010, 13:34
				 Александр Мурый
				Далее по теме: 
Подписи перпендикулярно к произвольной ломаной линии  на примере подписей вершин этой линии).
...
-  Создадим точки вершин для параллельной линии:
 Код: Выделить всё  v.to.points -v in=sample_line__paral_left out=sample_line__paral_left__pts
 
 
			
		
				
			 
- sample_line__paral_left__pts.png (5.05 КБ) 15170 просмотров
 
 
-  Проводим линии наименьших расстояний из вершин исходной линии к вершинам параллельной линии:
 Код: Выделить всё  v.distance from=sample_pts to=sample_line__paral_left__pts from_type=point to_type=point output=sample_line__paral_pts__cnct upload=dist column=dist
 
 
			
		
				
			 
- sample_line__paral_pts__cnct.png (5.49 КБ) 15170 просмотров
 
 
-  Подписываем получившиеся линии "соединения" с пом. v.label (с опцией "-a" -- вдоль линии):
 Код: Выделить всё  v.label -a map=sample_line__paral_pts__cnct_cats column=cat font=DejaVuSansMono fontsize=10 reference=right
 
 
			
		
				
			 
- sample_line__paral_pts__cnct__TO_ROTATE.png (12.82 КБ) 15170 просмотров
 
 
 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 14 дек 2010, 13:36
				 Александр Мурый
				Далее по теме:
Подписи перпендикулярно к произвольной ломаной линии (на примере подписей вершин этой линии).
- ...
-  Как видно на картинке выше, получилось, что отдельные подписи повёрнуты на 180 градусов (ошибка v.label?) Правим ВРУЧНУЮ текст файла подписей в любимом текстовом редакторе (перед этим находим файл подписей -- должен быть в директории $MAPSET/paint/labels/):
 
 Код: Выделить всё emacs -nw ./primer__lines_labels/paint/labels/sample_line__paral_pts__cnct_cats
 
 
 
 Файл подписей выглядит так:Код: Выделить всё  east: 69485.949885
north: 70380.912213
xoffset: 0
yoffset: 0
ref: right
font: DejaVuSansMono
color: black
fontsize: 10
width: 1
hcolor: none
hwidth: 0
background: none
border: none
opaque: yes
rotate: 47.301783
text: 1
... :
... :
... :
 
 
 Если подписи оказались повёрнуты не в ту сторону (rotate в файле > 200), меняем угол на верный = ("rotate - 180")
 
 Если подписи слишком близко/далеко от точек ( см. предыдущий рис.), меняем поля xoffset / yoffset (+- двигаем туда/сюда)
-  Ну и результат упражнений:
			
		
				
			 
- pts_labels_sample.png (12.37 КБ) 15170 просмотров
 
 
 
			
					
				Re: Подписи линий, точек и т.д.
				Добавлено: 16 дек 2010, 07:33
				 Trace
				amuriy
Проводим линии наименьших расстояний из вершин исходной линии к вершинам параллельной линии:
А возможно ли добавить координаты в параллельных вершин в таблицу к основным вершинам? просто тогда можно было бы найти угол относительно оси У. а потом добавить в таблицу его и поварачивать подписи согласно углу в таблице.
Спасибо Вам за ваши старания. мне очень помогло...