Страница 1 из 2
определение угла поворота для элемента условного знака
Добавлено: 30 ноя 2016, 12:49
kasandra
Добрый день!
Стоит такая задача. Есть дома ( как полигональные объекты). УЗ для дома с этажностью до 4 эт. это некоторый закрашенный полигон с точками внутри него.
При создании такого УЗ в QGIS, точки конечно же не ориентируються по большой стороне полигона (дома) и выходит вот такой не красивый УЗ как на рис.1.

- рис.1
- 1.png (10.22 КБ) 7728 просмотров
В QGIS можно для элемента условного знака ( в данному случае точек внутри полигона ) задавать поле из которого будет браться угол поворота для нее. Но значение в это поле, на сколько я поняла, можно вводить только "вручную", то есть отдельно поворачивать точки внутри полигона при создании объекта нельзя.
Сами данные хранятся в PostgreSQL выводятся в QGIS. Возможно можно сделать функцию, которая при создании нового дома рассчитывала бы угол поворота для точки внутри него.
Угол можно в postgis рассчитать только ведь между линией-линией либо точкой-точкой. Поэтому пока месть не вижу логического решения этой задачи.
Подскажите свое виденье, а возможно и решение , если кто-то с подобным вопросом сталкивался.
Благодарю)
Re: определение угла поворота для элемента условного знака
Добавлено: 30 ноя 2016, 13:01
trir
создать отдельный слой с точками - его можно реализовать как View в БД
Re: определение угла поворота для элемента условного знака
Добавлено: 30 ноя 2016, 13:03
Denis Rykov
Стиль слоя можете приложить?
Re: определение угла поворота для элемента условного знака
Добавлено: 30 ноя 2016, 13:09
kasandra
trir писал(а):создать отдельный слой с точками - его можно реализовать как View в БД
Создавать лишнее объекты в БД не желательно, особенно если эти точки не есть обеты, а фактически просто часть уз.
Re: определение угла поворота для элемента условного знака
Добавлено: 30 ноя 2016, 13:12
trir
Создание необходимых представлений является одним из ключевых аспектов хорошего дизайна базы данных SQL.
http://postgresql.ru.net/manual/tutorial-views.html

Re: определение угла поворота для элемента условного знака
Добавлено: 30 ноя 2016, 13:15
kasandra
Denis Rykov писал(а):Стиль слоя можете приложить?
вот
Re: определение угла поворота для элемента условного знака
Добавлено: 30 ноя 2016, 13:16
kasandra
спасибо, я понимаю, что объекты виртуальны

Re: определение угла поворота для элемента условного знака
Добавлено: 30 ноя 2016, 13:16
kasandra
kasandra писал(а):
спасибо, я понимаю, что объекты виртуальны

хочу альтернативу)
Re: определение угла поворота для элемента условного знака
Добавлено: 30 ноя 2016, 13:31
AlexSek
хочу альтернативу)
Альтернатива триггер в БД на поле geometry в нем и напишите вычисление поля angle.
П.С. названия полей просто для примера
Re: определение угла поворота для элемента условного знака
Добавлено: 30 ноя 2016, 13:40
Denis Rykov
Задачу можно решить и средствами самого QGIS, не трогая хранилище, сейчас посмотрю. Я правильно понял, что маркеры нужно сделать параллельными самой длинной стороне?
Re: определение угла поворота для элемента условного знака
Добавлено: 30 ноя 2016, 18:45
Denis Rykov
Самый просто вариант - написать свою функцию, определяющую угол поворота самой длинной стороны полигона и использовать её при расчёте угла поворота маркеров. В QGIS это делается следующим образом: открываете окно редактирования выражений и переходите во вкладку "Function Editor", нажимаете "New file" и задаёте произвольное имя файла. В панель справа помещаете следующий код с необходимой функцией и нажимаете "Load":
Код: Выделить всё
"""
Define new functions using @qgsfunction. feature and parent must always be the
last args. Use args=-1 to pass a list of values as arguments
"""
import math
from qgis.core import *
from qgis.gui import *
@qgsfunction(args='auto', group='Custom')
def bearing(value1, feature, parent):
""" Calculate bearing for max length polygon's side. """
fgeom = feature.geometry()
geom = fgeom.geometry()
ring = geom.exteriorRing()
sides = ((node, ring.pointN(node).distance(ring.pointN(node+1)))
for node in range(ring.numPoints()-1))
side = max(sides, key=lambda side: side[1])
pt1 = ring.pointN(side[0])
pt2 = ring.pointN(side[0]+1)
dx = pt2.x() - pt1.x()
dy = pt2.y() - pt1.y()
return math.degrees(math.atan2(dx, dy))
После этого идёте и для каждого Simple Marker-а в поле Rotation выбираете Edit и указываете выражение:
После чего ваши маркеры будут выровнены вдоль самой длинной стороны полигона. Плагин написан на коленке и толком не тестировался, если потребуется - можете его самостоятельно допилить. Если хотите, чтобы ваши функции работали и на других машинах, то нужно перенести файл(ы) с этими функциями (в Linux расположены в ~/.qgis2/python/expressions). Для работы данной конкретной функции нужен QGIS не ниже 2.10, я проверял на самой последней ночной сборке. Вот что получилось:
Re: определение угла поворота для элемента условного знака
Добавлено: 01 дек 2016, 20:43
kasandra
Denis Rykov, спасибо!)
Подскажите, Что я делаю не так?
1. Версия QGIS 2.14 и 2.18. Захожу Свойства слоя-Стили - для нужного условного знака захожу в редактирование маркера (т.е. точки)-для угла поворота открываю окно Конструктор выражений - Редактор функция - выбираю новый файл и добавляю предложенную функцию.

- 1.png (33.1 КБ) 7513 просмотров
2. Во вкладке Выражение этого же диалогового окна вызываю эту функцию (скрин2) и мне выдает ошибку.

- 2.png (35.36 КБ) 7528 просмотров
Re: определение угла поворота для элемента условного знака
Добавлено: 01 дек 2016, 20:45
kasandra
AlexSek писал(а):хочу альтернативу)
Альтернатива триггер в БД на поле geometry в нем и напишите вычисление поля angle.
П.С. названия полей просто для примера
Спасибо) Я понимаю, что решаться вопрос может на уровне БД. Как я говорила ранее, не смогла выстроить логическую цепочку решения этой задачи с помощью функций postgis.
Если Вы можете мне в этом помочь - буду благодарна!

Re: определение угла поворота для элемента условного знака
Добавлено: 02 дек 2016, 04:06
Denis Rykov
Нажмите на "дополнительная информация", там должно быть сообщение об ошибке, из него будет ясно, что пошло не так.
Re: определение угла поворота для элемента условного знака
Добавлено: 21 дек 2016, 18:11
kasandra
Выдает вот такую ошибку, что нужно подправить во функции?
Ошибка разбора:
Ошибка выполнения:
'QgsPointV2' object has no attribute 'distance'