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

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

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

Сообщение gimran » 17 июл 2021, 17:32

выявлена ошибка, спустя много лет, в расчете румбов:
ЮЗ = a ​- 180


испрвавленный листинг

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

#!/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(a - 180)			
           ​c = round((a - 180),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

Yas
Новоприбывший
Сообщения: 3
Зарегистрирован: 09 дек 2010, 18:54
Репутация: 1

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

Сообщение Yas » 22 дек 2022, 03:53

gimran,
спасибо большое за функцию, полезный инструмент.
Но мы с коллегой нашли ошибку в расчетах. Если память не изменяет, то это несколько минут.
Измененный код ниже:

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
##rumb(xat(0),yat(0),xat(-1),yat(-1))
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

    
    def calculate_rumb(degree, direction):
        dd = int(degree)
        mm = round((degree - dd)*60)
        rumb = direction + ' ' + str(dd) + '° ' + str(mm) + '`'
        return(rumb)


    if 0 < a < 90:
        d = 'NE'
        rumb_value = calculate_rumb(a, d)
    elif 90 < a < 180:
        a = 180 - a
        d = 'SE'
        rumb_value = calculate_rumb(a, d)
    elif 180 < a < 270:
        a = a - 180
        d = 'SW'
        rumb_value = calculate_rumb(a, d)
    elif 270 < a < 360:
        a = 360 - a
        d = 'NW'
        rumb_value = calculate_rumb(a, d)
    elif a == 0:
        rumb_value = 'N'
    elif a == 90:
        rumb_value = 'E'
    elif a == 180:
        rumb_value = 'S'
    elif a == 270:
        rumb_value = 'W'
    else:
        rumb_value = 'error'
    return rumb_value

konst555
Активный участник
Сообщения: 210
Зарегистрирован: 11 авг 2015, 16:13
Репутация: 45

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

Сообщение konst555 » 22 дек 2022, 16:53

Немного не понял зачем такой расчет нужен? Всегда пользовался 16 или 32 румбами.
Тем не менее, ваш расчет интересен. Не совсем понимаю зачем нужно отклонение от направления румба?
Прилагаю немного другой подход, который более характерен для Python. Можно и отклонения посчитать, но не понял зачем.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
##rumb(xat(0),yat(0),xat(-1),yat(-1))
from qgis.core import *
from qgis.gui import *

@qgsfunction(args='auto', group='Custom')
def rumb16(x1,y1,x2,y2, feature, parent):
r16 = ['N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','SW','WSW','W','WNW','NW','NNW','N']
p1 = QgsPoint(x1,y1)
p2 = QgsPoint(x2,y2)
a = p1.azimuth(p2)

if a < 0: a += 360

direction = r16[round(a/22.5)]
dd = int(a)
mm = round((a - dd)*60)
rumb_value = direction + ' ' + str(dd) + '° ' + str(mm) + '`'

return rumb_value

GGG
Новоприбывший
Сообщения: 1
Зарегистрирован: 01 фев 2023, 13:01
Репутация: 0
Откуда: Изгорода

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

Сообщение GGG » 01 фев 2023, 13:05

Добрый день, могли бы вы добавить в функцию расчет еще и секунд.

Ответить

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

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

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