使用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
相关产品推荐
相关产品推荐

