根据日期、时间和当地经纬度计算太阳天顶角和方位角的原理

先转过来,后面再看

在开展野外试验的时候,经常需要知道当时的太阳天顶角和方位角,比如测量地物反射率时,需要知道太阳天顶角,来选择恰当的灰板反射率曲线。进行地物BRDF测量时,更需要知道太阳天顶角。
太阳天顶角和方位角可以通过经纬仪实地测量得到,但是经纬仪携带不便。只要知道当地经纬度和时间,就可以根据下文的原理,计算得到当时当地的太阳天顶角和方位角。
1日地距离
  地球绕太阳公转的轨道是椭圆形的,太阳位于椭圆两焦点中的一个。发自太阳到达地球表面的辐射能量与日地间距离的平方成反比,因此,一个准确的日地距离值R就变得十分重要了。日地平均距离R0,又称天文单位,
1天文单位=1.496×108km
或者,更准确地讲等于149597890±500km。日地距离的最小值(或称近日点)为0.983天文单位,其日期大约在1月3日;而其最大值(或称远日点)为1.017天文单位,日期大约在7月4日。地球处于日地平均距离的日期为4月4日和10月5日。
  由于日地距离对于任何一年的任何一天都是精确已知的,所以这个距离可用一个数学表达式表述。为了避免日地距离用具体长度计量单位表示过于冗长,一般均以其与日地平均距离比值的平方表示,即ER=(r/r0)2,也有的表达式用的是其倒数,即r0/r,这并无实质区别,只是在使用时,需要注意,不可混淆。
  我们得到的数学表达式为
  ER=1.000423+0.032359sinθ+0.000086sin2θ-0.008349cosθ+0.000115cos2θ(1)
式中θ称日角,即
θ=2πt/365.2422
(2)
这里t又由两部分组成,即
t=N-N0
(3)
式中N为积日,所谓积日,就是日期在年内的顺序号,例如,1月1日其积日为1,平年12月31日的积日为365,闰年则为366,等等。
  N0=79.6764+0.2422×(年份-1985)
-INT〔(年份-1985)/4〕
(4)
2太阳赤纬角
  地球绕太阳公转的轨道平面称黄道面,而地球的自转轴称极轴。极轴与黄道面不是垂直相交,而是呈66.5°角,并且这个角度在公转中始终维持不变。正是由于这一原因形成了每日中午时刻太阳高度的不同,以及随之而来的四季的变迁。太阳高度的变化可以从图1中形象地看到。图中日地中心的连线与赤道面间的夹角每天(实际上是每一瞬间)均处在变化之中,这个角度称为太阳赤纬角。它在春分和秋分时刻等于零,而在夏至和冬至时刻有极值,分别为正负23.442°。


由于太阳赤纬角在周年运动中任何时刻的具体值都是严格已知的,所以它(ED)也可以用与式(1)相类似的表达式表述,即:
  ED=0.3723+23.2567sinθ+0.1149sin2θ
-0.1712sin3θ-0.758cosθ+0.3656cos2θ
+0.0201cos3θ(5)
式中θ的含义与式(1)中的相同。
3时差
  真正的太阳在黄道上的运动不是匀速的,而是时快时慢,因此,真太阳日的长短也就各不相同。但人们的实际生活需要一种均匀不变的时间单位,这就需要寻找一个假想的太阳,它以均匀的速度在运行。这个假想的太阳就称为平太阳,其周日的持续时间称平太阳日,由此而来的小时称为平太阳时。
  平太阳时S是基本均匀的时间计量系统,与人们的生活息息相关。由于平太阳是假想的,因而无法实际观测它,但它可以间接地从真太阳时S⊙求得,反之,也可以由平太阳时来求真太阳时。为此,需要一个差值来表达二者的关系,这个差值就是时差,以Et表示,即
S⊙=S+Et(6)
  由于真太阳的周年视运动是不均匀的,因此,时差也随时都在变化着,但与地点无关,一年当中有4次为零,并有4次达到极大。时差也可以以式(1)相似的表达式表示:
  Et=0.0028-1.9857sinθ+9.9059sin2θ
