© 2023-2024 Jiheng HU, 原创内容,禁止转载。

要获取GOES系列静止卫星的L2+级云参数产品的FullDisk圆盘数据,需要清楚相关卫星的工作方式。

NOAA 第五代GOES静止卫星星座

GOES-R系列静止卫星是目前NOAA在运行的第三代静止卫星任务,其编号分别为GOES-R/S/T三颗卫星。其后继的第五代静止卫星为U系列,预计于2024年以后发射。关于具体的GOES任务表,详见WIKIPEDIA.GOES Schedule
GOES静止卫星星座一般由两颗位于east和west点位上的业务卫星构成,赤经分别为75.2° W 和 137.2°W。
目前GOES-R系列已经发射了三颗业务卫星,分别是GOES16、GOES17和GOES18,其发射前的名称分别为GOES-R/GOES-S/GOES-T。

  • GOES-16卫星是R系列的第一颗卫星,其与2017年12月18日机动到EAST点,取代原先的GOES-13星并开始业务化运行。自此,GOES-16一直是GOES-R系列唯一一颗EAST卫星。
  • GOES-17卫星于2019年2月成为GOES-WEST,但是由于其冷却系统的问题,2021年6月,NOAA宣布会尽快使用GOES18号卫星替代west点的业务任务。
  • GOES-18卫星于2022年3月1日升空,2023年1月4日称为GOES-West,原先的GOES17转移到16和18中间的位置,作为备份使用。

GOES16/ABI

本文要下载的数据是GOES16卫星的部分云产品参数。
GOES16 搭载的先进基线成像仪(ABI)提供了中分辨率的地表和大气的成像能力。ABI的扫描模式可以参考官网的介绍ABI SCAN MODE
这里介绍主要的一点:ABI的FULLDISK扫描在2019年4月2日由原先的15min一次的M3 Mode切换到了目前10min一次的M6 Mode。

获取方式

以COD参数为例,根据产品页中的获取方式,主要有以下两种:
主要有两种方式:

  1. 去CLASS数据分发系统申请下载,数据较全。缺点:有单次10000个文件的限制;需要后台处理等待超过一天,而且会拆分单个订单;无法正则下载。
    地址:https://www.avl.class.noaa.gov/saa/products/search?datatype_family=GRABIPRD

  2. 2020年以后的数据已经托管到了亚马逊和Google的云存储中,可以无权限访问下载,而且数据非常块。缺点:只有2020年以后的数据。
    地址:https://noaa-goes16.s3.amazonaws.com/index.html

本次使用了Amazon AWS下载的方式。

AWS Cloud Download

一开始尝试使用wget进行下载,发现仓库地址并不是数据库的地址,并且数据库地址无法使用正则和递归下载,那么你就只能直接指定文件名。
麻烦的地方来了,GOES的数据命名如下
OR_ABI-L2-ACMF-M6_G16_s20200011130218_e20200011139525_c20200011140341.nc
不仅开始时间后面会多出三位数字,后面还会跟一串完全随机的结束时间和创建时间,没有规律可循。那就无法根据需求生成文件名。

这种情况下,亚马逊提供了AWS CLI命令行工具来实现对S3数据的操作,包括复制,下载,移动,重名。
可以实现简单的正则和递归,那么就行得通了。

安装AWS CLI

访问安装或更新 AWS CLI 的最新版本
按照指南依此执行:

bash
> curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
> unzip awscliv2.zip
> sudo ./aws/install

默认会安装到/usr/local/bin/aws-cli,可以根据需求使用-i选项来指定安装地址。

下载

安装aws cli以后,你就可以使用命令行来完成特定需求的文件下载:
如,下载20200101日 11:30分的ACMF文件,并放置到指定目录下:

bash
> aws s3 cp --recursive --no-sign-request --exclude '*' --include '*s20200011130???_e*_c*.nc' s3://noaa-goes16/ABI-L2-ACMF/2020/001/11/  ./20200101/

download: s3://noaa-goes16/ABI-L2-ACMF/2020/001/11/OR_ABI-L2-ACMF-M6_G16_s20200011130218_e20200011139525_c20200011140341.nc to 20200101/OR_ABI-L2-ACMF-M6_G16_s20200011130218_e20200011139525_c20200011140341.nc

Fortran Runtime Download Desired GOES file

可以在Fortran代码中根据日期和时间进行下载:

fortran
CALL download_GOESR_AWS(yyyymmdd,HH,MM,GEOS_L2_DIR)
CALL download_GOESR_AWS('20200101','11','30','./data/GOES_L2/20200101/')

Subroutine download_GOESR_AWS, be like

fortran
!! sub to download GOES-R Cloud from AWS S3 data bucket 

SUBROUTINE download_GOESR_AWS(yyyymmdd,HH,MM,GEOS_L2_DIR)

CHARACTER(*), INTENT(IN) :: GEOS_L2_DIR
CHARACTER(8), INTENT(IN) :: yyyymmdd
CHARACTER(2), INTENT(IN) :: HH,MM

! Internal variables
INTEGER :: status,file_unit
CHARACTER(3) :: DOY
CHARACTER(256) :: command

! Parse the date string to extract year, month, and day
CALL ParseDate(yyyymmdd,DOY)

IF(yyyymmdd.LT.'20200101') THEN
PRINT*,'ERROR! Date before 20200101 not exist in AWS cloud bucket!'
STOP
END IF

!! ACM Clearsky MASK
command = "aws s3 cp --recursive --no-sign-request --exclude '*' &
--include '*s"//yyyymmdd(1:4)//DOY//HH//MM//"???_e*_c*.nc' &
s3://noaa-goes16/ABI-L2-ACMF/"//yyyymmdd(1:4)//"/"//DOY//"/"//HH//"/ "&
//trim(GEOS_L2_DIR)//"/"//yyyymmdd//"/"
CALL SYSTEM(command, status)

!! COD Cloud Optical Depeth

command = "aws s3 cp --recursive --no-sign-request --exclude '*' &
--include '*s"//yyyymmdd(1:4)//DOY//HH//MM//"???_e*_c*.nc' &
s3://noaa-goes16/ABI-L2-CODF/"//yyyymmdd(1:4)//"/"//DOY//"/"//HH//"/ &
"//trim(GEOS_L2_DIR)//"/"//yyyymmdd//"/"
CALL SYSTEM(command, status)

!! CPS cloud partical size

command = "aws s3 cp --recursive --no-sign-request --exclude '*' &
--include '*s"//yyyymmdd(1:4)//DOY//HH//MM//"???_e*_c*.nc' &
s3://noaa-goes16/ABI-L2-CPSF/"//yyyymmdd(1:4)//"/"//DOY//"/"//HH//"/ &
"//trim(GEOS_L2_DIR)//"/"//yyyymmdd//"/"
CALL SYSTEM(command, status)

!! ACHA cloud top height


command = "aws s3 cp --recursive --no-sign-request --exclude '*' &
--include '*s"//yyyymmdd(1:4)//DOY//HH//MM//"???_e*_c*.nc' &
s3://noaa-goes16/ABI-L2-ACHAF/"//yyyymmdd(1:4)//"/"//DOY//"/"//HH//"/ &
"//trim(GEOS_L2_DIR)//"/"//yyyymmdd//"/"
CALL SYSTEM(command, status)

!! ABI-L2-ACTPF Cloud top phase

command = "aws s3 cp --recursive --no-sign-request --exclude '*' &
--include '*s"//yyyymmdd(1:4)//DOY//HH//MM//"???_e*_c*.nc' &
s3://noaa-goes16/ABI-L2-ACTPF/"//yyyymmdd(1:4)//"/"//DOY//"/"//HH//"/ &
"//trim(GEOS_L2_DIR)//"/"//yyyymmdd//"/"
CALL SYSTEM(command, status)

! Check the exit status
IF (status /= 0) THEN
WRITE(*,*) 'Error: wget command failed with status', status
STOP
ELSE
WRITE(*,*) 'GOES-R NetCDF file Download successful'
END IF

!=================================================
! <------- POST-PROCESSING CODE HERE --------> !
!=================================================

END SUBROUTINE download_GOESR_AWS

这样的数据下载下来依然很难用,忍不住写代码的时候吐槽了好几遍,决定采用以下的两种方法:
将以下内容放到上述程序的POST-PROCESSING CODE HERE处:

fortran
!! P.S. YOU CAN NOT IMAGINE HOW HARD IT IS TO DOWNLOAD AND USE GOES DATA UNTIL U DO IT,
!! THE MOST HARSH THING TODO IS TO OPERATE SUCH FILES WITH TOTALLY ARBITARY NAMES......
!! YOU CAN NOT USE WGET TO DOWNLOAD IT DIRECTLY,
!! NOR CAN YOU EASILY GET THESE NAMES UNLESS YOU STRUGGLE TO
!! CALL SYSTEM COMMAND TO GET THEIR SIGNATURES WHICH THEY ARE DIFFERENT FROM EACH OTHER
!! AND THEN RETRIEVE THE FILENAMES, YOU GANNA GOT A LONG SHIT CODE IN THIS BLOCK.

! CALL system("cd "//trim(GEOS_L2_DIR)//"/"//yyyymmdd//&
! " ; ls OR_ABI-L2-ACMF-M6_G16_s"//yyyymmdd(1:4)//DOY//HH//MM//"???_e*_c*.nc &
! >"//trim(PWD)//"/filelists/Name_ACMF_G16_s"//yyyymmdd//HH//MM//".txt")
! OPEN(NEWUNIT=file_unit, FILE=trim(PWD)//"/filelists/Name_ACMF_G16_s"//yyyymmdd//HH//MM//".txt")
! read(file_unit,'(A)') GOES_Sufix
! close(file_unit)
! print*,GOES_Sufix
! GOES_Sufix=GOES_Sufix(23:72) !! and length differs from variables
! print*,GOES_Sufix

!! INSTEAD, I Rename THEM ALL.

CALL system("cd "//trim(GEOS_L2_DIR)//"/"//yyyymmdd//&
" ; mv -v OR_ABI-L2-ACMF-M6_G16_s"//yyyymmdd(1:4)//DOY//HH//MM//"???_e*_c*.nc &
OR_ABI-L2-ACMF-M6_G16_"//yyyymmdd//"_"//HH//MM//".NC")

CALL system("cd "//trim(GEOS_L2_DIR)//"/"//yyyymmdd//&
" ; mv -v OR_ABI-L2-CODF-M6_G16_s"//yyyymmdd(1:4)//DOY//HH//MM//"???_e*_c*.nc &
OR_ABI-L2-CODF-M6_G16_"//yyyymmdd//"_"//HH//MM//".NC")

CALL system("cd "//trim(GEOS_L2_DIR)//"/"//yyyymmdd//&
" ; mv -v OR_ABI-L2-CPSF-M6_G16_s"//yyyymmdd(1:4)//DOY//HH//MM//"???_e*_c*.nc &
OR_ABI-L2-CPSF-M6_G16_"//yyyymmdd//"_"//HH//MM//".NC")

CALL system("cd "//trim(GEOS_L2_DIR)//"/"//yyyymmdd//&
" ; mv -v OR_ABI-L2-ACHAF-M6_G16_s"//yyyymmdd(1:4)//DOY//HH//MM//"???_e*_c*.nc &
OR_ABI-L2-ACHAF-M6_G16_"//yyyymmdd//"_"//HH//MM//".NC")

CALL system("cd "//trim(GEOS_L2_DIR)//"/"//yyyymmdd//&
" ; mv -v OR_ABI-L2-ACTPF-M6_G16_s"//yyyymmdd(1:4)//DOY//HH//MM//"???_e*_c*.nc &
OR_ABI-L2-ACTPF-M6_G16_"//yyyymmdd//"_"//HH//MM//".NC")

© 2023-2024 Jiheng HU, 原创内容,禁止转载。

参考资料