расчет румбов в QGIS

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Аватара пользователя
gimran
Гуру
Сообщения: 1902
Зарегистрирован: 07 июл 2010, 15:43
Репутация: 242
Откуда: Уфа

расчет румбов в QGIS

Сообщение gimran » 29 мар 2017, 11:48

Пока просто функция, но может кому пригодится:

Открываем калькулятор полей.

В нем открываем "Редактор функций" и вставляем эту функцию:

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from qgis.core import *
from qgis.gui import *
 
@qgsfunction(args='auto', group='Custom')
def rumb(x1,y1,x2,y2, feature, parent):
    p1 = QgsPoint(x1,y1)
    p2 = QgsPoint(x2,y2)
    a = p1.azimuth(p2)
    if a <= 0:
       a += 360
   
    if a < 90:
        if a > 0: 
            d =   math.floor(a)      
            c = round(a,1)
            e = round(((c - d)*60),0)   
            b = u'СВ ' + str(int(d)) + u'°' + str(int(e)) + u'`'
      
    if a == 90:
        b = 'СВ 0°0`'
  
    if a > 270:
        if a < 360: 
            d =   math.floor(360 - a)         
            c = round((360 - a),1)
            e = round(((c - d)*60),0)         
            b = u'СЗ ' + str(int(d)) + u'°' + str(int(e)) + u'`'
        if a == 360: 
            b = u'СЗ 0°0`'
        
    if a > 180:
        if a < 270:
            d =   math.floor(270 - a)         
            c = round((270 - a),1)
            e = round(((c - d)*60),0)            
            b = u'ЮЗ ' + str(int(d)) + u'°' + str(int(e)) + u'`'
        if a == 270:
            b = u'ЮЗ 0°0`'
  
    if a > 90:
        if a < 180:
            d =   math.floor(180 - a)         
            c = round((180 - a),1)
            e = round(((c - d)*60),0)         
            b = u'ЮВ ' + str(int(d)) + u'°' + str(int(e)) + u'`'
        if a == 180:
            b = u'ЮВ 0°0`'
    b.encode( "cp866" )
    return b
Выполняем ("Выполнить сценарий").

Теперь в qgis можно выбрать линейный слой, а в калькуляторе полей можно ввести:

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

rumb( xat(0),yat(0),xat(-1),yat(-1))
Добавится колонка с румбами вида:

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

СЗ 20°10`
Последний раз редактировалось gimran 29 мар 2017, 13:03, всего редактировалось 2 раза.

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2227
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1500
Откуда: Казань

Re: расчет румбов в QGIS

Сообщение Игорь Белов » 29 мар 2017, 12:24

gimran писал(а):Добавится колонка с румбами вида:

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

СЗ 120°10`
Странно. Разве румб не должен быть в диапазоне 0‥90°?
The purpose of computing is insight, not numbers

Аватара пользователя
gimran
Гуру
Сообщения: 1902
Зарегистрирован: 07 июл 2010, 15:43
Репутация: 242
Откуда: Уфа

Re: расчет румбов в QGIS

Сообщение gimran » 29 мар 2017, 12:32

так, это я в примере затупил :)
да, от 0 до 90 :)

Аватара пользователя
gimran
Гуру
Сообщения: 1902
Зарегистрирован: 07 июл 2010, 15:43
Репутация: 242
Откуда: Уфа

Re: расчет румбов в QGIS

Сообщение gimran » 29 мар 2017, 13:02

Исправлена функция (появлялись отрицательные значения в минутах):

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from qgis.core import *
from qgis.gui import *
 
@qgsfunction(args='auto', group='Custom')
def rumb(x1,y1,x2,y2, feature, parent):
    p1 = QgsPoint(x1,y1)
    p2 = QgsPoint(x2,y2)
    a = p1.azimuth(p2)
    if a <= 0:
	    a += 360
	
    if a < 90:
        if a > 0: 
            d =	math.floor(a)		
            c = round(a,1)
            e = round(((c - d)*60),0)	
            b = u'СВ ' + str(int(d)) + u'°' + str(int(e)) + u'`'
		
    if a == 90:
        b = 'СВ 0°0`'
  
    if a > 270:
        if a < 360: 
            d =	math.floor(360 - a)			
            c = round((360 - a),1)
            e = round(((c - d)*60),0)			
            b = u'СЗ ' + str(int(d)) + u'°' + str(int(e)) + u'`'
        if a == 360: 
            b = u'СЗ 0°0`'
        
    if a > 180:
        if a < 270:
            d =	math.floor(270 - a)			
            c = round((270 - a),1)
            e = round(((c - d)*60),0)				
            b = u'ЮЗ ' + str(int(d)) + u'°' + str(int(e)) + u'`'
        if a == 270:
            b = u'ЮЗ 0°0`'
  
    if a > 90:
        if a < 180:
            d =	math.floor(180 - a)			
            c = round((180 - a),1)
            e = round(((c - d)*60),0)			
            b = u'ЮВ ' + str(int(d)) + u'°' + str(int(e)) + u'`'
        if a == 180:
            b = u'ЮВ 0°0`'
    b.encode( "cp866" )
    return b
верхний пост обносил

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2227
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1500
Откуда: Казань

Re: расчет румбов в QGIS

Сообщение Игорь Белов » 29 мар 2017, 15:26

Несколько более компактный вариант:

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


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from qgis.core import *
from qgis.gui import *
import math

