Подписи линий, точек и т.д.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Подписи линий, точек и т.д.

Сообщение Александр Мурый »

Trace спросил:
Возможно ли в Грасс подписать пикеты, расположенные вдоль профилей, перпендикулярно профилям, не задавая никаких полей? или есть какой-нить скрипт, в котором в таблицу с точками занесутся углы поворота подписей, чтобы они были перпендикулярны профилям? ну или хотя бы параллельны?
Если кратко: ДА, подписывать векторные объекты можно, причем разными способами.
Редактор материалов, модератор форума
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Подписи линий, точек и т.д.

Сообщение Александр Мурый »

Допустим, у нас есть векторный слой profile_sample, в котором содержится 1 линия профиля и 6 точек пикетов вдоль линии. Как слой был создан -- неважно, это отдельный разговор.

-- У точек пикетов есть аттрибуты (далее я пишу в командной строке, но с тем же успехом это все работает в графич. режиме):
v.info -c profile_sample

Код: Выделить всё

Отобразить типы/имена полей для связи БД со слоем 1:
INTEGER|cat
DOUBLE PRECISION|pikety
v.db.select profile_sample

Код: Выделить всё

 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
labels.png (14.98 КБ) 15597 просмотров
----------------------------------------------------------------------------------------------------
Конечно, параметры подписей (угол поворота, цвет, шрифт, размер, положение и т.д.) можно менять. См. соответствующий мануал:
http://grass.gis-lab.info/grass64/manua ... label.html
Редактор материалов, модератор форума
Trace
Активный участник
Сообщения: 153
Зарегистрирован: 14 окт 2009, 05:07
Репутация: 0
Откуда: Красноярск
Контактная информация:

Re: Подписи линий, точек и т.д.

Сообщение Trace »

спасибо Вам большое за объяснение.
Хотел бы у Вас уточнить 2 часть вопроса, есть ли какой нить скрипт который позволит сделать каждую подпись перпендикулярно линии. и занести значение угла в таблицы атрибутов к слою точек?
чтобы автоматом расставит подпись как на рисунке...
Вложения
Вложение взято из файла Radim-Blazek__LRS_GRASS_GIS_1.pdf
Вложение взято из файла Radim-Blazek__LRS_GRASS_GIS_1.pdf
Без имени.png (28.68 КБ) 15582 просмотра
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Подписи линий, точек и т.д.

Сообщение Александр Мурый »

Т.е., надо, чтобы в каждой точке подпись была перпендикулярна к линии, так?
Надо подумать. Навскидку ответить не могу. Встроенной команды для переноса угла подписей в аттрибуты нет.

Кстати, у вас пример взят из статьи про LRS, вообще, там использовались команды v.lrs.*. Но я в них не силен..
Редактор материалов, модератор форума
Trace
Активный участник
Сообщения: 153
Зарегистрирован: 14 окт 2009, 05:07
Репутация: 0
Откуда: Красноярск
Контактная информация:

Re: Подписи линий, точек и т.д.

Сообщение Trace »

именно так и надо. чтобы в каждой точке подпись была перпендикулярна к линии. вопрос заинтерисовал после того как увидет статью. т.к. кугис неумеет подписывать так как мне надо. а возможно как то определить этот угол? например посчитать углы между точками, потом присвоить значения с +90°?
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Подписи линий, точек и т.д.

Сообщение Александр Мурый »

В общем, в результате хитрых манипупяций с модулями v.parallel и v.distance получилось так:
2010-09-22-023046_1022x717_scrot.png
2010-09-22-023046_1022x717_scrot.png (15.84 КБ) 15556 просмотров
Чуть попозже распишу подробнее. Заносить углы между вект.объектами в таблицу тоже можно с пом. v.distance, разберусь -- отпишусь.
Редактор материалов, модератор форума
Trace
Активный участник
Сообщения: 153
Зарегистрирован: 14 окт 2009, 05:07
Репутация: 0
Откуда: Красноярск
Контактная информация:

Re: Подписи линий, точек и т.д.

