如何在Cartopy地图上绘制大规模简单经纬度-数值数据集?
基于Cartopy的大规模经纬度数据可视化方案
核心思路
针对6000+组经纬度-数值对,优先采用网格化插值+高斯平滑+Cartopy填色/散点叠加的方案,比shapely更适配这类散点数据的批量可视化,步骤清晰且效率更高。
具体实现步骤
1. 数据预处理:散点转规则网格
用scipy.interpolate.griddata将散点数据插值到规则经纬度网格,为后续平滑操作铺垫:
import numpy as np import cartopy.crs as ccrs import cartopy.feature as cfeature import matplotlib.pyplot as plt from scipy.interpolate import griddata from scipy.ndimage import gaussian_filter # 替换为你的真实numpy数组 lat = np.array([1, 2, 3, 4, 5]) lon = np.array([1, 2, 3, 4, 5]) data = np.array([0, 3, 1, 0, 0]) # 生成规则网格:根据数据经纬度范围设置密度,0.1度间隔可按需调整 lon_min, lon_max = lon.min(), lon.max() lat_min, lat_max = lat.min(), lat.max() lon_grid, lat_grid = np.meshgrid(np.linspace(lon_min, lon_max, 100), np.linspace(lat_min, lat_max, 100)) # 插值到网格:立方插值平滑度最优,也可选线性/最近邻 grid_data = griddata((lon, lat), data, (lon_grid, lat_grid), method='cubic')
2. 高斯滤波平滑数据
用scipy.ndimage.gaussian_filter处理网格化后的数据,sigma参数控制平滑强度:
# sigma值越大平滑效果越强,建议根据数据分布调整在1-5之间 smoothed_data = gaussian_filter(grid_data, sigma=2)
3. Cartopy地图绘制
选择合适投影(如PlateCarree),绘制平滑填色图层,也可叠加原始散点作为参考:
# 初始化画布与投影 fig, ax = plt.subplots(figsize=(10, 8), subplot_kw={'projection': ccrs.PlateCarree()}) # 添加基础地图元素 ax.coastlines(linewidth=0.8) ax.add_feature(cfeature.LAND, facecolor='#f0f0f0', edgecolor='black') # 绘制平滑填色图,levels匹配data的0-100取值范围 contour_fill = ax.contourf(lon_grid, lat_grid, smoothed_data, levels=np.linspace(0, 100, 20), cmap='viridis', transform=ccrs.PlateCarree()) # 可选:叠加原始经纬度点,用数值着色 ax.scatter(lon, lat, c=data, cmap='viridis', s=50, edgecolor='white', transform=ccrs.PlateCarree()) # 添加颜色条与标题 plt.colorbar(contour_fill, ax=ax, label='Data Value') plt.title('Smoothed Geographic Data') plt.show()
关键注意事项
- 若数据存在缺失值,可先用
np.nan_to_num处理,或选择method='nearest'插值减少空值 - 网格分辨率和
sigma参数需结合数据分布调整,避免过度平滑丢失关键细节 - 超大规模数据可先做降采样,再插值网格化,提升运行效率
内容的提问来源于stack exchange,提问作者Kyle Gillett
相关产品推荐
相关产品推荐