-7.0924cosθ-0.6882cos2θ
(7)
  上面,我们给出了3个计算式,从形式上讲,它们与一般书籍中给出的并无不同。我们之所以又重新研究它,是因为以往的公式存在以下的通病:①对平年和闰年不加区分,一方面,这对闰年就不好处理,另一方面,闰年的影响有累计效应,会逐步增长;②即使是从当年天文年历查到的数值,也是格林尼治经度处0点时刻的数值,而我们所需要的数值,会因所在地点的地理经度以及具体时刻与表值有异而不同。具体地讲,一般要进行如下3项订正:
  (1)年度订正:除非我们只用当年的天文年历值,此外均需使用此项订正,引入此项订正的原因就是一回归年的实际长度不是365日,而是365.2422日,但日历上只有整日,不可能有小数日。假定我们选用的是1981年的表值,1982年再用时,就要加上-0.2(-0.2422)日的订正了。这个订正到了1983年为-0.51(-0.4844)日,1984年为-0.7(-0.7266)日,但此年为闰年,多了1日,实际订正应为-0.7+1=0.3(0.2734)日,1985年为0.0(0.0312)日,等等,余类推。
  (2)经度订正:即使我们查阅的是当年的天文年历,也需此项订正。在我国的地理经度范围内,各地的订正值是
≤90°E
-0.2日
>90°E~<128°E
-0.3日
≥128°E
-0.4日
  (3)时刻订正:要求同前一项。即使在格林尼治当地,不同时刻也需加以订正。各时段的订正值是:
时段  336-600  600-824  824-1048  1048-1312
日  +0.2+0.3+0.4+0.5
时段  1312-1536  1536-1800  1800-2024
日  +0.6+0.7+0.8
  由于我国普遍采用的是北京时,它与格林尼治的地方时相差8小时,故具体到我国情况:
时段(北京时)200-424  424-648  648-912  912-1136
订正值(日)-0.2  -0.1  0  0.1
时段  1136-1400  1400-1624  1624-1848  1848-2112
订正值  0.2  0.3  0.4  0.5
  前面3个计算式,项数多计算麻烦,后面多项订正,更显繁琐。为了方便实际应用,特编制如下仅含20句的BASIC语言程序,供使用:
  10  input“经度,经分和年份”,JD,JF,NF
  20  A=NF/4:K=2*3.1415926#/365.2422
  30  N0=79.6764+0.2422*(NF-1985)
      -INT((NF-1985)/4)
  40  input“月,日,时,分(按北京时)”,Y,R,S,F
  50  B=A-INT(A)
  60  C=32.8
  70  ifY≤2thenC=30.6
  80  ifB=0andY>2thenC=31.8
  90  G=INT(30.6*Y-C+0.5)+R
  100  L=(JD+JF/60)/15
  110  H=S-8+F/60
  120  N=G+(H-L)/24
  130=(N-N0)/K
  140  式(1)
  150  式(5)
  160  式(7)
  170  print“Er=”;Er;“Ed=”;Ed,“Et=”;Et
  180  input“是否仍要计算y/n?”,W0
  190  ifW10-1.gif (92 bytes)=“Y”orW10-1.gif (92 bytes)=“y”then10else200
  200  end
  程序中50-90各句的目的在于计算当天的积日,100句是经度订正,110句是时刻订正,130句包含3年度订正的内容。
  在太阳能利用中,最常见的是要求计算太阳高度和太阳方位。
  太阳高度(h⊙)的计算公式为
sinh⊙=sinδsinφ+cosδcosφcosτ(8)
式中,δ就是太阳赤纬角,即式(5)中的Ed,φ为当地的地理纬度,τ为当时的太阳时角。φ值不难获得,且一旦确定,不会改变。δ值的计算可以从前述程序中得到。唯一需要说明的是太阳时角的计算。其计算式为


                                                                                                     (9)
  这里时S和分F的符号均加上了⊙下标,表示是真太阳时,为了从北京时求出真太阳时,需要两个步骤:首先,将北京时换成地方时Sd:


                                                                                                  (10)
式中,120°是北京时的标准经度,乘4是将角度转化成时间,即每度相当于4分钟,除60是将分钟化成小时。
  其次,进行时差订正,即
S⊙=Sd+Et/60                     (11)
这里应该指出的是,时角是以太阳正午时刻为0点的,顺时针方向(下午)为正,反之为负。
  太阳方位角的计算式为
  cosA=(sinh⊙sinφ-sinδ)/cosh⊙cosφ
(12)
由此可求出二个A值,第一个A值是午后的太阳方位,
  当cosA≤0时90°≤A≤180°
  当cosA≥0时0≤A≤90°
第2个A值为午前的太阳方位,取360°-A。
  实例:计算东经110°北回归线上1999年6月23日北京时12∶42的太阳高度角及当日的日落时的方位角。
  计算:将JD=110,JF=0,NF=1999,Y=6,R=23,S=12,F=42,各参数输入运行中的程序;屏幕上立即显示:Er=1.0330,Ed=23.438,Et=-1.84
  将北京时12∶42换算成东经110°的地方时,利用式(10),可得Sd=12∶02
  加当日时差Et≈-2,得此时当地的S⊙=12∶00,将其代入式(9)得τ=0°,北回归线处φ=23.442°
  最后根据式(8)求得h⊙=89.966°
  读者可能产生疑问,为何在北回归线上,夏至日的中午时刻的太阳高度不等于90°,大家不妨变换NF的输入值,看一看结果不仅都不等于90°,且各年之间还略有差异。之所以会如此,是因为夏至不仅有日期,还有时刻,很难遇到夏至时刻在正午是12时的。
  在计算日落时的方位角时,由于此时h⊙=0,所以式(12)的形式有所变化:
cosA=-sinδ/cosφ
(13)
将已知参数代入,得cosA=-0.3977
  依照判据90°≤A≤180°,故A=113.44°
 
文章引用自:http://blog.sina.com.cn/s/blog_4c4df0cf010007d3.html