@qgsfunction(args='auto', group='Custom')
def rumb(x1, y1, x2, y2, feature, parent):
a = math.degrees(math.atan2(math.fabs(x2 - x1), math.fabs(y2 - y1)))
c = math.modf(a)
if y2 >= y1:
b = u'\u0421'
else:
b = u'\u042e'

if x2 >= x1:
b += u'\u0412'
else:
b += u'\u0417'

b += u' {:02.0f}\u00b0{:02.0f}\''.format(c[1], math.floor(c[0] * 60.0))
return b
Последний раз редактировалось Игорь Белов 30 мар 2017, 07:31, всего редактировалось 1 раз.
The purpose of computing is insight, not numbers

Аватара пользователя
gimran
Гуру
Сообщения: 1902
Зарегистрирован: 07 июл 2010, 15:43
Репутация: 242
Откуда: Уфа

Re: расчет румбов в QGIS

Сообщение gimran » 29 мар 2017, 18:12

Спасибо за поправку. Это мой первый скрипт на питоне.
Да, написан очень коряво :)

[ Сообщение с мобильного устройства ]

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2227
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1500
Откуда: Казань

Re: расчет румбов в QGIS

Сообщение Игорь Белов » 29 мар 2017, 19:51

Это не поправка, просто вариант.

А у Вас первый скрипт, и он работает!
The purpose of computing is insight, not numbers

vasilij163
Интересующийся
Сообщения: 18
Зарегистрирован: 16 янв 2017, 14:19
Репутация: 0

Re: расчет румбов в QGIS

Сообщение vasilij163 » 13 авг 2019, 21:24

Добрый день ! Что побываю сделать в версии 3.8 qgis не получается.

Аватара пользователя
gimran
Гуру
Сообщения: 1902
Зарегистрирован: 07 июл 2010, 15:43
Репутация: 242
Откуда: Уфа

Re: расчет румбов в QGIS

Сообщение gimran » 14 авг 2019, 15:37

А какая ошибка?

Аватара пользователя
gimran
Гуру
Сообщения: 1902
Зарегистрирован: 07 июл 2010, 15:43
Репутация: 242
Откуда: Уфа

Re: расчет румбов в QGIS

Сообщение gimran » 15 авг 2019, 07:35

Открыл QGIS Desktop 3.6.3. Затем - Калькулятор полей - Редактор функций.
Вставил код из комментария Игоря Белова в правое верхнее поле. Нажал Save and Load Functions.
Открыл заново Калькулятор полей - в Custom добавилась функция rumb.

vasilij163
Интересующийся
Сообщения: 18
Зарегистрирован: 16 янв 2017, 14:19
Репутация: 0

Re: расчет румбов в QGIS

Сообщение vasilij163 » 15 авг 2019, 19:34

gimran, Вы меня простите . функция появилась. на как дальше получить румбы участка.

Аватара пользователя
gimran
Гуру
Сообщения: 1902
Зарегистрирован: 07 июл 2010, 15:43
Репутация: 242
Откуда: Уфа

Re: расчет румбов в QGIS

Сообщение gimran » 16 авг 2019, 00:17

Теперь в qgis можно выбрать линейный слой, а в калькуляторе полей нужно ввести:

rumb( xat(0),yat(0),xat(-1),yat(-1))

И укажите для какой колонки считать

vasilij163
Интересующийся
Сообщения: 18
Зарегистрирован: 16 янв 2017, 14:19
Репутация: 0

Re: расчет румбов в QGIS

Сообщение vasilij163 » 17 авг 2019, 08:49

а как сделать чтобы получить румбы от точки 0-1 : 1-2: 2-3: 3-4: 4-1:. У меня вот что получилось.
Вложения
ef4aad88e9.jpg
ef4aad88e9.jpg (44.44 КБ) 12460 просмотров

inout
Новоприбывший
Сообщения: 6
Зарегистрирован: 13 апр 2019, 15:35
Репутация: 3
Откуда: Тюмень

Re: расчет румбов в QGIS

Сообщение inout » 17 авг 2019, 09:27

Делал модуль на пайтоне для вывода каталога координат выделенного простого линейного или простого площадного объекта. Он создаёт таблицу точечных объектов с полями x, y, l, azimuth и выводит номера узлов в карте. То же самое можно сделать последовательно модулем processing но здесь быстрее.
Так вот к нему легко можно прикрутить эту функцию для румбов, азимут в каком-то виде уже ведь даёт, будет три в одном)) Мой первый модуль и пока единственный) Из минусов, что сейчас не работает с мультиобъектами.
[attachment=0]2019-08-17_11-22-20.png[/attachment]
https://plugins.qgis.org/plugins/coord_ ... rsion/0.2/
Вложения
2019-08-17_11-22-20.png
2019-08-17_11-22-20.png (60.71 КБ) 12455 просмотров
Последний раз редактировалось inout 21 авг 2019, 17:11, всего редактировалось 2 раза.

Аватара пользователя
gimran
Гуру
Сообщения: 1902
Зарегистрирован: 07 июл 2010, 15:43
Репутация: 242
Откуда: Уфа

Re: расчет румбов в QGIS

Сообщение gimran » 19 авг 2019, 20:06

Василий, не выделяйте объекты, а выберите для всех линий.
Я делал в processing'е разбиение объекта по вершинам, а затем расчет

Ответить

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

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

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