{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# FY4A AGRI L1 Reader Introduction"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Support Files"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"FY4A AGRI data in NetCDF format.\n",
"\n",
"Both Full DISK and regional images are supported.\n",
"\n",
"Example filenames:\n",
"\n",
"Full DISK:\n",
" \n",
" FY4A-_AGRI--_N_DISK_1047E_L1-_FDI-_MULT_NOM_20190807060000_20190807061459_4000M_V0001.HDF\n",
"\n",
"REGC:\n",
"\n",
" FY4A-_AGRI--_N_REGC_1047E_L1-_FDI-_MULT_NOM_20190807045334_20190807045750_1000M_V0001.HDF\n",
"\n",
"*Full disk scans are identified by DISK , regional scans by REGC.*\n",
"\n",
"Data Links:\n",
"\n",
" Real Time Data Service (30 days) and Introduction Files:\n",
" https://fy4.nsmc.org.cn/data/en/data/realtime.html\n",
" History data (2018-03-12 -- ):\n",
" http://satellite.nsmc.org.cn/PortalSite/Data/Satellite.aspx\n",
" FY4A official weather application platform:\n",
" http://rsapp.nsmc.org.cn/geofy/"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Calibration"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You have three options:\n",
"\n",
"1. The raw detector counts (All channels)\n",
"\n",
"2. Reflectance (C01 - C06)\n",
"\n",
"3. Radiance and Brightness Temperature (C07 - C14)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 3. Examples"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Installation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```\n",
"$ conda install -c conda-forge satpy\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Loading data"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os, glob\n",
"from satpy.scene import Scene"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['C01',\n",
" 'C02',\n",
" 'C03',\n",
" 'C04',\n",
" 'C05',\n",
" 'C06',\n",
" 'C07',\n",
" 'C08',\n",
" 'C09',\n",
" 'C10',\n",
" 'C11',\n",
" 'C12',\n",
" 'C13',\n",
" 'C14',\n",
" 'satellite_azimuth_angle',\n",
" 'satellite_zenith_angle',\n",
" 'solar_azimuth_angle',\n",
" 'solar_glint_angle',\n",
" 'solar_zenith_angle']"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# load FY4A filenames\n",
"filenames = glob.glob('/xin/data/FY4A/20190807/FY4A-_AGRI*4000M_V0001.HDF')\n",
"\n",
"# create the scene object\n",
"scn = Scene(filenames, reader='agri_l1')\n",
"\n",
"# check available channels\n",
"scn.available_dataset_names()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# take the ir channel as example\n",
"ir_channel = 'C12'\n",
"scn.load([ir_channel], generate=False, calibration='brightness_temperature')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generate the full disk image"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# display in notebook\n",
"scn.show(ir_channel)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# save to file\n",
"# scn.save_dataset(ir_channel, filename='{sensor}_{name}.png')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generate the full disk image (True color)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Too many possible datasets to load for 3.9\n",
"Too many possible datasets to load for 3.9\n",
"Too many possible datasets to load for DatasetID(name=None, wavelength=3.9, resolution=None, polarization=None, calibration=None, level=None, modifiers=())\n",
"Too many possible datasets to load for 3.9\n",
"Too many possible datasets to load for 3.9\n",
"Too many possible datasets to load for DatasetID(name=None, wavelength=3.9, resolution=None, polarization=None, calibration=None, level=None, modifiers=())\n",
"Too many possible datasets to load for 3.9\n"
]
},
{
"data": {
"text/plain": [
"['ash',\n",
" 'dust',\n",
" 'fog',\n",
" 'green',\n",
" 'green_snow',\n",
" 'ir108_3d',\n",
" 'ir_cloud_day',\n",
" 'natural_color',\n",
" 'natural_color_sun',\n",
" 'overview',\n",
" 'overview_sun',\n",
" 'true_color']"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# get a list of all available composites for the current scene\n",
"scn.available_composite_names()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Required file type 'agri_l1_4000m_geo' not found or loaded for 'solar_zenith_angle'\n",
"Required file type 'agri_l1_4000m_geo' not found or loaded for 'satellite_zenith_angle'\n",
"Required file type 'agri_l1_4000m_geo' not found or loaded for 'satellite_azimuth_angle'\n",
"Required file type 'agri_l1_4000m_geo' not found or loaded for 'solar_azimuth_angle'\n",
"Inconsistent sensor/satellite input - sensor set to agri\n",
"Inconsistent sensor/satellite input - sensor set to agri\n"
]
}
],
"source": [
"# Beware that this step might need much memory available on the processing machine (depending on the number of cpu cores)\n",
"# You can check the link of FAQ about memory:\n",
"# https://satpy.readthedocs.io/en/latest/faq.html\n",
"\n",
"composite = 'true_color'\n",
"scn.load([composite])\n",
"scn.show(composite)\n",
"# scn.save_dataset(composite, filename='{sensor}_{name}.png')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generate the composite on a Region of Interest"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I take the typhoon LEKIMA as an example.\n",
"\n",
"We can define a map-projection and a sub area, and project the data on this area.\n",
"\n",
"`Pyresample` can be used to define the area easily.\n",
"\n",
"This definition can also be put in the `area.yaml` configuration file."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"from pyresample import get_area_def\n",
"\n",
"area_id = 'lekima'\n",
"\n",
"x_size = 549\n",
"y_size = 499\n",
"area_extent = (-1098006.560556, -967317.140452, 1098006.560556, 1026777.426728)\n",
"projection = '+proj=laea +lat_0=19.0 +lon_0=128.0 +ellps=WGS84'\n",
"description = \"Typhoon Lekima\"\n",
"proj_id = 'laea_128.0_19.0'\n",
"\n",
"areadef = get_area_def(area_id, description, proj_id, projection,x_size, y_size, area_extent)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can generate the area easily by [coord2area_def.py](https://github.com/pytroll/satpy/blob/main/utils/coord2area_def.py)\n",
"\n",
"Here's the output of `python coord2area_def.py lekima_4km laea 10 28 118 138 4`:\n",
"\n",
"```\n",
"lekima_4km:\n",
" description: lekima_4km\n",
" projection:\n",
" proj: laea\n",
" ellps: WGS84\n",
" lat_0: 19.0\n",
" lon_0: 128.0\n",
" shape:\n",
" height: 499\n",
" width: 549\n",
" area_extent:\n",
" lower_left_xy: [-1098006.560556, -967317.140452]\n",
" upper_right_xy: [1098006.560556, 1026777.426728]\n",
"```\n",
"\n",
"Now, you can add the configuration to `$PPP_CONFIG_DIR/areas.yaml` and use it directly"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# If you have added it to areas.yaml, you can use the name directly:\n",
"os.environ['PPP_CONFIG_DIR'] = '/yin_raid/xin/satpy_config/'\n",
"lekima_scene = scn.resample('lekima_4km')\n",
"\n",
"# Otherwise, you need to use the areadef defined above:\n",
"# lekima_scene = scn.resample(areadef)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"lekima_scene.show(composite)\n",
"# lekima_scene.save_dataset(composite, filename='{sensor}_{name}_resampled.png')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If you want to generate pictures with specific colormap like the figure below,\n",
"\n",
"please check another notebook about `enhancement`."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}