Если кратко: ДА, подписывать векторные объекты можно, причем разными способами.Возможно ли в Грасс подписать пикеты, расположенные вдоль профилей, перпендикулярно профилям, не задавая никаких полей? или есть какой-нить скрипт, в котором в таблицу с точками занесутся углы поворота подписей, чтобы они были перпендикулярны профилям? ну или хотя бы параллельны?
Подписи линий, точек и т.д.
- 
				Александр Мурый
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Подписи линий, точек и т.д.
- 
				Александр Мурый
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Подписи линий, точек и т.д.
-- У точек пикетов есть аттрибуты (далее я пишу в командной строке, но с тем же успехом это все работает в графич. режиме):
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|431) можно создать особый "слой" подписей с нужными свойствами (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Конечно, параметры подписей (угол поворота, цвет, шрифт, размер, положение и т.д.) можно менять. См. соответствующий мануал:
http://grass.gis-lab.info/grass64/manua ... label.html
- 
				Trace
- Активный участник
- Сообщения: 153
- Зарегистрирован: 14 окт 2009, 05:07
- Репутация: 0
- Откуда: Красноярск
- Контактная информация:
Re: Подписи линий, точек и т.д.
Хотел бы у Вас уточнить 2 часть вопроса, есть ли какой нить скрипт который позволит сделать каждую подпись перпендикулярно линии. и занести значение угла в таблицы атрибутов к слою точек?
чтобы автоматом расставит подпись как на рисунке...
- Вложения
- 
			
		
				- Вложение взято из файла Radim-Blazek__LRS_GRASS_GIS_1.pdf
- Без имени.png (28.68 КБ) 15994 просмотра
 
- 
				Александр Мурый
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Подписи линий, точек и т.д.
Надо подумать. Навскидку ответить не могу. Встроенной команды для переноса угла подписей в аттрибуты нет.
Кстати, у вас пример взят из статьи про LRS, вообще, там использовались команды v.lrs.*. Но я в них не силен..
- 
				Trace
- Активный участник
- Сообщения: 153
- Зарегистрирован: 14 окт 2009, 05:07
- Репутация: 0
- Откуда: Красноярск
- Контактная информация:
Re: Подписи линий, точек и т.д.
- 
				Александр Мурый
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Подписи линий, точек и т.д.
- 
				Trace
- Активный участник
- Сообщения: 153
- Зарегистрирован: 14 окт 2009, 05:07
- Репутация: 0
- Откуда: Красноярск
- Контактная информация:
Re: Подписи линий, точек и т.д.
- 
				Александр Мурый
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Подписи линий, точек и т.д.
Напишу, только вот найду проект ("область") GRASS, созданный для этого дела.
- 
				Trace
- Активный участник
- Сообщения: 153
- Зарегистрирован: 14 окт 2009, 05:07
- Репутация: 0
- Откуда: Красноярск
- Контактная информация:
Re: Подписи линий, точек и т.д.
пример файла можно взять из этой темы (подпись пикетов)
- 
				Александр Мурый
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Подписи линий, точек и т.д.
Нашёл-таки те область/набор, где делал эксперименты
 Скоро отпишусь здесь.
 Скоро отпишусь здесь.- 
				Александр Мурый
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Подписи линий, точек и т.д.
Для примера используется файл из вот этой темы.
Подписи для параллельных линий
-  Имеем: текстовый файл в 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
 
- 
				Александр Мурый
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Подписи линий, точек и т.д.
Подписи перпендикулярно к произвольной ломаной линии (на примере подписей вершин этой линии).
-  Оцифруем произвольную ломаную линию в новой векторной карте (рис. 1):
 Код: Выделить всё v.digit -n sample_line
 
-  Создадим вект. карту с вершинами созданной линии "sample_line" (получится 2 слоя, во 2-м категории собственно самих точек)
 Код: Выделить всё v.to.points -v in=sample_line out=sample_line_pts
 
-  Создадим линию, параллельную исходной, с левой стороны на расстоянии 150 единиц карты (можно создавать с любой, в т.ч. сразу с обоих):
 Код: Выделить всё v.parallel in=sample_line out=sample_line__paral_left side=left distance=150
 
- 
				Александр Мурый
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Подписи линий, точек и т.д.
Подписи перпендикулярно к произвольной ломаной линии на примере подписей вершин этой линии).
...
-  Создадим точки вершин для параллельной линии:
 Код: Выделить всё v.to.points -v in=sample_line__paral_left out=sample_line__paral_left__pts
 
-  Проводим линии наименьших расстояний из вершин исходной линии к вершинам параллельной линии:
 Код: Выделить всё 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
 
-  Подписываем получившиеся линии "соединения" с пом. v.label (с опцией "-a" -- вдоль линии):
 Код: Выделить всё v.label -a map=sample_line__paral_pts__cnct_cats column=cat font=DejaVuSansMono fontsize=10 reference=right
 
- 
				Александр Мурый
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Подписи линий, точек и т.д.
Подписи перпендикулярно к произвольной ломаной линии (на примере подписей вершин этой линии).
- ...
-  Как видно на картинке выше, получилось, что отдельные подписи повёрнуты на 180 градусов (ошибка v.label?) Правим ВРУЧНУЮ текст файла подписей в любимом текстовом редакторе (перед этим находим файл подписей -- должен быть в директории $MAPSET/paint/labels/):
 Код: Выделить всё find $MAPSET -name "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 (+- двигаем туда/сюда)
- Ну и результат упражнений:
- 
				Trace
- Активный участник
- Сообщения: 153
- Зарегистрирован: 14 окт 2009, 05:07
- Репутация: 0
- Откуда: Красноярск
- Контактная информация:
Re: Подписи линий, точек и т.д.
А возможно ли добавить координаты в параллельных вершин в таблицу к основным вершинам? просто тогда можно было бы найти угол относительно оси У. а потом добавить в таблицу его и поварачивать подписи согласно углу в таблице.Проводим линии наименьших расстояний из вершин исходной линии к вершинам параллельной линии:
Спасибо Вам за ваши старания. мне очень помогло...
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей