# Cesium-nc风场可视化
# 前言
最近做项目需要可视化nc格式的风场、流场数据。于是在网上找现有的可视化项目:
- 3D-Wind-Field (opens new window) 自带demo.nc数据,下载后使用vscode的Liveserver打开
- cesium-3d-wind (opens new window)是基于第1个项目开发的
- Cesium-particle (opens new window)基于cesium的矢量场可视化gpu加速粒子系统
# NetCDF格式
# 参考文献
NetCDF 文件:从入门到精通 (opens new window) 这篇文章讲的比较详细
NetCDF(nc)读写与格式转换介绍 (opens new window)
# 什么是NetCDF
NetCDF(Network Common Data Form)是一种自描述、平台无关、二进制格式的数据文件,广泛应用于气象、海洋、地球科学等领域。它能够存储多维科学数据(如时间、纬度、经度、高度等),并且自带元数据信息,便于数据交换和共享。
特点:
- 自描述性(Self-describing):包含变量名、维度、单位、注释等元数据。
- 支持多维数组(Multidimensional arrays):适合表示时空数据。
- 跨平台兼容性强:支持多种操作系统和编程语言。
- 高效读写:适用于大规模科学数据处理。
# NetCDF文件结构
dimensions: // 维度:定义数据的骨架,类似于tensor的形状
lev = 1;
time = 1;
lat = 361;
lon = 720;
variables:
int LatLon_Projection(lev=1);
:grid_mapping_name = "latitude_longitude";
:earth_radius = 6371229.0; // double
float U(lev=1, time=1, lat=361, lon=720); // 变量:存储具体的多维数据(如温度、风速),每个变量关联到一个或多个维度
:long_name = "u-component of wind @ Planetary Boundary Layer";
:units = "m/s"; // 局部属性,描述变量
:abbreviation = "UGRD";
:missing_value = NaNf; // float
:grid_mapping = "LatLon_Projection";
:coordinates = "reftime time lat lon ";
:Grib_Variable_Id = "VAR_0-2-2_L220";
:Grib2_Parameter = 0, 2, 2; // int
:Grib2_Parameter_Discipline = "Meteorological products";
:Grib2_Parameter_Category = "Momentum";
:Grib2_Parameter_Name = "u-component of wind";
:Grib2_Level_Type = 220; // int
:Grib2_Level_Desc = "Planetary Boundary Layer";
:Grib2_Generating_Process_Type = "Forecast";
:max = 42.99183f; // float
:min = -54.00817f; // float
float V(lev=1, time=1, lat=361, lon=720);
:long_name = "v-component of wind @ Planetary Boundary Layer";
:units = "m/s";
:abbreviation = "VGRD";
:missing_value = NaNf; // float
:grid_mapping = "LatLon_Projection";
:coordinates = "reftime time lat lon ";
:Grib_Variable_Id = "VAR_0-2-3_L220";
:Grib2_Parameter = 0, 2, 3; // int
:Grib2_Parameter_Discipline = "Meteorological products";
:Grib2_Parameter_Category = "Momentum";
:Grib2_Parameter_Name = "v-component of wind";
:Grib2_Level_Type = 220; // int
:Grib2_Level_Desc = "Planetary Boundary Layer";
:Grib2_Generating_Process_Type = "Forecast";
:max = 43.885204f; // float
:min = -44.614796f; // float
float lat(lat=361);
:units = "degrees_north";
double lev(lev=1);
:long_name = "Level";
float lon(lon=720);
:units = "degrees_east";
double reftime;
:units = "Hour since 2018-09-16T00:00:00Z";
:standard_name = "forecast_reference_time";
:long_name = "GRIB reference time";
:calendar = "proleptic_gregorian";
double time(time=1);
:units = "Hour since 2018-09-16T00:00:00Z";
:standard_name = "time";
:long_name = "GRIB forecast or observation time";
:calendar = "proleptic_gregorian";
// 全局属性,描述整个文件
:Originating_or_generating_Center = "US National Weather Service, National Centres for Environmental Prediction (NCEP)";
:Originating_or_generating_Subcenter = "0";
:GRIB_table_version = "2,1";
:Type_of_generating_process = "Forecast";
:Analysis_or_forecast_generating_process_identifier_defined_by_originating_centre = "Analysis from GFS (Global Forecast System)";
:file_format = "GRIB-2";
:Conventions = "CF-1.6";
:history = "Wed Apr 17 10:29:08 2019:
NetCDF 社区广泛采用 CF 元数据约定,要求通过坐标变量的属性(如 units、standard_name)明确描述数据的物理意义。
# NetCDF常用工具介绍
1、命令行工具
- ncdump:查看nc文件内容
- ncks:提取子集、合并文件、修改变量
- cdo:气候数据处理工具
2、图形化工具
- Panoply(NASA):免费、跨平台、可视化 nc 文件数据。


- QGIS + GDAL:可用于加载并显示 nc 格式的地理空间数据。
# Python操作NC文件(扩展)
Python 是处理 NetCDF 的首选语言之一,主要依赖库包括:
netCDF4: Python 接口,功能强大xarray: 封装了 netCDF4,更易用numpy: 支持数组运算matplotlib/cartopy: 可视化
pip install netCDF4 xarray matplotlib cartopy
# NC数据下载
# 3D-Wind-Field项目源码学习
← CAD在线浏览 CesiumLab手册 →