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

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
kasandra
Активный участник
Сообщения: 145
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

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

Сообщение kasandra » 30 ноя 2016, 12:49

Добрый день!

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

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

В QGIS можно для элемента условного знака ( в данному случае точек внутри полигона ) задавать поле из которого будет браться угол поворота для нее. Но значение в это поле, на сколько я поняла, можно вводить только "вручную", то есть отдельно поворачивать точки внутри полигона при создании объекта нельзя.


Сами данные хранятся в PostgreSQL выводятся в QGIS. Возможно можно сделать функцию, которая при создании нового дома рассчитывала бы угол поворота для точки внутри него.

Угол можно в postgis рассчитать только ведь между линией-линией либо точкой-точкой. Поэтому пока месть не вижу логического решения этой задачи.

Подскажите свое виденье, а возможно и решение , если кто-то с подобным вопросом сталкивался.

Благодарю)

trir
Гуру
Сообщения: 5362
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 30 ноя 2016, 13:01

создать отдельный слой с точками - его можно реализовать как View в БД

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 30 ноя 2016, 13:03

Стиль слоя можете приложить?
Spatial is now, more than ever, just another column- The Geometry Column.

kasandra
Активный участник
Сообщения: 145
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

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

Сообщение kasandra » 30 ноя 2016, 13:09

trir писал(а):создать отдельный слой с точками - его можно реализовать как View в БД
Создавать лишнее объекты в БД не желательно, особенно если эти точки не есть обеты, а фактически просто часть уз.

trir
Гуру
Сообщения: 5362
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 30 ноя 2016, 13:12

Создание необходимых представлений является одним из ключевых аспектов хорошего дизайна базы данных SQL.
http://postgresql.ru.net/manual/tutorial-views.html

:wink:

kasandra
Активный участник
Сообщения: 145
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

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

Сообщение kasandra » 30 ноя 2016, 13:15

Denis Rykov писал(а):Стиль слоя можете приложить?
вот
style_bud.rar
(4.21 КБ) 221 скачивание

kasandra
Активный участник
Сообщения: 145
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

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

Сообщение kasandra » 30 ноя 2016, 13:16

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

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

kasandra
Активный участник
Сообщения: 145
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

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

Сообщение kasandra » 30 ноя 2016, 13:16

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

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

Аватара пользователя
AlexSek
Интересующийся
Сообщения: 18
Зарегистрирован: 12 апр 2010, 20:23
Репутация: 1
Контактная информация:

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

Сообщение AlexSek » 30 ноя 2016, 13:31

хочу альтернативу)
Альтернатива триггер в БД на поле geometry в нем и напишите вычисление поля angle.
П.С. названия полей просто для примера
Пишу красиво и грамотно...

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 30 ноя 2016, 13:40

Задачу можно решить и средствами самого QGIS, не трогая хранилище, сейчас посмотрю. Я правильно понял, что маркеры нужно сделать параллельными самой длинной стороне?
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 30 ноя 2016, 18:45

Самый просто вариант - написать свою функцию, определяющую угол поворота самой длинной стороны полигона и использовать её при расчёте угла поворота маркеров. В 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, я проверял на самой последней ночной сборке. Вот что получилось:
Вложения
marker-rotation.png
marker-rotation.png (17.93 КБ) 7620 просмотров
Spatial is now, more than ever, just another column- The Geometry Column.

kasandra
Активный участник
Сообщения: 145
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

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

Сообщение kasandra » 01 дек 2016, 20:43

Denis Rykov, спасибо!)

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

kasandra
Активный участник
Сообщения: 145
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

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

Сообщение kasandra » 01 дек 2016, 20:45

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

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

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 02 дек 2016, 04:06

Нажмите на "дополнительная информация", там должно быть сообщение об ошибке, из него будет ясно, что пошло не так.
Spatial is now, more than ever, just another column- The Geometry Column.

kasandra
Активный участник
Сообщения: 145
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

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

Сообщение kasandra » 21 дек 2016, 18:11

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

Ответить

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

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

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