Berechnung der Sonnenaufgangs- / Sonnenuntergangszeit unter Berücksichtigung der Topographie

11

Ich möchte die Sonnenaufgangs- und Sonnenuntergangszeiten für ein ganzes Jahr für einen bestimmten Ort unter Berücksichtigung der Topographie berechnen. Vielleicht sind Sonnenaufgang / Sonnenuntergang nicht die richtigen Begriffe, aber ich möchte die Zeit, zu der die Sonne über dem Horizont aufgeht, und die Zeit, zu der sie unter Berücksichtigung aller Hügel unter den Horizont fällt.

Ich benutze QGIS oder GRASS. Ich kann r.horizon verwenden, um den Horizontwinkel von einem bestimmten Punkt aus zu generieren, bin mir aber nicht sicher, wie ich von dort zu den Sonnenaufgangs- / Sonnenuntergangszeiten komme.

Stu
quelle
Klingt nach einem umgekehrten Sichtfeld ... in welchem ​​Winkel kann der Betrachter (Sonne) den Ort sehen und diesen dann als Versatz zu den Standardzeiten für Sonnenaufgang / -einstellung verwenden. Das ist eine sehr gute Frage.
Michael Stimson

Antworten:

2

Ich habe das Ephem- Python-Paket in meinem GNU / Debian-Linux-System installiert und konnte es in der Python-Konsole von QGIS verwenden. Ich habe einen Beobachter für einen Punkt in der Nähe des Utah Lake (USA) erstellt und er hat die aufgehende und untergehende Sonne für den Tag '2010/6/21' berechnet. Das Skript war:

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

Nach dem Ausführen an der Python-Konsole von QGIS war das Ergebnis:

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

Das ist die Antwort.

Bearbeitungshinweis :

Definieren eines neuen Horizonts (z. B. 5 Grad):

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

Das Ergebnis ist:

>>>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
quelle
Vielen Dank dafür, es scheint ein Teil des Puzzles zu sein. Es scheint, als könnte ich PyEphem verwenden, um den Azimut- und Höhenwinkel der Sonne zu einem bestimmten Zeitpunkt zu berechnen. Wie verwende ich das dann, um die Zeit zu finden, zu der die Sonne über / unter dem Horizont aufgeht / untergeht? (Unter Berücksichtigung der Topographie gehe ich davon aus, dass die Sonnenuntergangs- / Sonnenaufgangszeiten, die das Ephem-Paket ausgibt, eine vollkommen glatte Erde annehmen.)
Stu
2
Vielleicht würde eine Kombination aus r.horizon und PyEphem funktionieren? Irgendwelche Gedanken darüber, wie man die beiden zusammen benutzt? GRASS hat ein Modul r.sun, mit dem ich die Anzahl der Stunden direkter Sonneneinstrahlung an einem bestimmten Ort an einem bestimmten Tag unter Berücksichtigung der Topographie berechnen kann. Das scheint fast das zu tun, was ich will, aber es scheint nicht die tatsächliche Zeit auszugeben, zu der das direkte Sonnenlicht startet / stoppt.
Stu
Vielversprechend und nützlich, berücksichtigt aber nicht die Topographie. Der sichtbare Horizont von der Innenseite eines Tals ist nicht der gleiche wie der wahre Horizont (ungehindert).
Alphabetasoup
@RichardLaw Sie können die Topographie mit der 'Horizont'-Methode einstellen.
Xunilk
1
Es scheint, als würde die Horizontmethode nur einen einzigen Horizontwinkel für den gesamten Horizont festlegen. Wenn wir die Topographie berücksichtigen, ist der Horizont nicht perfekt flach. Der Winkel zum Horizont ist also für jeden berechneten Azimut unterschiedlich. Das r.horizon-Modul gibt den Winkel zum Horizont für jeden unterschiedlichen Azimut aus. Es handelt sich nicht um eine einzelne Zahl (z. B. 5 Grad), sondern um einen Datensatz einer Reihe von Höhen für alle Azimute (5 Grad Höhe bei 180 Grad Azimut, 6 Grad Höhe bei 185 Grad Azimut, 7 Grad Höhe bei 190 Grad) Grad Azimut usw.)
Stu
1

Sie können eine Bibliothek wie PyEphem verwenden, um für einen bestimmten Ort Höhe, Tag, Zeit (en) (und Planeten;) die Azimut- und Höhenwinkel der Sonne zu ermitteln.

user71991
quelle
Können Sie eine Implementierung vorschlagen? In der ursprünglichen Frage wird Python nicht implizit erwähnt, aber das OP kann es möglicherweise aufgreifen, wenn das Beispiel einfach genug ist.
Michael Stimson
0

Sie können dazu ein wenig Python verwenden, aber Sie müssen zuerst ein Wörterbuch oder eine Tabelle aus der Position Ihres Beobachters erstellen, in der der Winkel zum Horizont der realen Welt dargestellt ist. Dies müsste in Intervallen von beispielsweise 1 Grad erfolgen, wobei 0 = wahrer Norden und für jeden Grad der Winkel des Horizonts angegeben wird. Dies kann von Ihrem r.horizon kommen.

Sie könnten dann verwenden, um pyephema) eine observerauf dem Breiten-, Längen- und Höhenbereich Ihres Beobachters zu erstellen und für jede Minute eines bestimmten Tages die scheinbaren Sonnenpositionen zu berechnen. Diese werden als vier Werte angegeben: ra, dec, alt und az.

Dann können Sie für jeden Zeitwert die Alt mit dem Wert aus der Höhentabelle bei diesem Azimut vergleichen. Wenn die Alt größer als der Wert in der Tabelle ist, können Sie die Sonne sehen.

Es ist sogar möglich, dass Sie einige Punkte finden, an denen an einem bestimmten Tag die Sonne in einem Tal aufgeht und dann hinter einem Berg die Stelle verlässt und dann über oder auf der anderen Seite des Berges wieder auftaucht.

Steve Barnes
quelle