实现Nightshade逆功能:在地图上遮蔽白昼而非黑夜的技术求助
实现白昼区域遮蔽(Nightshade逆效果)
Cartopy 实现方案
核心思路是通过天文计算得到指定时间的白昼区域多边形,再将其作为半透明遮蔽层叠加在地图上。我们可以用ephem库计算太阳位置,进而生成白昼边界:
- 安装依赖:
pip install cartopy ephem matplotlib
- 代码示例:
import cartopy.crs as ccrs import matplotlib.pyplot as plt import ephem from datetime import datetime def create_daylight_shade(utc_time): sun = ephem.Sun() sun.compute(utc_time) # 生成白昼边界的经纬度点 lons = [] lats = [] for lon_deg in range(360): lon = ephem.degrees(f"{lon_deg}") obs = ephem.Observer() obs.lon = lon obs.date = utc_time # 计算该经度对应的晨昏线纬度 _, lat = obs.rise_set(sun) lats.append(float(lat) * 180/ephem.pi) lons.append(lon_deg) # 闭合多边形 lons.append(lons[0]) lats.append(lats[0]) return lons, lats # 设置目标UTC时间 target_time = datetime(2024, 6, 21, 12, 0, 0) # 创建地图并添加遮蔽层 fig = plt.figure(figsize=(12, 6)) ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) ax.stock_img() ax.coastlines() lons, lats = create_daylight_shade(target_time) ax.fill(lons, lats, color='rgba(0, 0, 0, 0.7)', transform=ccrs.PlateCarree()) plt.title(f"Daylight Shading (UTC: {target_time})") plt.show()
Basemap 实现方案
Basemap虽已停止维护,但也可通过相同的天文计算逻辑实现白昼遮蔽:
- 安装依赖:
pip install basemap ephem matplotlib
- 代码示例:
from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import ephem from datetime import datetime def create_daylight_shade_basemap(utc_time): sun = ephem.Sun() sun.compute(utc_time) lons = [] lats = [] for lon_deg in range(360): lon = ephem.degrees(f"{lon_deg}") obs = ephem.Observer() obs.lon = lon obs.date = utc_time # 计算晨昏线纬度 _, lat = obs.rise_set(sun) lats.append(float(lat) * 180/ephem.pi) lons.append(lon_deg) lons.append(lons[0]) lats.append(lats[0]) return lons, lats # 设置目标UTC时间 target_time = datetime(2024, 6, 21, 12, 0, 0) # 创建Basemap实例并添加遮蔽层 fig = plt.figure(figsize=(12, 6)) m = Basemap(projection='cyl', llcrnrlat=-90, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180, resolution='c') m.drawcoastlines() m.bluemarble() lons, lats = create_daylight_shade_basemap(target_time) x, y = m(lons, lats) m.fill(x, y, color='rgba(0, 0, 0, 0.7)') plt.title(f"Daylight Shading (UTC: {target_time})") plt.show()
关键说明
- 必须使用UTC时间计算,避免时区偏差导致遮蔽区域错位
- 可调整
color参数的透明度(如rgba(0,0,0,0.5))来改变遮蔽效果的深浅 - 代码中通过
ephem库的天文计算推导晨昏线,进而确定白昼区域范围
内容的提问来源于stack exchange,提问作者snhousseal
相关产品推荐
相关产品推荐

