# Cesium-nc风场可视化

# 前言

最近做项目需要可视化nc格式的风场、流场数据。于是在网上找现有的可视化项目:

  1. 3D-Wind-Field (opens new window) 自带demo.nc数据,下载后使用vscode的Liveserver打开
  2. cesium-3d-wind (opens new window)是基于第1个项目开发的
  3. 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 元数据约定,要求通过坐标变量的属性(如 unitsstandard_name)明确描述数据的物理意义。

# NetCDF常用工具介绍

1、命令行工具

  • ncdump:查看nc文件内容
  • ncks:提取子集、合并文件、修改变量
  • cdo:气候数据处理工具

2、图形化工具

  1. Panoply(NASA):免费、跨平台、可视化 nc 文件数据。

image-20251216164326298

image-20251216164401765

  1. QGIS + GDAL:可用于加载并显示 nc 格式的地理空间数据。

# Python操作NC文件(扩展)

Python 是处理 NetCDF 的首选语言之一,主要依赖库包括:

  • netCDF4: Python 接口,功能强大
  • xarray: 封装了 netCDF4,更易用
  • numpy: 支持数组运算
  • matplotlib/cartopy: 可视化
pip install netCDF4 xarray matplotlib cartopy

# NC数据下载

NCEP网站 (opens new window)

# 3D-Wind-Field项目源码学习

Last Updated: 12/25/2025, 8:59:06 AM