Если кратко: ДА, подписывать векторные объекты можно, причем разными способами.Возможно ли в Грасс подписать пикеты, расположенные вдоль профилей, перпендикулярно профилям, не задавая никаких полей? или есть какой-нить скрипт, в котором в таблицу с точками занесутся углы поворота подписей, чтобы они были перпендикулярны профилям? ну или хотя бы параллельны?
Подписи линий, точек и т.д.
-
- Гуру
- Сообщения: 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|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
Конечно, параметры подписей (угол поворота, цвет, шрифт, размер, положение и т.д.) можно менять. См. соответствующий мануал:
http://grass.gis-lab.info/grass64/manua ... label.html
-
- Активный участник
- Сообщения: 153
- Зарегистрирован: 14 окт 2009, 05:07
- Репутация: 0
- Откуда: Красноярск
- Контактная информация:
Re: Подписи линий, точек и т.д.
Хотел бы у Вас уточнить 2 часть вопроса, есть ли какой нить скрипт который позволит сделать каждую подпись перпендикулярно линии. и занести значение угла в таблицы атрибутов к слою точек?
чтобы автоматом расставит подпись как на рисунке...
- Вложения
-
- Вложение взято из файла Radim-Blazek__LRS_GRASS_GIS_1.pdf
- Без имени.png (28.68 КБ) 15575 просмотров
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Подписи линий, точек и т.д.
Надо подумать. Навскидку ответить не могу. Встроенной команды для переноса угла подписей в аттрибуты нет.
Кстати, у вас пример взят из статьи про LRS, вообще, там использовались команды v.lrs.*. Но я в них не силен..
-
- Активный участник
- Сообщения: 153
- Зарегистрирован: 14 окт 2009, 05:07
- Репутация: 0
- Откуда: Красноярск
- Контактная информация:
Re: Подписи линий, точек и т.д.
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Подписи линий, точек и т.д.
-
- Активный участник
- Сообщения: 153
- Зарегистрирован: 14 окт 2009, 05:07
- Репутация: 0
- Откуда: Красноярск
- Контактная информация:
Re: Подписи линий, точек и т.д.
-
- Гуру
- Сообщения: 5173
- Зарегистрирован: 26 сен 2009, 16:26
- Репутация: 792
- Ваше звание: званий не имею
- Откуда: Москва
Re: Подписи линий, точек и т.д.
Напишу, только вот найду проект ("область") GRASS, созданный для этого дела.
-
- Активный участник
- Сообщения: 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 (+- двигаем туда/сюда) - Ну и результат упражнений:
-
- Активный участник
- Сообщения: 153
- Зарегистрирован: 14 окт 2009, 05:07
- Репутация: 0
- Откуда: Красноярск
- Контактная информация:
Re: Подписи линий, точек и т.д.
А возможно ли добавить координаты в параллельных вершин в таблицу к основным вершинам? просто тогда можно было бы найти угол относительно оси У. а потом добавить в таблицу его и поварачивать подписи согласно углу в таблице.Проводим линии наименьших расстояний из вершин исходной линии к вершинам параллельной линии:
Спасибо Вам за ваши старания. мне очень помогло...
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя