определение угла поворота для элемента условного знака
-
kasandra
- Активный участник
- Сообщения: 145
- Зарегистрирован: 09 апр 2014, 11:33
- Репутация: 2
определение угла поворота для элемента условного знака
Добрый день!
Стоит такая задача. Есть дома ( как полигональные объекты). УЗ для дома с этажностью до 4 эт. это некоторый закрашенный полигон с точками внутри него.
При создании такого УЗ в QGIS, точки конечно же не ориентируються по большой стороне полигона (дома) и выходит вот такой не красивый УЗ как на рис.1.
В QGIS можно для элемента условного знака ( в данному случае точек внутри полигона ) задавать поле из которого будет браться угол поворота для нее. Но значение в это поле, на сколько я поняла, можно вводить только "вручную", то есть отдельно поворачивать точки внутри полигона при создании объекта нельзя.
Сами данные хранятся в PostgreSQL выводятся в QGIS. Возможно можно сделать функцию, которая при создании нового дома рассчитывала бы угол поворота для точки внутри него.
Угол можно в postgis рассчитать только ведь между линией-линией либо точкой-точкой. Поэтому пока месть не вижу логического решения этой задачи.
Подскажите свое виденье, а возможно и решение , если кто-то с подобным вопросом сталкивался.
Благодарю)
Стоит такая задача. Есть дома ( как полигональные объекты). УЗ для дома с этажностью до 4 эт. это некоторый закрашенный полигон с точками внутри него.
При создании такого УЗ в QGIS, точки конечно же не ориентируються по большой стороне полигона (дома) и выходит вот такой не красивый УЗ как на рис.1.
В QGIS можно для элемента условного знака ( в данному случае точек внутри полигона ) задавать поле из которого будет браться угол поворота для нее. Но значение в это поле, на сколько я поняла, можно вводить только "вручную", то есть отдельно поворачивать точки внутри полигона при создании объекта нельзя.
Сами данные хранятся в PostgreSQL выводятся в QGIS. Возможно можно сделать функцию, которая при создании нового дома рассчитывала бы угол поворота для точки внутри него.
Угол можно в postgis рассчитать только ведь между линией-линией либо точкой-точкой. Поэтому пока месть не вижу логического решения этой задачи.
Подскажите свое виденье, а возможно и решение , если кто-то с подобным вопросом сталкивался.
Благодарю)
-
trir
- Гуру
- Сообщения: 5362
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: определение угла поворота для элемента условного знака
создать отдельный слой с точками - его можно реализовать как View в БД
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: определение угла поворота для элемента условного знака
Стиль слоя можете приложить?
Spatial is now, more than ever, just another column- The Geometry Column.
-
kasandra
- Активный участник
- Сообщения: 145
- Зарегистрирован: 09 апр 2014, 11:33
- Репутация: 2
Re: определение угла поворота для элемента условного знака
Создавать лишнее объекты в БД не желательно, особенно если эти точки не есть обеты, а фактически просто часть уз.trir писал(а):создать отдельный слой с точками - его можно реализовать как View в БД
-
trir
- Гуру
- Сообщения: 5362
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: определение угла поворота для элемента условного знака
http://postgresql.ru.net/manual/tutorial-views.htmlСоздание необходимых представлений является одним из ключевых аспектов хорошего дизайна базы данных SQL.
-
kasandra
- Активный участник
- Сообщения: 145
- Зарегистрирован: 09 апр 2014, 11:33
- Репутация: 2
Re: определение угла поворота для элемента условного знака
вотDenis Rykov писал(а):Стиль слоя можете приложить?
-
kasandra
- Активный участник
- Сообщения: 145
- Зарегистрирован: 09 апр 2014, 11:33
- Репутация: 2
Re: определение угла поворота для элемента условного знака
спасибо, я понимаю, что объекты виртуальныtrir писал(а):http://postgresql.ru.net/manual/tutorial-views.htmlСоздание необходимых представлений является одним из ключевых аспектов хорошего дизайна базы данных SQL.
-
kasandra
- Активный участник
- Сообщения: 145
- Зарегистрирован: 09 апр 2014, 11:33
- Репутация: 2
Re: определение угла поворота для элемента условного знака
хочу альтернативу)kasandra писал(а):спасибо, я понимаю, что объекты виртуальныtrir писал(а):http://postgresql.ru.net/manual/tutorial-views.htmlСоздание необходимых представлений является одним из ключевых аспектов хорошего дизайна базы данных SQL.
- AlexSek
- Интересующийся
- Сообщения: 18
- Зарегистрирован: 12 апр 2010, 20:23
- Репутация: 1
- Контактная информация:
Re: определение угла поворота для элемента условного знака
Альтернатива триггер в БД на поле geometry в нем и напишите вычисление поля angle.хочу альтернативу)
П.С. названия полей просто для примера
Пишу красиво и грамотно...
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: определение угла поворота для элемента условного знака
Задачу можно решить и средствами самого QGIS, не трогая хранилище, сейчас посмотрю. Я правильно понял, что маркеры нужно сделать параллельными самой длинной стороне?
Spatial is now, more than ever, just another column- The Geometry Column.
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: определение угла поворота для элемента условного знака
Самый просто вариант - написать свою функцию, определяющую угол поворота самой длинной стороны полигона и использовать её при расчёте угла поворота маркеров. В QGIS это делается следующим образом: открываете окно редактирования выражений и переходите во вкладку "Function Editor", нажимаете "New file" и задаёте произвольное имя файла. В панель справа помещаете следующий код с необходимой функцией и нажимаете "Load":
После этого идёте и для каждого Simple Marker-а в поле Rotation выбираете Edit и указываете выражение:После чего ваши маркеры будут выровнены вдоль самой длинной стороны полигона. Плагин написан на коленке и толком не тестировался, если потребуется - можете его самостоятельно допилить. Если хотите, чтобы ваши функции работали и на других машинах, то нужно перенести файл(ы) с этими функциями (в Linux расположены в ~/.qgis2/python/expressions). Для работы данной конкретной функции нужен QGIS не ниже 2.10, я проверял на самой последней ночной сборке. Вот что получилось:
Код: Выделить всё
"""
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- Вложения
-
- marker-rotation.png (17.93 КБ) 7590 просмотров
Spatial is now, more than ever, just another column- The Geometry Column.
-
kasandra
- Активный участник
- Сообщения: 145
- Зарегистрирован: 09 апр 2014, 11:33
- Репутация: 2
Re: определение угла поворота для элемента условного знака
Denis Rykov, спасибо!)
Подскажите, Что я делаю не так?
1. Версия QGIS 2.14 и 2.18. Захожу Свойства слоя-Стили - для нужного условного знака захожу в редактирование маркера (т.е. точки)-для угла поворота открываю окно Конструктор выражений - Редактор функция - выбираю новый файл и добавляю предложенную функцию. 2. Во вкладке Выражение этого же диалогового окна вызываю эту функцию (скрин2) и мне выдает ошибку.
Подскажите, Что я делаю не так?
1. Версия QGIS 2.14 и 2.18. Захожу Свойства слоя-Стили - для нужного условного знака захожу в редактирование маркера (т.е. точки)-для угла поворота открываю окно Конструктор выражений - Редактор функция - выбираю новый файл и добавляю предложенную функцию. 2. Во вкладке Выражение этого же диалогового окна вызываю эту функцию (скрин2) и мне выдает ошибку.
Последний раз редактировалось kasandra 01 дек 2016, 22:44, всего редактировалось 1 раз.
-
kasandra
- Активный участник
- Сообщения: 145
- Зарегистрирован: 09 апр 2014, 11:33
- Репутация: 2
Re: определение угла поворота для элемента условного знака
AlexSek писал(а):Альтернатива триггер в БД на поле geometry в нем и напишите вычисление поля angle.хочу альтернативу)
П.С. названия полей просто для примера
Спасибо) Я понимаю, что решаться вопрос может на уровне БД. Как я говорила ранее, не смогла выстроить логическую цепочку решения этой задачи с помощью функций postgis.
Если Вы можете мне в этом помочь - буду благодарна!
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: определение угла поворота для элемента условного знака
Нажмите на "дополнительная информация", там должно быть сообщение об ошибке, из него будет ясно, что пошло не так.
Spatial is now, more than ever, just another column- The Geometry Column.
-
kasandra
- Активный участник
- Сообщения: 145
- Зарегистрирован: 09 апр 2014, 11:33
- Репутация: 2
Re: определение угла поворота для элемента условного знака
Выдает вот такую ошибку, что нужно подправить во функции?
Ошибка разбора:
Ошибка выполнения:
'QgsPointV2' object has no attribute 'distance'
Ошибка разбора:
Ошибка выполнения:
'QgsPointV2' object has no attribute 'distance'
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 17 гостей