Страница 1 из 2

определение угла поворота для элемента условного знака

Добавлено: 30 ноя 2016, 12:49
kasandra
Добрый день!

Стоит такая задача. Есть дома ( как полигональные объекты). УЗ для дома с этажностью до 4 эт. это некоторый закрашенный полигон с точками внутри него.

При создании такого УЗ в QGIS, точки конечно же не ориентируються по большой стороне полигона (дома) и выходит вот такой не красивый УЗ как на рис.1.
1.png
рис.1
1.png (10.22 КБ) 7712 просмотров

В 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

:wink:

Re: определение угла поворота для элемента условного знака

Добавлено: 30 ноя 2016, 13:15
kasandra
Denis Rykov писал(а):Стиль слоя можете приложить?
вот
style_bud.rar
(4.21 КБ) 220 скачиваний

Re: определение угла поворота для элемента условного знака

Добавлено: 30 ноя 2016, 13:16
kasandra
trir писал(а):
Создание необходимых представлений является одним из ключевых аспектов хорошего дизайна базы данных SQL.
http://postgresql.ru.net/manual/tutorial-views.html

:wink:
спасибо, я понимаю, что объекты виртуальны :wink:

Re: определение угла поворота для элемента условного знака

Добавлено: 30 ноя 2016, 13:16
kasandra
kasandra писал(а):
trir писал(а):
Создание необходимых представлений является одним из ключевых аспектов хорошего дизайна базы данных SQL.
http://postgresql.ru.net/manual/tutorial-views.html

:wink:
спасибо, я понимаю, что объекты виртуальны :wink:
хочу альтернативу)

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 и указываете выражение:

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

bearing(  $currentfeature ) + 90
После чего ваши маркеры будут выровнены вдоль самой длинной стороны полигона. Плагин написан на коленке и толком не тестировался, если потребуется - можете его самостоятельно допилить. Если хотите, чтобы ваши функции работали и на других машинах, то нужно перенести файл(ы) с этими функциями (в Linux расположены в ~/.qgis2/python/expressions). Для работы данной конкретной функции нужен QGIS не ниже 2.10, я проверял на самой последней ночной сборке. Вот что получилось:

Re: определение угла поворота для элемента условного знака

Добавлено: 01 дек 2016, 20:43
kasandra
Denis Rykov, спасибо!)

Подскажите, Что я делаю не так?
1. Версия QGIS 2.14 и 2.18. Захожу Свойства слоя-Стили - для нужного условного знака захожу в редактирование маркера (т.е. точки)-для угла поворота открываю окно Конструктор выражений - Редактор функция - выбираю новый файл и добавляю предложенную функцию.
1.png
1.png (33.1 КБ) 7497 просмотров
2. Во вкладке Выражение этого же диалогового окна вызываю эту функцию (скрин2) и мне выдает ошибку.
2.png
2.png (35.36 КБ) 7512 просмотров

Re: определение угла поворота для элемента условного знака

Добавлено: 01 дек 2016, 20:45
kasandra
AlexSek писал(а):
хочу альтернативу)
Альтернатива триггер в БД на поле geometry в нем и напишите вычисление поля angle.
П.С. названия полей просто для примера

Спасибо) Я понимаю, что решаться вопрос может на уровне БД. Как я говорила ранее, не смогла выстроить логическую цепочку решения этой задачи с помощью функций postgis.
Если Вы можете мне в этом помочь - буду благодарна! :D

Re: определение угла поворота для элемента условного знака

Добавлено: 02 дек 2016, 04:06
Denis Rykov
Нажмите на "дополнительная информация", там должно быть сообщение об ошибке, из него будет ясно, что пошло не так.

Re: определение угла поворота для элемента условного знака

Добавлено: 21 дек 2016, 18:11
kasandra
Выдает вот такую ошибку, что нужно подправить во функции?
Ошибка разбора:
Ошибка выполнения:
'QgsPointV2' object has no attribute 'distance'