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

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

Добавлено: 17 июл 2021, 17:32
gimran
выявлена ошибка, спустя много лет, в расчете румбов:
ЮЗ = 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

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

Добавлено: 22 дек 2022, 03:53
Yas
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

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

Добавлено: 22 дек 2022, 16:53
konst555
Немного не понял зачем такой расчет нужен? Всегда пользовался 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

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

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