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

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

Добавлено: 29 мар 2017, 11:48
gimran
Пока просто функция, но может кому пригодится:

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

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

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

#!/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`

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

Добавлено: 29 мар 2017, 12:24
Игорь Белов
gimran писал(а):Добавится колонка с румбами вида:

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

СЗ 120°10`
Странно. Разве румб не должен быть в диапазоне 0‥90°?

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

Добавлено: 29 мар 2017, 12:32
gimran
так, это я в примере затупил :)
да, от 0 до 90 :)

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

Добавлено: 29 мар 2017, 13:02
gimran
Исправлена функция (появлялись отрицательные значения в минутах):

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

#!/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
верхний пост обносил

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

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

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

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

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

Добавлено: 29 мар 2017, 19:51
Игорь Белов
Это не поправка, просто вариант.

А у Вас первый скрипт, и он работает!

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

Добавлено: 13 авг 2019, 21:24
vasilij163
Добрый день ! Что побываю сделать в версии 3.8 qgis не получается.

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

Добавлено: 14 авг 2019, 15:37
gimran
А какая ошибка?

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

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

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

Добавлено: 15 авг 2019, 19:34
vasilij163
gimran, Вы меня простите . функция появилась. на как дальше получить румбы участка.

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

Добавлено: 16 авг 2019, 00:17
gimran
Теперь в qgis можно выбрать линейный слой, а в калькуляторе полей нужно ввести:

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

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

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

Добавлено: 17 авг 2019, 08:49
vasilij163
а как сделать чтобы получить румбы от точки 0-1 : 1-2: 2-3: 3-4: 4-1:. У меня вот что получилось.

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

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

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

Добавлено: 19 авг 2019, 20:06
gimran
Василий, не выделяйте объекты, а выберите для всех линий.
Я делал в processing'е разбиение объекта по вершинам, а затем расчет