Страница 1 из 2
поворот символов в слое в зависимости от атрибута объекта
Добавлено: 24 мар 2017, 08:46
evgenius
Всем привет.
У меня QGIS из дистрибутива osgeo4w, плюс немного могу на питоне.
Нужно отобразить условно антенны сотовой связи на карте. Каждая антенна имеет координаты, ширину диаграммы направленности и азимут.
[img]не%20разобрался%20как%20вставить%20картинку%20из%20ссылки%20ниже[/img]
Подробнее тут:
http://gis.stackexchange.com/questions/ ... es#tab-top
1) Можно ли использовать для этого простые маркеры или svg символы?
Для простоты можно использовать изображение треугольника. Но у имеющихся в qgis треугольников точка поворота - центр треугольника, а мне нуна, чтоб была вершина.
2) Если такое можно на python, буду признателен за примерчик.
Уверен, что смогу нарисовать соответствующие треугольнички в слое layer = QgsVectorLayer('Polygon', 'poly' , "memory") в виде полигонов, решая стандартные геодезические задачи. Но такое решение имеет недостатки: при небольших расстояниях между антеннами, они будут налезать друг на друга, а при больших - быть плохо различимы при малых зумах. Может есть более кошерный способ решить задачу?
Заранее спасибо.
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 09:25
Аминодов-Борисов
Если я правильно вас понимаю, то:
1. У вас есть слой точечных объектов.
2. Среди этих атрибутов есть азимут. Ну или ещё какой-нибудь угол поворота.
Если так, то вам Питон нафиг не нужен. В QGIS есть стандартное средство для того, чтобы брать угол поворота знака из атрибутов.
Что же касается точки поворота, то я, например, все SVG-маркеры рисую сам. И рисую я их на квадратном полотне с тем расчётом, чтобы точка привязки маркера, она же точка поворота, была в геометрическом центре полотна. В принципе, вы того же самого можете добиться теми же средствами QGIS.
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 09:44
evgenius
Спасибо!
Все верно поняли. Можете порекомендовать руководство почти для даунов, как рисовать svg маркеры и встраивать их в qgis? Я честно пытался, но что-то пошло не так. Или сразу xml треугольника с привязкой в вершине, с направлением на азимут 0 градусов можете кинуть?
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 09:55
Аминодов-Борисов
Ну вот смотрите. Допустим, у вас есть точечный слой.
Покажу на примере простого маркера-треугольника.

- atrangle01.png (116.87 КБ) 9992 просмотра
В атрибутах этого слоя есть поле, отвечающее за угол поворота. У меня оно так и называется — angle. Тип данных integer (целое число), но вы сами смотрите, вдруг вам для решения вашей задачи нужны не только целые градусы.

- atrangle02.png (27.16 КБ) 9992 просмотра
Открываете свойства слоя, вкладку «Стиль».

- atrangle03.png (49.69 КБ) 9992 просмотра
Правее панели вкладок вы видите окошко с предварительным просмотром маркера и деревом «Маркер — Простой маркер». Щёлкаете мышкой на этом самом Простом маркере. Вон, на картинке он серым выделен.
Продолжение следует...
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 09:59
Аминодов-Борисов
Далее нужно задать атрибут, отвечающий за угол поворота знака. Тут всё на картинке понятно.

- atrangle04.png (70.72 КБ) 9990 просмотров
А затем поменять свойство знака «Смещение по Y» так, чтобы точкой привязки и поворота стал не геометрический центр треугольника, а его верхняя вершина. Тут я делал на глаз, чтобы картинка в окошке предварительного просмотра приняла нужный мне вид.

- atrangle05.png (50.07 КБ) 9990 просмотров
Готово. Поле с углом поворота знака задано, значок смещён.
В принципе, если вы хотите вместо простого маркера использовать SVG, то технология будет такая же.

