python代码计算太阳高度角和太阳方位角

本文详细介绍了如何使用Python的ephem和pysolar库以及手动计算方法来求解给定经纬度在特定日期和时间的太阳高度角和方位角。作者通过比较不同方法的结果,强调了手算方法5的准确性,并提供了数学公式和示例代码。
摘要由CSDN通过智能技术生成

计算(109.2, 35.1) 2021/12/22 09:00:00太阳高度角和太阳方位角

本文使用了5种方式对其进行求解,最终应用了方法5的运算结果,读者可直接跳至方法5查看结果和python代码

目录

计算(109.2, 35.1) 2021/12/22 09:00:00太阳高度角和太阳方位角

方法1:使用python库ephem

方法2:使用python库pysolar

方法3:使用网页在线计算器1

方法4:使用网页在线计算器2

方法5:根据公式手算

数学公式

太阳时角h

太阳赤纬δ

太阳高度角

太阳方位角


  • 方法1:使用python库ephem

结果:Sun altitude: 13:33:46.2, Sun azimuth: 267:57:01.4

import ephem  # 获取特定地点和日期时间的太阳高度角和方位角

def calculate_sun_position(latitude, longitude, date):
    obs = ephem.Observer()
    obs.lat, obs.lon = latitude, longitude
    obs.date = ephem.Date(date)
    sun = ephem.Sun()
    sun.compute(obs)
    return sun.alt,sun.az  # 返回太阳高度角和方位角

latitude = 35.1
longitude = 109.2
date = '2021/12/22 9:00:00'  # 某一天的正午时间
sun_altitude, sun_azimuth = calculate_sun_position(latitude, longitude, date)
print(f"Sun altitude: {sun_altitude}, Sun azimuth: {sun_azimuth}")
  • 方法2:使用python库pysolar

结果:Sun altitude: 10.52866037565445, Sun azimuth: 128.60185059293036

import datetime
import pysolar.solar
from pytz import timezone
from timezonefinder import TimezoneFinder

# 定义观测点经纬度
latitude = 35.1  # 纬度#38.053839
longitude = 109.2  # 经度#106.697611
elevation = 1000 # 高度

# 创建一个TimezoneFinder实例
tf = TimezoneFinder(in_memory=True)
# 使用TimezoneFinder查找对应的时区名称
timezone_name = tf.timezone_at(lat=latitude, lng=longitude)
# 将时区名称转换为pytz对象
timezone_obj = timezone(timezone_name)
print(f"经纬度({latitude}, {longitude})所处的时区是:{timezone_name}")
# 获取当前日期和时间
date_time = datetime.datetime(2021,12,22,9,0,0,0,timezone_obj)

# 计算当前时刻的太阳高度角(单位:度)
sun_altitude = pysolar.solar.get_altitude(latitude, longitude, date_time, elevation)
sun_azimuth = pysolar.solar.get_azimuth(latitude, longitude, date_time, elevation)
print(f"Sun altitude: {sun_altitude}, Sun azimuth: {sun_azimuth}")
  • 方法3:使用网页在线计算器1

结果:Sun altitude: 20.15858896258514, Sun azimuth: 140.893388236611

  • 方法4:使用网页在线计算器2

结果:Sun altitude: 11.39, Sun azimuth:  50.40

  • 方法5:根据公式手算

结果:Sun altitude: 11.13924683296049, Sun azimuth: 50.66025597336174

根据网上找到的例子,使用太阳等高线原理计算(30N, 120E),夏至日10:00的太阳高度角是62.5°。使用解天文三角形的公式代入进行验证,太阳高度角≈62.5°,该法亦接近方法4所求结果,暂定此法为准确结果,转为python代码如下:

# -*- coding:utf-8 -*-
import math
from datetime import datetime

ASIN = math.asin
SIN = math.sin
COS = math.cos
RADIANS = math.radians
DEGREES = math.degrees

#时差: 
def TimeDifference(lon):
    t = (lon -120) / 15
    return t

#真太阳时(T:北京时间)
def TrueSolarTime(T, t):
    ST = T + t
    return ST

#时角
def HourAngle(ST):
    h = 15 * (ST -12)
    return h

#太阳赤纬(N为积日,一年中的第几天)
def SolarDeclination(N):
    DEC = -23.443 * COS(RADIANS(round(360/365, 8) * (N + 10))) #三角函数需要用弧度制
    return DEC
    
#积日
def DayOfYear(time):
    day_of_year = time.timetuple().tm_yday  # 获取当年的第几天
    return day_of_year

#计算时角
def CalculateHourAngle(lon, T):
    t = TimeDifference(lon)
    ST = TrueSolarTime(T, t)
    H = HourAngle(ST)
    return H
    
#计算太阳赤纬
def CalculateSolarDeclination(time):
    N = DayOfYear(time)
    DEC = SolarDeclination(N)
    return DEC
    
