使用 PVLIB 的许多坐标的太阳天顶角

Solar Zenith Angle for many coordinates using PVLIB

我需要计算大约 106.000.000 个不同坐标的太阳天顶角。该坐标是在图像被相机拍摄到飞机后投射到地球表面的图像的像素参考。

我正在使用 pvlib.solarposition.get_position() 来计算太阳天顶角。返回的值计算正确(我将一些结果与 NOOA 网站进行了比较)但是,我需要如何计算许多坐标的太阳天顶角,python 花了很多天(大约 5 天)来完成函数的执行。

我是编程初学者,不知道有什么方法可以加速太阳天顶角的计算。

下面是计算太阳天顶角的代码部分:

sol_apar_zen = [] 
    for i in range(size3):
        solar_position = np.array(pvl.solarposition.get_solarposition(Data_time_index, lat_long[i][0], lat_long[i][1]))
        sol_apar_zen.append(solar_position[0][0])
 print(len(sol_apar_zen))

如果你想加快这个计算,你可以使用 numba 核心(如果安装的话)

location.get_solarposition(
        datetimes,
        method='nrel_numba'
    )

否则你必须基于矢量化 numpy 数组实现你自己的计算。我知道这是可能的,但我不允许分享。如果您搜索 spencer 1971 solar position

,您可以找到公式

由于您的坐标表示网格,另一种选择是计算坐标子集的天顶角,然后进行二维插值以获得余数。两个方向上的 100 分之一将使您的计算时间减少 10000 倍。

从技术上讲,如果您需要为大型列表(数组)快速计算太阳天顶角,有比 PVLIB 算法更有效的算法。例如,Roberto Grena 在 2012 年描述的那个 (https://doi.org/10.1016/j.solener.2012.01.024)。

我在这里找到了一个合适的实现:https://github.com/david-salac/Fast-SZA-and-SAA-computation(你介意需要一些调整,但它使用起来很简单,而且它也适用于 Python 以外的其他语言,例如 C/C ++ & 开始).

使用示例:

from sza_saa_grena import solar_zenith_and_azimuth_angle
# ...
# A random time series:
time_array = pd.date_range("2020/1/1", periods=87_600, freq="10T", tz="UTC")
sza, saa = solar_zenith_and_azimuth_angle(longitude=-0.12435,  # London longitude
                                          latitude=51.48728,   # London latitude
                                          time_utc=time_array)

该单元测试(在项目的文件夹中)显示在正常纬度范围内,错误是最小的。