Розрахунок часу сходу / заходу сонця при розгляді топографії


11

Я хочу обчислити час сходу та заходу сонця протягом цілого року для певного місця з урахуванням топографії. Можливо, схід / захід сонця не є правильними термінами, але те, що я хочу, - це час, коли сонце піднімається над горизонтом, і час, коли воно опускається нижче обрію, з урахуванням будь-яких пагорбів.

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


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

Відповіді:


2

Я встановив пакет ephem python в моїй системі GNU / Debian Linux і міг використовувати його на консолі 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 для обчислення азимуту та кутів висоти Сонця в конкретний час? Як я можу використовувати це, щоб знайти час, коли сонце піднімається над / горизонту нижче горизонту? (Зважаючи на топографію, я припускаю, що час заходу / сходу сонця, який виводить пакет ефему, передбачає ідеально рівну землю.)
Світ

2
Можливо, якесь поєднання r.horizon і PyEphem спрацювало б? Будь-які думки про те, як використовувати їх разом? У GRASS є модуль r.sun, який я можу використовувати для обчислення кількості годин прямого сонячного світла в заданому місці в даний день, що враховує топографію. Це, здається, майже робить те, що я хочу, але, здається, не видає фактичний час, коли пряме сонячне світло починається / зупиняється.
Світ

Перспективний і корисний, але він не враховує топографію. Видимий горизонт зсередини долини не є таким же, як справжній горизонт (непомічений).
alphabetasoup

@RichardLaw Топографію можна встановити методом "горизонт".
xunilk

1
Схоже, метод горизонту - це просто встановлення єдиного кута горизонту для всього горизонту? Якщо взяти до уваги топографію, горизонт не є ідеально рівним. Отже, кут до горизонту буде різним для кожного розрахованого азимуту. Модуль r.horizon видасть кут до горизонту для кожного різного азимута. Це не буде єдиним числом (наприклад, 5 градусів), а скоріше набором даних із серії висот для всіх азимутів (5 градусів висоти при 180 градусах азимуту, 6 градусів висоти при 185 градусах азимуту, 7 градусів висоти при 190 градусах градусів азимута тощо)
Світ

1

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


Чи можете ви запропонувати реалізувати це? У початковому запитанні пітон не згадується неявно, але ОП може отримати його, якщо приклад досить простий.
Майкл Стімсон

0

Ви можете використовувати трохи python для цього, але для початку вам потрібно створити словник або таблицю, з позиції ваших спостерігачів, кута до горизонту реального світу. Це повинно бути на рівні інтервалів 1 градуса з 0 = справжня північ і для кожного градуса, даючи кут горизонту. Це може з’явитися з вашого r.horizon.

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

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

Можливо навіть, що ви можете знайти деякі точки, де в даний день сонце сходить у долині, а потім проходить поза майданчиком за горою, потім знову з’являється над або з іншого боку гори.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.