Расчет времени восхода / захода солнца с учетом топографии


11

Я хочу рассчитать время восхода и захода солнца за полный год для данного местоположения с учетом топографии. Возможно, восход / закат не являются правильными терминами, но я хочу, чтобы солнце взошло над горизонтом и когда оно опускается ниже горизонта, принимая во внимание любые холмы.

Я использую QGIS или GRASS. Я могу использовать r.horizon для генерации угла горизонта от конкретной точки, но я не уверен, как добраться оттуда до времени восхода / захода солнца.


Звучит как обратный обзор ... под каким углом наблюдатель (солнце) может увидеть местоположение, а затем использовать его как смещение к стандартному времени восхода / установки. Это очень хороший вопрос.
Майкл Стимсон

Ответы:


2

Я установил пакет ephem python в свою систему Linux GNU / Debian и мог использовать его на консоли Python QGIS. Я создал наблюдателя для точки возле озера Юта (США), и она рассчитывала восходящее и заходящее солнце на день «2010/6/21». Сценарий был:

import ephem

#defining an observer
obs = ephem.Observer()

#defining position
long = '-112.092807'
lat = '40.135114'

obs.long = ephem.degrees(long)
obs.lat = ephem.degrees(lat)

print "long = ", obs.long, "lat = ", obs.lat

#defining date
date = '2010/6/21'

obs.date = ephem.Date(date)

#defining an astronomic object; Sun in this case
sun = ephem.Sun(obs)

r1 = obs.next_rising(sun)
s1 = obs.next_setting(sun)

print "rising sun (UTC time): ", r1
print "setting sun (UTC time): ", s1

r1_lt = ephem.Date(r1 - 6 * ephem.hour) #local time 

(y, mn, d, h, min, s) = r1_lt.tuple()

print "rising sun: (local time): {:.2f}".format( h + min/60. + s/3600. )

s1_lt = ephem.Date(s1 - 6 * ephem.hour) #local time

(y, mn, d, h, min, s) = s1_lt.tuple()

print "setting sun (local time): {:.2f}".format( h + min/60. + s/3600. )

После запуска на консоли Python QGIS, результат был:

>>>execfile(u'/home/zeito/pyqgis_scripts/ephem.py'.encode('UTF-8'))
long =  -112:05:34.1 lat =  40:08:06.4
rising sun (UTC time):  2010/6/21 11:58:58
setting sun (UTC time):  2010/6/21 03:01:14
rising sun: (local time): 5.98
setting sun (local time): 21.02

Это ответ.

Редактирование заметки :

Определение нового горизонта (например, 5 градусов):

.
.
.
obs.horizon = '5'

sun = ephem.Sun(obs)

r1 = obs.next_rising(sun)
s1 = obs.next_setting(sun)

print "rising sun (UTC time): ", r1
print "setting sun (UTC time): ", s1

r1_lt = ephem.Date(r1 - 6 * ephem.hour) #local time 

(y, mn, d, h, min, s) = r1_lt.tuple()

print "rising sun: (local time): {:.2f}".format( h + min/60. + s/3600. )

s1_lt = ephem.Date(s1 - 6 * ephem.hour) #local time

(y, mn, d, h, min, s) = s1_lt.tuple()

print "setting sun (local time): {:.2f}".format( h + min/60. + s/3600. )

результат:

>>>execfile(u'/home/zeito/pyqgis_scripts/ephem.py'.encode('UTF-8'))
long =  -112:05:34.1 lat =  40:08:06.4
rising sun (UTC time):  2010/6/21 12:31:48
setting sun (UTC time):  2010/6/21 02:28:24
rising sun: (local time): 6.53
setting sun (local time): 20.47

Спасибо за это, похоже на кусочек головоломки. Кажется, я мог бы использовать PyEphem, чтобы вычислить азимут и высотные углы солнца в определенное время? Как я тогда использую это, чтобы найти время, когда солнце поднимается выше / садится ниже горизонта? (Учитывая топографию, я предполагаю, что времена заката / восхода, которые выводит пакет ephem, предполагают совершенно гладкую землю.)
Stu

2
Возможно, подойдет какая-то комбинация r.horizon и PyEphem? Любые мысли о том, как использовать два вместе? У GRASS есть модуль r.sun, который я могу использовать для расчета количества часов прямого солнечного света в данном месте в определенный день с учетом топографии. Кажется, это почти делает то, что я хочу, но, похоже, не выдает фактического времени, когда прямой солнечный свет начинает / останавливается.
Stu

Многообещающе и полезно, но не учитывает топографию. Видимый горизонт изнутри долины не совпадает с истинным горизонтом (незаметным).
alphabetasoup

@RichardLaw Вы можете установить топографию с помощью метода «горизонт».
xunilk

1
Кажется, что метод горизонта просто устанавливает один угол горизонта для всего горизонта? Если принять во внимание топографию, горизонт не идеально ровный. Таким образом, угол к горизонту будет разным для каждого рассчитанного азимута. Модуль r.horizon будет выводить угол к горизонту для каждого отдельного азимута. Это будет не одно число (например, 5 градусов), а набор данных из серии высот для всех азимутов (5 градусов при 180 градусов по азимуту, 6 градусов при 185 градусах по азимуту, 7 градусов при 190 градусах) градусы азимута и т. д.)
Stu

1

Вы можете использовать такую ​​библиотеку, как PyEphem, чтобы найти для заданного местоположения высоту, день, время (а) и планету; азимут и высотный угол солнца.


Можете ли вы предложить реализацию этого? В первоначальном вопросе ничего не говорится о Python, но OP может его найти, если пример достаточно прост.
Майкл Стимсон

0

Вы можете использовать немного Python, чтобы сделать это, но сначала вам нужно сгенерировать словарь или таблицу с позиции наблюдателя, угол которой к горизонту реального мира, по-видимому, равен. Это должно происходить, скажем, с интервалами в 1 градус, где 0 = истинный север и для каждого градуса указывается угол горизонта. Это может исходить от вашего r.horizon.

Затем вы можете использовать pyephema) для создания observerна широте, долготе и высоте вашего наблюдателя и для каждой минуты данного дня использовать его для вычисления видимых положений солнца, они будут представлены как четыре значения, ra, dec, alt и аз.

Затем для каждого значения времени вы можете сравнить альт со значением из таблицы высот по этому азимуту, и когда альт будет больше, чем значение в таблице, вы сможете увидеть солнце.

Возможно даже, что вы сможете найти некоторые точки, где в определенный день солнце поднимается в долине, а затем выходит за пределы площадки за горой, а затем вновь появляется над или с другой стороны горы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.