Python读取ETOPO1高程NetCDF文件缺失x_range变量解决方法
适配方案
问题本质
你手里的ETOPO1 grd文件是GMT通用标准netCDF格式,示例代码适配的是旧版GMT导出的特殊版本——旧版本会把网格元数据拆成x_range/y_range/spacing/dimension这类独立变量,通用版本直接把完整坐标、高程数据存在x/y/z三个变量里,不需要手动重构网格。
修改后可直接运行的代码
import numpy as np import matplotlib.pyplot as plt from netCDF4 import Dataset # 替换为本地ETOPO1 grd文件的实际路径 data = Dataset("Path/ETOPO1_Bed_g_gmt4.grd",'r') # 直接读取核心变量,不需要手动生成坐标、重构数组 lon = data.variables['x'][:] lat = data.variables['y'][:] topo = data.variables['z'][:] # 可视化:绑定经纬度范围,修正坐标方向,仅显示海平面以下地形 plt.imshow( topo, vmax=0, extent=[lon.min(), lon.max(), lat.min(), lat.max()], origin='lower' ) plt.colorbar(label='高程/深度 (m)') plt.show()
关键适配说明
- 通用格式下
x是按固定间隔排布的完整经度一维数组,y是对应纬度一维数组,z已经是维度为(纬度点数, 经度点数)的二维高程数组,不需要手动调用linspace生成坐标、不需要手动对z做reshape操作。 - 如果确实需要用到原示例里的元数据参数,直接从已读取的三个变量计算即可,结果完全等价:
lon_range = [lon.min(), lon.max()] lat_range = [lat.min(), lat.max()] topo_range = [topo.min(), topo.max()] spacing = [np.diff(lon).mean(), np.diff(lat).mean()] lon_num, lat_num = lon.shape[0], lat.shape[0] - 绘图时必须设置
origin='lower'和extent参数:前者修正纬度方向,避免地形上下颠倒;后者绑定实际经纬度范围,保证坐标刻度和地理位置一一对应。
内容的提问来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

