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

使用Cartopy插值城市区域温度数据无结果问题求助

排查Cartopy温度插值结果不显示的问题

我之前也踩过不少类似的坑——只显示城市Shapefile图层但看不到温度插值结果,大概率是投影不匹配、插值范围不对、绘图顺序搞反或者插值过程出了问题,咱们一步步来排查修复:

1. 先确认插值数据与Cartopy投影是否匹配

Cartopy对投影的要求特别严格,如果你的观测点是经纬度(地理坐标系),但插值时没转换到地图所用的投影坐标系,插值结果很可能“跑”到可视范围外,自然看不到。

  • 先检查你的观测点坐标格式,要是(lon, lat),得先转成地图目标投影的坐标:
import cartopy.crs as ccrs
import numpy as np

# 假设你的地图用墨卡托投影(根据实际情况调整)
target_proj = ccrs.Mercator()
# 观测点的地理坐标系
geo_proj = ccrs.PlateCarree()

# 把经纬度转换为目标投影坐标
obs_lons = np.array([...])  # 你的观测点经度
obs_lats = np.array([...])  # 你的观测点纬度
x, y, _ = target_proj.transform_points(geo_proj, obs_lons, obs_lats).T
  • 插值时一定要基于转换后的x, y生成网格,别用原始经纬度。

2. 检查插值网格范围是否覆盖城市区域

如果插值生成的网格和城市Shapefile的范围完全不重叠,肯定看不到结果:

  • 先获取Shapefile的边界,确保插值网格包含这个范围:
import geopandas as gpd

# 读取城市Shapefile
city_gdf = gpd.read_file('LimiteAMG.shp')
# 获取Shapefile的边界极值
min_x, min_y, max_x, max_y = city_gdf.total_bounds
  • 生成插值网格时,给边界留一点缓冲,比如:
grid_x, grid_y = np.meshgrid(
    np.linspace(min_x - 0.1, max_x + 0.1, 100),
    np.linspace(min_y - 0.1, max_y + 0.1, 100)
)

3. 确认绘图顺序是否正确

要是先画插值结果再画城市Shapefile,城市图层会把插值结果完全盖住,这是很容易犯的小错误:

  • 正确顺序是先画插值结果,再画城市边界:
import matplotlib.pyplot as plt

fig, ax = plt.subplots(subplot_kw={'projection': target_proj})

# 第一步:绘制插值结果(以pcolormesh为例)
ax.pcolormesh(grid_x, grid_y, interpolated_temp, 
              transform=target_proj, cmap='coolwarm')

# 第二步:绘制城市Shapefile图层(facecolor设为none才不会盖住插值结果)
ax.add_geometries(city_gdf.geometry, crs=geo_proj, 
                  facecolor='none', edgecolor='black', linewidth=1)

plt.colorbar(ax.collections[0], ax=ax, label='Temperature (°C)')
plt.show()

注意:如果Shapefile本身是地理坐标系,add_geometries的crs要设为ccrs.PlateCarree(),和Shapefile的坐标系一致。

4. 检查插值方法的正确性

只有5个观测点的话,有些插值方法可能会生成大量NaN,导致看不到有效结果:

  • 先打印插值结果的统计值,确认有有效数据:
print(f"插值温度范围:{interpolated_temp.min()} ~ {interpolated_temp.max()}")
print(f"NaN数量:{np.isnan(interpolated_temp).sum()}")
  • 推荐先用nearest或linear方法测试,cubic方法对少数据点不太友好:
from scipy.interpolate import griddata

obs_temps = np.array([...])  # 你的观测点温度数据
# 执行插值
interpolated_temp = griddata((x, y), obs_temps, (grid_x, grid_y), method='linear')

5. 检查颜色映射与数据范围是否匹配

如果插值结果的数值范围太小,或者颜色条范围设置不当,可能会导致颜色变化不明显,看起来像没显示:

  • 手动绑定颜色条范围到观测温度的极值:
ax.pcolormesh(grid_x, grid_y, interpolated_temp, 
              transform=target_proj, cmap='coolwarm',
              vmin=np.min(obs_temps), vmax=np.max(obs_temps))

内容的提问来源于stack exchange,提问作者user1345283

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:07:28