- atrangle06.png (118.97 КБ) 9990 просмотров
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 10:05
evgenius
"...Щёлкаете мышкой на этом самом Простом маркере. Вон, на картинке он серым выделен.
Продолжение следует..."
Хочу уточнить - самы простой маркер мне точно подойдет? Мне нужен как-бы перевернутый, чтобы основание смотрело по азимуту 0, а точка привязки была в вершине.
Получается, надо делать свой svg?
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 10:13
freeExec
Можно свой нарисовать, а можно 180 градусов к углу добавить, до нужного разворота.
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 10:17
Аминодов-Борисов
evgenius писал(а):"...Щёлкаете мышкой на этом самом Простом маркере. Вон, на картинке он серым выделен.
Продолжение следует..."
Хочу уточнить - самы простой маркер мне точно подойдет? Мне нужен как-бы перевернутый, чтобы основание смотрело по азимуту 0, а точка привязки была в вершине.
Получается, надо делать свой svg?
Вот маркер. Не треугольник, а круговой сектор. Вершиной стоит в точке поворота, «смотрит» по умолчанию по азимуту 0°.
В принципе, тема интересная. Думаю, средствами QGIS можно добиться того, чтобы каждый маркер отображал не только азимут, но и, как вы говорите, ширину диаграммы направленности (наверное, это что-то вроде угла поля зрения). Но тут нужно побольше поизучать.

Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 10:32
evgenius
@Алексей Борисов
Получилось с вложенным маркером.
Спасибо.
Почему я не могу его выделить, щелкая в центр маркера? То же с выделением через zoom to selected feature из Attribute Table. Вернее этот маркер выделяется не так, как простой встроенный треугольник. Если присмотреться, то он выделяется как граница svg рисунка, а не по контуру сектора с заливкой всего сектора. В какую сторону копать?
@freeExec
Как добавить 180град к маркеру в дополнение к повороту в зависимости от азимута не разобрался. Получается либо все сектора на 180 град смотрят, либо все привязаны своим основанием, визуально выглядит как ошибочное направление сектора.
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 10:38
Аминодов-Борисов
evgenius писал(а):@Алексей Борисов
Получилось с вложенным маркером.
Спасибо.
Почему я не могу его выделить, щелкая в центр маркера? То же с выделением через zoom to selected feature из Attribute Table. Вернее этот маркер выделяется не так, как простой встроенный треугольник. Если присмотреться, то он выделяется как граница svg рисунка, а не по контуру сектора с заливкой всего сектора. В какую сторону копать?
Щёлкая в центр маркера — то есть, в центр этого кругового сектора? Этого уже не знаю. Наверное, QGIS обрабатывает именно щелчок в точку привязки знака плюс-минус какой-нибудь допуск.
Кстати, смотрите, что у меня получилось.

- atrangle07.png (135.9 КБ) 9971 просмотр
Каждый треугольник указывает остриём на азимут. А линии отображают как азимут, так и угол поля зрения. В принципе, удалось отобразить оба параметра.
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 10:44
evgenius
Алексей Борисов писал(а):
Щёлкая в центр маркера — то есть, в центр этого кругового сектора? Этого уже не знаю.
Полагаю, дело в svg. Спасибо, буду копать.
Алексей Борисов писал(а):
Каждый треугольник указывает остриём на азимут. А линии отображают как азимут, так и угол поля зрения. В принципе, удалось отобразить оба параметра.
Ага, только антенна с шириной 360 град. будет отображаться как одна линия. Хрен с этим углом обзора, сначала нормальный азимут и выделение как у встроенного простого треугольника буду победить.
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 10:55
freeExec
evgenius писал(а):
@freeExec
Как добавить 180град к маркеру в дополнение к повороту в зависимости от азимута не разобрался. Получается либо все сектора на 180 град смотрят, либо все привязаны своим основанием, визуально выглядит как ошибочное направление сектора.
Там где угол поворота выбрать "Выражение" и написать
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 11:36
evgenius
freeExec писал(а):
Там где угол поворота выбрать "Выражение" и написать
БИНГО! Получилось. Спасибо, огромное и человеческое!
Вы не поверите, где-то около двух лет бился над этими поворотами. С перерывами, конечно, и отвлечениями на другие задачи. И все это время было стыдно за использование линий вместо треугольничков (vector field marker с нужным азимутом).
А по поводу выделения - я так понял если делать svg, то выделять будет по границам этого svg (экспортнул встроенный простой маркер как svg, потом импортнул его же, в результате он стал выделяться по границам, т.е. не так как встроенный неэкспортированный в svg). ИМХО.
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 24 мар 2017, 11:44
freeExec
Это странно. Попробуйте в Параметры/Система/Пути к маркерам - указать папку с этим значком.
Re: поворот символов в слое в зависимости от атрибута объект
Добавлено: 27 мар 2017, 10:30
evgenius
freeExec писал(а):
Там где угол поворота выбрать "Выражение" и написать
А может кто-подсказать, что написать в поле "Выражение" для назначения в качестве символа circle, если, например атрибут "beamwidth" = 360, и символа triangle, если "beamwidth" все остальные?
Пробовал так:
if( "beamwidth" = 360, circle,triangle) и так
if( "beamwidth" = 360, "circle","triangle")
но не выходит каменный цветок, хотя обе записи qgis считает валидными.
Если навести мышку сюда, то появляется подсказка, но как на самом деле надо не разобрался:
(я на самом деле привязал к атрибуту size для быстрого теста за неимением beamwidth, но не суть)