反转茄属植物来遮蔽日光

问题描述 投票:0回答:2

我正在尝试找到一种方法,将 Nightshade 功能的反函数应用到地图上,以遮蔽日光而不是夜晚。 在此输入图片描述

已经尝试过底图和现在的Cartopy,但我没有找到输入日期和时间并获得日光阴影的方法。

python cartopy
2个回答
0
投票

正如 @WakemeUpNow 在评论中已经提到的,反转当前结果就可以了。如果

Nighshade
类将位置作为一种方法,那就太好了,这将使子类化变得非常容易,因为所需要做的就是将太阳的位置移动到地球的另一侧。

现在不是,但您仍然可以复制整个类并只修改该部分。其余的实现,使用 RotatedPole 投影,非常好,因为它允许边界的坐标始终相同。

lat, lon = _solar_position(date)

# move "solar" position to the opposite side        
lat = -lat
lon = ((lon + 360) % 360) - 180.

如果这对应用程序很重要,也可能会翻转(默认)折射关键字的符号。

enter image description here


0
投票

如果您不介意一些精度误差,您实际上可以通过绘制 6 个月和 12 小时后的茄属植物来轻松获得日照(因为日期和季节具有周期性,周期为 24 小时和 12 个月)。 这是总结这个想法的摘录:

import datetime
from dateutil.relativedelta import relativedelta

date1 = datetime.datetime.now()
date2 = date1 + relativedelta(months = 6, hours = 12.)

nightshade = Nightshade(date1, alpha=0.2, refraction=  refr)
dayshade   = Nightshade(date2, alpha=0.2, refraction= -refr)

在此输出

完整代码:

import datetime
from dateutil.relativedelta import relativedelta

import matplotlib.pyplot as plt


import cartopy.crs as ccrs
from cartopy.feature.nightshade import Nightshade

fig = plt.figure(figsize=(10, 5))

date1 = datetime.datetime.now()
date2 = date1 + relativedelta(months = 6, hours = 12.)

refr = -0.83

nightshade = Nightshade(date1, alpha=0.2, refraction=  refr)
dayshade   = Nightshade(date2, alpha=0.2, refraction= -refr)

strdate = date1.strftime("%d/%m/%Y, %H:%M:%S")
fig.suptitle(f'Shade for ' + strdate, fontsize=16)

ax1 = fig.add_subplot(2, 1, 1, projection=ccrs.PlateCarree())

ax1.set_title(f'Nightshade')
ax1.stock_img()
ax1.add_feature(nightshade)

ax2 = fig.add_subplot(2, 1, 2, projection=ccrs.PlateCarree())

ax2.set_title(f'Dayshade')
ax2.stock_img()
ax2.add_feature(dayshade)

plt.show()

折射的相反值说明了由于折射、日盘厚度、仰角等而导致的度数调整效果的逆转……

© www.soinside.com 2019 - 2024. All rights reserved.