Obliczanie czasu wschodu / zachodu słońca z uwzględnieniem topografii

11

Chcę obliczyć czas wschodu i zachodu słońca dla całego roku dla danej lokalizacji, biorąc pod uwagę topografię. Być może wschód / zachód słońca nie są odpowiednimi terminami, ale chcę, aby czas, w którym słońce wschodzi nad horyzontem, i czas, w którym spada on poniżej horyzontu, biorąc pod uwagę wszelkie wzgórza.

Używam QGIS lub GRASS. Mogę użyć r.horizon do wygenerowania kąta horyzontu z określonego punktu, ale nie jestem pewien, jak się tam dostać do czasów wschodu / zachodu słońca.

Stu
źródło
Brzmi jak odwrócony widok ... pod jakim kątem obserwator (słońce) może zobaczyć lokalizację, a następnie wykorzystać to jako przesunięcie w stosunku do standardowych czasów wschodu / zachodu. To bardzo dobre pytanie.
Michael Stimson

Odpowiedzi:

2

Zainstalowałem efemiczny pakiet python w moim systemie GNU / Debian Linux i mogłem go używać w konsoli Python QGIS. Stworzyłem obserwatora dla punktu w pobliżu jeziora Utah (USA) i obliczono wschodzące i zachodzące słońce na dzień „2010/6/21”. Skrypt był:

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. )

Po uruchomieniu w Python Console QGIS wynik był następujący:

>>>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

Oto odpowiedź.

Uwaga do edycji :

Definiowanie nowego horyzontu (np. 5 stopni):

.
.
.
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. )

wynik to:

>>>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
Xunilk
źródło
Dziękuję za to, wygląda na kawałek układanki. Wygląda na to, że przy pomocy PyEphem mógłbym obliczyć kąty azymutu i wysokości Słońca w określonym czasie? Jak mam to wykorzystać, aby znaleźć czas, kiedy słońce wschodzi powyżej / zachodzi poniżej horyzontu? (Uwzględniając topografię, zakładam, że czasy zachodu / wschodu słońca, które generuje pakiet efemeryczny, zakładają idealnie gładką ziemię.)
Stu
2
Może zadziała jakaś kombinacja r.horizon i PyEphem? Czy są jakieś przemyślenia na temat tego, jak używać tych dwóch urządzeń razem? GRASS ma moduł r.sun, którego mogę użyć do obliczenia liczby godzin bezpośredniego nasłonecznienia w danej lokalizacji w danym dniu, uwzględniając topografię. Wydaje się, że prawie robi to, co chcę, ale nie wydaje się wskazywać rzeczywistego czasu, w którym bezpośrednie światło słoneczne zaczyna / zatrzymuje się.
Stu
Obiecujący i użyteczny, ale nie uwzględnia topografii. Widoczny horyzont z wnętrza doliny nie jest taki sam jak prawdziwy horyzont (niezakłócony).
alphabetasoup
@RichardLaw Możesz ustawić topografię za pomocą metody „horizon”.
xunilk 27.04.16
1
Wygląda na to, że metoda horyzontu polega tylko na ustawieniu jednego kąta horyzontu dla całego horyzontu? Jeśli weźmiemy pod uwagę topografię, horyzont nie jest idealnie płaski. Zatem kąt do horyzontu będzie różny dla każdego obliczanego azymutu. Moduł r.horizon wyświetli kąt do horyzontu dla każdego innego azymutu. Nie będzie to pojedyncza liczba (np. 5 stopni), ale raczej zestaw danych serii rzędnych dla wszystkich azymutów (5 stopni w azymucie 180 stopni, 6 stopni w azymucie 185 stopni, 7 stopni w 190 stopniach stopni azymutu itp.)
Stu
1

Możesz użyć biblioteki takiej jak PyEphem, aby znaleźć, dla danej lokalizacji, wysokości, dnia, czasu (ów) i planety;) kątów azymutu i wysokości słońca.

użytkownik71991
źródło
Czy możesz zasugerować wdrożenie tego? W pierwotnym pytaniu nie ma wzmianki o pythonie pośrednio, ale OP może być w stanie je podnieść, jeśli przykład jest wystarczająco prosty.
Michael Stimson
0

Możesz użyć do tego trochę Pythona, ale najpierw musisz wygenerować słownik lub tabelę, z pozycji obserwatora, pod kątem kąta do horyzontu świata rzeczywistego. Musiałoby to być, powiedzmy, w odstępach co 1 stopień, przy czym 0 = prawdziwa północ i dla każdego stopnia podając kąt horyzontu. To może pochodzić z twojego r.horizon.

Możesz następnie użyć pyephemdo a) stworzyć observerszerokość geograficzną, długość i wysokość swojego obserwatora i dla każdej minuty danego dnia użyć go do obliczenia pozornych pozycji słońca, byłyby one podane jako cztery wartości: ra, dec, alt i az.

Następnie dla każdej wartości czasu możesz porównać alt z wartością z tabeli wysokości w tym azymucie, a gdy alt jest większa niż wartość w tabeli, będziesz mógł zobaczyć słońce.

Możliwe jest nawet, że uda ci się znaleźć punkty, w których w danym dniu słońce wschodzi w dolinie, a następnie opuszcza miejsce za górą, a następnie ponownie pojawia się za lub po drugiej stronie góry.

Steve Barnes
źródło