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

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

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

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

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

Сообщение 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
konst555
Активный участник
Сообщения: 214
Зарегистрирован: 11 авг 2015, 16:13
Репутация: 47

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

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

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

Сообщение GGG »

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

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

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

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