Сообщение Trace »

amuriy, если вас незатруднит, то опишите как Вы посчитали угол поворота подписи...
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Подписи линий, точек и т.д.

Сообщение Александр Мурый »

Сорри, как говорится, забыл совсем про эту тему..
Напишу, только вот найду проект ("область") GRASS, созданный для этого дела.
Редактор материалов, модератор форума
Trace
Активный участник
Сообщения: 153
Зарегистрирован: 14 окт 2009, 05:07
Репутация: 0
Откуда: Красноярск
Контактная информация:

Re: Подписи линий, точек и т.д.

Сообщение Trace »

Кажется я понял как вы добились результата. но вот у меня не получается правильно сдвинуть точки. т.е. они не сдвигаются...
пример файла можно взять из этой темы (подпись пикетов)
Александр Мурый
Гуру
Сообщения: 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
Результат:
pts_labels_paral.png
pts_labels_paral.png (98.52 КБ) 14787 просмотров
Редактор материалов, модератор форума
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Подписи линий, точек и т.д.

Сообщение Александр Мурый »

Продолжим упражнения.
Подписи перпендикулярно к произвольной ломаной линии (на примере подписей вершин этой линии).
  • Оцифруем произвольную ломаную линию в новой векторной карте (рис. 1):

    Код: Выделить всё

     v.digit -n sample_line
    sample_line.png
    sample_line.png (2.78 КБ) 14777 просмотров
  • Создадим вект. карту с вершинами созданной линии "sample_line" (получится 2 слоя, во 2-м категории собственно самих точек)

    Код: Выделить всё

     v.to.points -v in=sample_line out=sample_line_pts
    sample_line_pts.png
    sample_line_pts.png (3.27 КБ) 14777 просмотров
  • Создадим линию, параллельную исходной, с левой стороны на расстоянии 150 единиц карты (можно создавать с любой, в т.ч. сразу с обоих):

    Код: Выделить всё

     v.parallel in=sample_line out=sample_line__paral_left side=left distance=150
    sample_line__paral_left.png
    sample_line__paral_left.png (4.35 КБ) 14777 просмотров
Редактор материалов, модератор форума
Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Подписи линий, точек и т.д.

Сообщение Александр Мурый »

Далее по теме:
Подписи перпендикулярно к произвольной ломаной линии на примере подписей вершин этой линии).

...
  • Создадим точки вершин для параллельной линии:

    Код: Выделить всё

     v.to.points -v in=sample_line__paral_left out=sample_line__paral_left__pts
    sample_line__paral_left__pts.png
    sample_line__paral_left__pts.png (5.05 КБ) 14774 просмотра
  • Проводим линии наименьших расстояний из вершин исходной линии к вершинам параллельной линии:

    Код: Выделить всё

     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
    sample_line__paral_pts__cnct.png (5.49 КБ) 14774 просмотра
  • Подписываем получившиеся линии "соединения" с пом. 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
    sample_line__paral_pts__cnct__TO_ROTATE.png (12.82 КБ) 14774 просмотра
Редактор материалов, модератор форума
Александр Мурый
Гуру
Сообщения: 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 (+- двигаем туда/сюда)
  • Ну и результат упражнений:
    pts_labels_sample.png
    pts_labels_sample.png (12.37 КБ) 14774 просмотра
Редактор материалов, модератор форума
Trace
Активный участник
Сообщения: 153
Зарегистрирован: 14 окт 2009, 05:07
Репутация: 0
Откуда: Красноярск
Контактная информация:

Re: Подписи линий, точек и т.д.

Сообщение Trace »

amuriy
Проводим линии наименьших расстояний из вершин исходной линии к вершинам параллельной линии:
А возможно ли добавить координаты в параллельных вершин в таблицу к основным вершинам? просто тогда можно было бы найти угол относительно оси У. а потом добавить в таблицу его и поварачивать подписи согласно углу в таблице.
Спасибо Вам за ваши старания. мне очень помогло...
Ответить

Вернуться в «GRASS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя