我最近需要把 netCDF 中的太阳辐射栅格数据、台站测的太阳辐射数据集等,进行数据可视化的展示。但是由于太阳辐射数据关联性比较单一,因为辐射值就只与时间有关,是一维的。
所以,我觉得想要展示太阳辐射数据,就不可避免的要增加时间轴维度。所以我就想到了使用 Google Earth 进行数据的动态展示。
接下来,我来说一些该怎么把 netCDF 数据一步步的转换为 Google Earth 需要的 KML 文件数据。
1.什么是 KML
Keyhole 标记语言(KML)是一种 XML 符号,用于在二维地图和三维地球浏览器中表达地理注释和可视化。KML 是为与Google Earth 一起使用而开发的,Google Earth 最初被命名为 Keyhole Earth Viewer。
KML 于 2008 年成为开放地理空间联盟的国际标准。Google Earth 是第一个能够查看和以图形方式编辑 KML 文件的程序,但许多应用都可以显示 KML,包括 Google 地球、Google 地图、NASA WorldWind、ESRI ArcGIS Explorer、Adobe PhotoShop、AutoCAD 和 Yahoo! Pipes 等。
2.KML 文件结构
这是一个含有 2 个数据的简单的 KML 文件结构。我们发现 KML 文件又头部、中间数据、尾部,三部分组成。其中,中间数据是我们要关注的。
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Folder>
<name>1980年1月1日逐时太阳辐射</name>
<GroundOverlay>
<name>00点30分</name>
<TimeSpan>
<begin>1980-01-01T00:30:00+08:00</begin>
</TimeSpan>
<Icon><href>1980010100.png</href></Icon>
<LatLonBox>
<west>-180.0</west>
<north>90.0</north>
<east>180.0</east>
<south>-90.0</south>
</LatLonBox>
</GroundOverlay>
<GroundOverlay>
<name>01点30分</name>
<TimeSpan>
<begin>1980-01-01T01:30:00+08:00</begin>
</TimeSpan>
<Icon><href>1980010101.png</href></Icon>
<LatLonBox>
<west>-180.0</west>
<north>90.0</north>
<east>180.0</east>
<south>-90.0</south>
</LatLonBox>
</GroundOverlay>
</Folder>
</kml>
我们发现数据包含了几个重要的点:
- <name> 数据名称
- <TimeSpan> 时间或时刻
- <Icon> 要叠加覆盖的图片
- <LatLonBox> 经纬度的范围边界
这里面最不好解决的就是 <Icon>,如何从 netCDF 文件中提取出每一时刻的辐射图片。
3.Panoply
Panoply 是由美国国家航天局 NASA 开发出的一款 netCDF、HDF 等数据的可视化软件,它能够根据 netCDF 数据生成相应的 Plot 图片。
3.1 Panoply 的安装
Panoply 运行需要 Java 11(或更高版本)的环境。如果你不想安装整套的 JDK,你可以使用 .zip
版并按照如下步骤进行环境配置:
- 去 Oracle 下载 JDK 包,下载 zip 格式的包
- 解压缩后放到合适的目录
- 配置环境变量
由于 JDK 11 版本没有 jre 文件夹,需要自行编译生成,在 JDK 11 目录下运行如下命令:
环境配置如下,我是将 jdk-11.0.15 文件夹,放到了 D:\dev\ 目录下,你需要根据自己的路径进行调整:
JAVA_HOME=D:\dev\jdk-11.0.15
PATH=;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
注意:变量值之间用";"隔开。注意原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入。
CLASSPATH 环境变量对于 JDK 11 版本不要添加,但是 JDK 8 版本需要添加。
3.2 Panoply 导出 png 序列
安装完成后,使用 Panoply 打开 netCDF 格式数据,然后生成并导出相应的图片。
我采用了如下例示数据,这些数据和代码可在 Github 获取:
# 1979年1月至2018年12月的中国逐月太阳辐射数据集
lrad_CMFD_V0106_B-01_01mo_010deg_197901-201812.nc
# 1980年1月1日的全球太阳辐射数据集
MERRA2_100.tavg1_2d_rad_Nx.19800101.nc4
这两个文件均可在 Release 页面下载。
在导出前需要对 Plot 进行一些设置,去掉一些元素。
在 Plot 页面打开 Overlays、 Grid、 Layout、 Scale 这四个窗口,并根据红框标注的位置进行修改:
- Overlays:将线条宽度改为 0
- Grid:将线条宽度改为 0
- Layout:全部取消选中
- Scale:填充颜色改为黑色,线条宽度改为 0
然后选择 File -> Export Animation,按需导出需要的 png 图片序列:
3.3 图片按序号排序
在你保存图片序列的文件夹根目录下,运行 当前目录下按序号重命名.bat
的批处理文件,即可将所有的 png 图片从序号 1 开始,逐个重命名。
3.4 图片移除底色
由于 Panoply 导出的 png 图片无法设置为透明背景,所以还需要将白色底色进行移除。
你需要安装 Pillow 库:
pip install Pillow
在 去除黑白底色底.py
中,设置路径为你的图片序列所在的文件夹即可(注意 Windows 下建议采用双斜杠或者单反斜杠):
# 设定 png 图片目录
path = "D://yourpath//"
然后运行此 Python 脚本即可,所有图片将全部删去白色底色。
4.生成 KML 文件
图片处理好了,就可以生成 KML 文件了。
KML 文件就是 Google Earth 导入需要的格式文件,而 KMZ 就是将 KML 和图片打包在一起的 ZIP 文件。KMZ 文件可以用 WinRAR 等进行解压。
打开 生成KML文件.py
文件,并且设置一些信息,例如数据标题,开始的年月、结束的年月日期等:
# 信息
name = "1979年1月至2018年12月的中国逐日太阳辐射"
begin_year = 1979
begin_month = 1
end_year = 2018
end_month = 12
然后运行此 Python 脚本即可,运行成功后会在当前目录下生成 KML 文件。最后请将这个 KML 文件放到你的图片序列的文件夹根目录下。
如果你想要打包 KMZ 文件,请将上面截图中的全部文件进行 ZIP 打包,然后把后缀名更改为 KMZ 即可。
5.KML 的时间轴
当你编辑 KML 文件中的时间数据时,要注意参照官方文档 Keyhole时间和动画 中的说明。
# 例如逐月的时间
注意 1~9 必须要使用 01~09,否则将不能识别时间。
2018-01
2018-02
# 例如逐日的时间
2018-01-01
2018-12-28
# 例如 UTC 时间
1980-01-01T00:30:00+08:00
6.导入 Google Earth
将打包好的 KMZ 文件导入到 Google Earth Web 版,而 Google Earth Pro 同时支持 KML 和 KMZ 文件。
两个由例示数据导出的 KML 文件,也在 Release 页面提供下载。