http://www.ab126.com/Geography/1904.html ----- 计算网站

  • 6
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
本系统的研发具有重大的意义,在安全性方面,用户使用浏览器访问网站时,采用注册和密码等相关的保护措施,提高系统的可靠性,维护用户的个人信息和财产的安全。在方便性方面,促进了校园失物招领网站的信息化建设,极大的方便了相关的工作人员对校园失物招领网站信息进行管理。 本系统主要通过使用Java语言编码设计系统功能,MySQL数据库管理数据,AJAX技术设计简洁的、友好的网址页面,然后在IDEA开发平台中,编写相关的Java代码文件,接着通过连接语言完成与数据库的搭建工作,再通过平台提供的Tomcat插件完成信息的交互,最后在浏览器中打开系统网址便可使用本系统。本系统的使用角色可以被分为用户和管理员,用户具有注册、查看信息、留言信息等功能,管理员具有修改用户信息,发布寻物启事等功能。 管理员可以选择任一浏览器打开网址,输入信息无误后,以管理员的身份行使相关的管理权限。管理员可以通过选择失物招领管理,管理相关的失物招领信息记录,比如进行查看失物招领信息标题,修改失物招领信息来源等操作。管理员可以通过选择公告管理,管理相关的公告信息记录,比如进行查看公告详情,删除错误的公告信息,发布公告等操作。管理员可以通过选择公告类型管理,管理相关的公告类型信息,比如查看所有公告类型,删除无用公告类型,修改公告类型,添加公告类型等操作。寻物启事管理页面,此页面提供给管理员的功能有:新增寻物启事,修改寻物启事,删除寻物启事。物品类型管理页面,此页面提供给管理员的功能有:新增物品类型,修改物品类型,删除物品类型。
以下是用Python实现计算太阳顶角方位角,卫星顶角方位角的代码: ```python import math # 计算太阳顶角 def solarZenithAngle(latitude, longitude, year, month, day, hour, minute, second): # 计算儒略日 J0 = 367 * year - int((7 * (year + int((month + 9) / 12.0))) / 4.0) + int(275 * month / 9.0) + day + 1721013.5 UT = hour + minute / 60.0 + second / 3600.0 T = (J0 - 2451545.0 + UT / 24.0) / 36525.0 # 计算太阳平均位置 L0 = 280.46645 + 36000.76983 * T + 0.0003032 * T**2 M = 357.52910 + 35999.05030 * T - 0.0001559 * T**2 - 0.00000048 * T**3 C = (1.914600 - 0.004817 * T - 0.000014 * T**2) * math.sin(math.radians(M)) + (0.019993 - 0.000101 * T) * math.sin(math.radians(2 * M)) + 0.000290 * math.sin(math.radians(3 * M)) sunLongitude = L0 + C # 计算太阳赤纬角 epsilon = 23.439 - 0.0000004 * T alpha = math.atan2(math.cos(math.radians(epsilon)) * math.sin(math.radians(sunLongitude)), math.cos(math.radians(sunLongitude))) delta = math.asin(math.sin(math.radians(epsilon)) * math.sin(math.radians(sunLongitude))) # 计算太阳时角 hourAngle = math.radians(15.0 * (12.0 - longitude / 15.0 - UT)) # 计算太阳高度角 solarZenithAngle = math.acos(math.sin(math.radians(latitude)) * math.sin(delta) + math.cos(math.radians(latitude)) * math.cos(delta) * math.cos(hourAngle)) return math.degrees(solarZenithAngle) # 计算太阳方位角 def solarAzimuth(latitude, longitude, year, month, day, hour, minute, second): # 计算儒略日 J0 = 367 * year - int((7 * (year + int((month + 9) / 12.0))) / 4.0) + int(275 * month / 9.0) + day + 1721013.5 UT = hour + minute / 60.0 + second / 3600.0 T = (J0 - 2451545.0 + UT / 24.0) / 36525.0 # 计算太阳平均位置 L0 = 280.46645 + 36000.76983 * T + 0.0003032 * T**2 M = 357.52910 + 35999.05030 * T - 0.0001559 * T**2 - 0.00000048 * T**3 C = (1.914600 - 0.004817 * T - 0.000014 * T**2) * math.sin(math.radians(M)) + (0.019993 - 0.000101 * T) * math.sin(math.radians(2 * M)) + 0.000290 * math.sin(math.radians(3 * M)) sunLongitude = L0 + C # 计算太阳赤纬角 epsilon = 23.439 - 0.0000004 * T alpha = math.atan2(math.cos(math.radians(epsilon)) * math.sin(math.radians(sunLongitude)), math.cos(math.radians(sunLongitude))) delta = math.asin(math.sin(math.radians(epsilon)) * math.sin(math.radians(sunLongitude))) # 计算太阳时角 hourAngle = math.radians(15.0 * (12.0 - longitude / 15.0 - UT)) # 计算太阳高度角 solarZenithAngle = math.acos(math.sin(math.radians(latitude)) * math.sin(delta) + math.cos(math.radians(latitude)) * math.cos(delta) * math.cos(hourAngle)) # 计算太阳方位角 solarAzimuth = math.atan2(math.sin(hourAngle), math.cos(hourAngle) * math.sin(math.radians(latitude)) - math.tan(delta) * math.cos(math.radians(latitude))) return math.degrees(solarAzimuth) # 计算卫星顶角 def satelliteZenithAngle(satelliteElevation): return 90.0 - satelliteElevation # 计算卫星方位角 def satelliteAzimuth(satelliteElevation, satelliteAzimuth, latitude, longitude): az = math.atan2(math.sin(math.radians(satelliteAzimuth)), math.cos(math.radians(satelliteAzimuth)) * math.sin(math.radians(latitude)) - math.tan(math.radians(satelliteElevation)) * math.cos(math.radians(latitude))) if az < 0: az += 2.0 * math.pi return math.degrees(az) ``` 以上代码中,`latitude`表示观测点的纬度,`longitude`表示观测点的经度,`year`、`month`、`day`、`hour`、`minute`、`second`表示观测时间,`satelliteElevation`表示卫星仰角,`satelliteAzimuth`表示卫星方位角。函数返回值分别为太阳顶角太阳方位角、卫星顶角和卫星方位角

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值