我正在尝试找到一种方法,将 Nightshade 功能的反函数应用到地图上,以遮蔽日光而不是夜晚。 在此输入图片描述
已经尝试过底图和现在的Cartopy,但我没有找到输入日期和时间并获得日光阴影的方法。
正如 @WakemeUpNow 在评论中已经提到的,反转当前结果就可以了。如果
Nighshade
类将位置作为一种方法,那就太好了,这将使子类化变得非常容易,因为所需要做的就是将太阳的位置移动到地球的另一侧。
现在不是,但您仍然可以复制整个类并只修改该部分。其余的实现,使用 RotatedPole 投影,非常好,因为它允许边界的坐标始终相同。
lat, lon = _solar_position(date)
# move "solar" position to the opposite side
lat = -lat
lon = ((lon + 360) % 360) - 180.
如果这对应用程序很重要,也可能会翻转(默认)折射关键字的符号。
如果您不介意一些精度误差,您实际上可以通过绘制 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()
折射的相反值说明了由于折射、日盘厚度、仰角等而导致的度数调整效果的逆转……