You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现Nightshade逆功能:在地图上遮蔽白昼而非黑夜的技术求助

实现白昼区域遮蔽(Nightshade逆效果)

Cartopy 实现方案

核心思路是通过天文计算得到指定时间的白昼区域多边形,再将其作为半透明遮蔽层叠加在地图上。我们可以用ephem库计算太阳位置,进而生成白昼边界:

  1. 安装依赖:
pip install cartopy ephem matplotlib
  1. 代码示例:
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虽已停止维护,但也可通过相同的天文计算逻辑实现白昼遮蔽:

  1. 安装依赖:
pip install basemap ephem matplotlib
  1. 代码示例:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 14:46:01