def CalculateSunPosition(latitude, longitude, time):
    T = time.hour + round(1/60, 8) * time.minute + round(1/3600, 8) * time.second
    print("Beijing Time: ", T)
    H = CalculateHourAngle(longitude, T)
    print("Hour Angle: ", H)
    DEC = CalculateSolarDeclination(time)
    print("DEC: ", DEC)
    sun_altitude = DEGREES(ASIN(SIN(RADIANS(latitude))*SIN(RADIANS(DEC))+COS(RADIANS(DEC))*COS(RADIANS(latitude))*COS(RADIANS(H))))
    sun_azimuth = DEGREES(ASIN(round((-COS(RADIANS(DEC))*SIN(RADIANS(H)) / COS(RADIANS(sun_altitude))), 8)))
    print("altitude_angle_deg:", sun_altitude)
    print("azimuth_angle_deg:", sun_azimuth)
    return sun_altitude, sun_azimuth


time_str = '2021-12-22 9:00:00'
time = datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S')
sun_altitude, sun_azimuth = CalculateSunPosition(35.1, 109.2, time)

运算结果:

Beijing Time:  9.0
Hour Angle:  -55.80000000000001
DEC:  -23.4395266662262
altitude_angle_deg: 11.13924683296049
azimuth_angle_deg: 50.66025597336174

方位角是以目标物的正北方向(与同一地理分区/分带内所在中央子午线的北方向相同)为起算方向,所以方位角应为55.66的补角,即129.34。由此可见,方法2的运算结果很接近,也可考虑使用。

数学公式

太阳时角h

时差:\Delta T = (lon - 120^{\circ}) / 15^{\circ}        (lon:经度)

真太阳时:ST = t + \Delta T        (t:北京时间)

太阳时角:h = 15 \times (ST - 12)

太阳赤纬δ

\delta = -23.44^{\circ}\cdot cos(\frac{360}{365}\cdot (N + 10))        (N为积日,一年中的第几天,可根据北京时间进行计算)

太阳高度角

\theta_{s} = arcsin(coshcos\delta cos(lat) - sin\delta sin(lat))

太阳方位角

\phi _{s} = arcsin(\frac{-sinhcos\delta}{cos\theta _{s}} )        (x=sin(y)有两个以上的解,但只有一个是正确的,比如正午太阳方位角应为180°,正午以前小于180°,正午以后大于180°)

  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python计算太阳高度代码示例: ```python import datetime import math # 输入UTC时间和经纬度 utc_time = datetime.datetime.utcnow() longitude = 120.1536 # 南京市的经度 latitude = 31.9818 # 南京市的纬度 # 计算儒略日 J2000 = datetime.datetime(2000, 1, 1, 12, 0, 0) delta_JD = utc_time - J2000 JD = 2451545.0 + delta_JD.days + delta_JD.seconds / 86400.0 # 计算世界时 T = (JD - 2451545.0) / 36525.0 UT = utc_time.hour + utc_time.minute / 60.0 + utc_time.second / 3600.0 TU = (UT - longitude / 15.0) / 24.0 # 计算格林威治平恒星时 GMST = 6.697374558 + 0.06570982441908 * JD + 1.00273790935 * UT + 0.000026 * T * T GMST = GMST % 24 # 计算黄赤交 epsilon = 23.439 - 0.0000004 * JD # 计算太阳真黄经 M = (357.5291 + 0.98560028 * (JD - 2451545)) % 360 C = 1.9148 * math.sin(math.radians(M)) + 0.02 * math.sin(math.radians(2*M)) + 0.0003 * math.sin(math.radians(3*M)) lambda_sun = (M + 102.9372 + C + 180) % 360 # 计算太阳坐标 alpha_sun = math.atan2(math.cos(math.radians(epsilon))*math.sin(math.radians(lambda_sun)), math.cos(math.radians(lambda_sun))) delta_sun = math.asin(math.sin(math.radians(epsilon))*math.sin(math.radians(lambda_sun))) # 计算太阳高度方位角 h = math.asin(math.sin(math.radians(latitude))*math.sin(delta_sun) + math.cos(math.radians(latitude))*math.cos(delta_sun)*math.cos(math.radians(GMST*15))) A = math.atan2(-math.cos(delta_sun)*math.sin(math.radians(GMST*15)), math.sin(delta_sun)*math.cos(math.radians(latitude)) - math.cos(delta_sun)*math.sin(math.radians(latitude))*math.cos(math.radians(GMST*15))) # 将太阳高度转换为度制 h_deg = math.degrees(h) # 输出结果 print("太阳高度:", h_deg) ``` 这个代码计算太阳高度时,会先计算出当前的世界时和格林威治平恒星时,然后计算黄赤交太阳真黄经,最后根据经纬度和时间计算太阳坐标和太阳高度方位角。这个代码可能存在一些舍入误差,但是可以用于一般的应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值