考虑地形时计算日出/日落时间


11

我想计算给定位置全年的日出和日落时间,同时考虑到地形。也许日出/日落不是正确的用语,但我想要的是太阳升起到地平线以上的时间,以及太阳落到地平线以下的时间,并考虑到任何山丘。

我正在使用QGIS或GRASS。我可以使用r.horizo​​n从特定点生成地平线角度,但是我不确定如何从那里到达日出/日落时间。


听起来像是反向视域...观察者(太阳)可以在什么角度看到该位置,然后将其用作标准日出/日落时间的偏移量。这是一个很好的问题。
Michael Stimson

Answers:


2

我在我的GNU / Debian Linux系统中安装了ephem python软件包,并且可以在QGIS的Python控制台上使用它。我为美国犹他湖附近的一个点创建了一个观测器,并计算出“ 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. )

在QGIS的Python控制台上运行后,结果是:

>>>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.horizo​​n和PyEphem的某种组合会起作用?关于如何将两者一起使用有什么想法?GRASS确实有一个r.sun模块,我可以用它来计算给定日期在给定位置的一天中直射阳光的小时数,并考虑地形。这似乎几乎可以满足我的要求,但似乎无法输出阳光直射开始/停止的实际时间。
Stu 2016年

有前途和有用的,但它没有考虑到地形。从山谷内部看到的地平线与真实地平线(未遮挡)不同。
alphabetasoup

@RichardLaw您可以使用“水平”方法设置地形。
xunilk

1
似乎“地平线”方法只是为整个地平线设置单个地平线角度?如果考虑到地形,则地平线并非完美平坦。因此,对于所计算的每个不同方位角,与地平线的角度将有所不同。r.horizo​​n模块将为每个不同的方位角输出与水平线的角度。它不是单个数字(例如5度),而是所有方位角的一系列高程的数据集(180度方位角为5度高程,185度方位角为6度高程,190度为7度高程)度方位角等)
Stu 2016年

1

您可以使用PyEphem之类的库来查找给定位置的海拔高度,日期,时间(以及行星;)以及太阳的方位角和高度角。


您可以建议实施吗?最初的问题没有隐式提及python,但如果示例足够简单,OP可能可以使用它。
Michael Stimson

0

您可以使用一点点python来执行此操作,但首先需要从观察者的位置生成与现实世界水平线成角度的字典或表格。这将需要以1度为间隔,其中0 =真正的北,并且每个度都给出水平角度。这可以来自您的水平仪。

然后,您可以使用pyephema)observer在观察者的纬度,经度和海拔高度上创建一个,并在给定一天的每一分钟中使用它来计算太阳的视在位置,这些位置将被指定为四个值,ra,dec,alt和az。

然后,对于每个时间值,您都可以将alt与该方位角的高程表中的值进行比较,当alt大于表中的值时,您将能够看到太阳。

甚至有可能找到某些点,在给定的一天中,太阳在山谷中升起,然后离开山后的场所,然后重新出现在山的另一侧。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.